Annotation of uae/src/gencpu.c, revision 1.1.1.5

1.1.1.3   root        1: /*
1.1       root        2:  * UAE - The Un*x Amiga Emulator
                      3:  *
                      4:  * MC68000 emulation generator
                      5:  *
1.1.1.3   root        6:  * This is a fairly stupid program that generates a lot of case labels that
1.1       root        7:  * can be #included in a switch statement.
                      8:  * As an alternative, it can generate functions that handle specific
                      9:  * MC68000 instructions, plus a prototype header file and a function pointer
                     10:  * array to look up the function for an opcode.
                     11:  * Error checking is bad, an illegal table68k file will cause the program to
                     12:  * call abort().
1.1.1.3   root       13:  * The generated code is sometimes sub-optimal, an optimizing compiler should
1.1       root       14:  * take care of this.
1.1.1.3   root       15:  *
1.1       root       16:  * Copyright 1995, 1996 Bernd Schmidt
                     17:  */
                     18: 
                     19: #include "sysconfig.h"
                     20: #include "sysdeps.h"
                     21: #include <ctype.h>
                     22: 
                     23: #include "config.h"
                     24: #include "options.h"
                     25: #include "readcpu.h"
                     26: 
                     27: #define BOOL_TYPE "int"
                     28: 
1.1.1.3   root       29: static FILE *headerfile;
                     30: static FILE *stblfile;
                     31: 
                     32: static int using_prefetch;
                     33: static int using_exception_3;
                     34: static int cpu_level;
                     35: 
                     36: /* For the current opcode, the next lower level that will have different code.
                     37:  * Initialized to -1 for each opcode. If it remains unchanged, indicates we
                     38:  * are done with that opcode.  */
                     39: static int next_cpu_level;
1.1       root       40: 
1.1.1.5 ! root       41: void write_log (const char *s, ...)
1.1       root       42: {
1.1.1.3   root       43:     fprintf (stderr, "%s", s);
1.1       root       44: }
                     45: 
1.1.1.3   root       46: static int *opcode_map;
                     47: static int *opcode_next_clev;
                     48: static int *opcode_last_postfix;
                     49: static unsigned long *counts;
                     50: 
1.1.1.5 ! root       51: struct amode_queue
        !            52: {
        !            53:     struct amode_queue *next;
        !            54:     char *buf;
        !            55:     unsigned int done:1;
        !            56: };
        !            57: 
        !            58: static struct amode_queue *aq_head;
        !            59: 
        !            60: static void read_counts (void)
1.1       root       61: {
                     62:     FILE *file;
1.1.1.5 ! root       63:     unsigned long opcode, count, total;
1.1       root       64:     char name[20];
1.1.1.5 ! root       65:     int nr = 0;
1.1.1.3   root       66:     memset (counts, 0, 65536 * sizeof *counts);
1.1       root       67: 
1.1.1.3   root       68:     file = fopen ("frequent.68k", "r");
                     69:     if (file) {
                     70:        fscanf (file, "Total: %lu\n", &total);
1.1.1.5 ! root       71:        while (fscanf (file, "%lx: %lu %s\n", &opcode, &count, name) == 3) {
1.1.1.3   root       72:            opcode_next_clev[nr] = 3;
                     73:            opcode_last_postfix[nr] = -1;
                     74:            opcode_map[nr++] = opcode;
                     75:            counts[opcode] = count;
                     76:        }
                     77:        fclose (file);
                     78:     }
                     79:     if (nr == nr_cpuop_funcs)
                     80:        return;
                     81:     for (opcode = 0; opcode < 0x10000; opcode++) {
                     82:        if (table68k[opcode].handler == -1 && table68k[opcode].mnemo != i_ILLG
                     83:            && counts[opcode] == 0)
1.1       root       84:        {
1.1.1.3   root       85:            opcode_next_clev[nr] = 3;
                     86:            opcode_last_postfix[nr] = -1;
                     87:            opcode_map[nr++] = opcode;
                     88:            counts[opcode] = count;
1.1       root       89:        }
                     90:     }
1.1.1.3   root       91:     if (nr != nr_cpuop_funcs)
                     92:        abort ();
1.1       root       93: }
                     94: 
1.1.1.3   root       95: static char endlabelstr[80];
                     96: static int endlabelno = 0;
1.1.1.5 ! root       97: static int need_endlabel;
1.1       root       98: 
                     99: static int n_braces = 0;
1.1.1.3   root      100: static int m68k_pc_offset = 0;
1.1.1.5 ! root      101: static int insn_n_cycles;
1.1       root      102: 
1.1.1.5 ! root      103: static void start_brace (void)
1.1       root      104: {
                    105:     n_braces++;
1.1.1.3   root      106:     printf ("{");
1.1       root      107: }
                    108: 
1.1.1.5 ! root      109: static void close_brace (void)
1.1       root      110: {
                    111:     assert (n_braces > 0);
                    112:     n_braces--;
1.1.1.3   root      113:     printf ("}");
1.1       root      114: }
                    115: 
1.1.1.5 ! root      116: static void finish_braces (void)
1.1       root      117: {
                    118:     while (n_braces > 0)
1.1.1.5 ! root      119:        close_brace ();
1.1       root      120: }
                    121: 
1.1.1.5 ! root      122: static void pop_braces (int to)
1.1       root      123: {
                    124:     while (n_braces > to)
1.1.1.5 ! root      125:        close_brace ();
1.1       root      126: }
                    127: 
1.1.1.5 ! root      128: static int bit_size (int size)
1.1       root      129: {
1.1.1.5 ! root      130:     switch (size) {
        !           131:      case sz_byte: return 8;
        !           132:      case sz_word: return 16;
        !           133:      case sz_long: return 32;
        !           134:      default: abort ();
1.1       root      135:     }
                    136:     return 0;
                    137: }
                    138: 
1.1.1.5 ! root      139: static const char *bit_mask (int size)
1.1       root      140: {
1.1.1.5 ! root      141:     switch (size) {
1.1.1.3   root      142:      case sz_byte: return "0xff";
                    143:      case sz_word: return "0xffff";
                    144:      case sz_long: return "0xffffffff";
1.1.1.5 ! root      145:      default: abort ();
1.1       root      146:     }
                    147:     return 0;
                    148: }
                    149: 
1.1.1.3   root      150: static const char *gen_nextilong (void)
                    151: {
                    152:     static char buffer[80];
                    153:     int r = m68k_pc_offset;
                    154:     m68k_pc_offset += 4;
1.1.1.5 ! root      155: 
        !           156:     insn_n_cycles += 4;
        !           157: 
        !           158:     if (using_prefetch)
        !           159:        sprintf (buffer, "get_ilong_prefetch(%d)", r);
        !           160:     else
        !           161:        sprintf (buffer, "get_ilong(%d)", r);
1.1.1.3   root      162:     return buffer;
                    163: }
                    164: 
                    165: static const char *gen_nextiword (void)
                    166: {
                    167:     static char buffer[80];
                    168:     int r = m68k_pc_offset;
                    169:     m68k_pc_offset += 2;
1.1.1.5 ! root      170: 
        !           171:     insn_n_cycles += 2;
        !           172: 
        !           173:     if (using_prefetch)
        !           174:        sprintf (buffer, "get_iword_prefetch(%d)", r);
        !           175:     else
        !           176:        sprintf (buffer, "get_iword(%d)", r);
1.1.1.3   root      177:     return buffer;
                    178: }
                    179: 
                    180: static const char *gen_nextibyte (void)
                    181: {
                    182:     static char buffer[80];
                    183:     int r = m68k_pc_offset;
                    184:     m68k_pc_offset += 2;
1.1.1.5 ! root      185: 
        !           186:     insn_n_cycles += 2;
        !           187: 
        !           188:     if (using_prefetch)
        !           189:        sprintf (buffer, "get_ibyte_prefetch(%d)", r);
        !           190:     else
        !           191:        sprintf (buffer, "get_ibyte(%d)", r);
1.1.1.3   root      192:     return buffer;
                    193: }
                    194: 
                    195: static void fill_prefetch_0 (void)
                    196: {
                    197:     if (using_prefetch)
                    198:        printf ("fill_prefetch_0 ();\n");
                    199: }
                    200: 
                    201: static void fill_prefetch_2 (void)
                    202: {
                    203:     if (using_prefetch)
                    204:        printf ("fill_prefetch_2 ();\n");
                    205: }
                    206: 
1.1.1.5 ! root      207: /* To allow the compiler to generate better code, we try to pre-schedule
        !           208:  * the C code we generate to put addressing mode generation code that is
        !           209:  * likely to require many registers earlier than code that is likely to
        !           210:  * use fewer registers.  */
        !           211: 
        !           212: #define DO_QUEUEING 1
        !           213: 
        !           214: 
        !           215: #if __GNUC__ - 1 > 1 || __GNUC_MINOR__ - 1 > 6
        !           216: static void queue_amode (const char *, ...) __attribute__ ((format (printf, 1, 2)));
        !           217: #endif
        !           218: 
        !           219: static void queue_amode (const char *fmt, ...)
        !           220: {
        !           221:     char buf[160];
        !           222:     struct amode_queue *prev, **aqp;
        !           223:     va_list ap;
        !           224:     va_start (ap, fmt);
        !           225: 
        !           226: #if DO_QUEUEING        
        !           227: #ifdef HAVE_VSPRINTF
        !           228:     vsprintf (buf, fmt, ap);
        !           229: #else
        !           230:     {
        !           231:        int x1, x2, x3, x4, x5, x6, x7, x8;
        !           232:        x1 = va_arg (ap, int);
        !           233:        x2 = va_arg (ap, int);
        !           234:        x3 = va_arg (ap, int);
        !           235:        x4 = va_arg (ap, int);
        !           236:        x5 = va_arg (ap, int);
        !           237:        x6 = va_arg (ap, int);
        !           238:        x7 = va_arg (ap, int);
        !           239:        x8 = va_arg (ap, int);
        !           240:        sprintf (buf, fmt, x1, x2, x3, x4, x5, x6, x7, x8);
        !           241:     }
        !           242: #endif
        !           243:     aqp = &aq_head;
        !           244:     prev = 0;
        !           245:     while (*aqp != 0)
        !           246:        prev = *aqp, aqp = &(*aqp)->next;
        !           247:     if (prev != 0 && ! prev->done) {
        !           248:        char *tmpbuf = prev->buf;
        !           249:        prev->buf = (char *) xmalloc (strlen (tmpbuf) + strlen (buf) + 1);
        !           250:        strcpy (prev->buf, tmpbuf);
        !           251:        strcat (prev->buf, buf);
        !           252:     } else {
        !           253:        struct amode_queue *tmp = (struct amode_queue *) xmalloc (sizeof *tmp);
        !           254:        tmp->next = 0;
        !           255:        tmp->buf = my_strdup (buf);
        !           256:        *aqp = tmp;
        !           257:     }
        !           258: #else
        !           259:     start_brace ();
        !           260:     vprintf (fmt, ap);
        !           261: #endif
        !           262: }
        !           263: 
        !           264: static void done_queue (void)
        !           265: {
        !           266:     struct amode_queue *prev, **aqp;
        !           267:     aqp = &aq_head;
        !           268:     prev = 0;
        !           269:     while (*aqp != 0)
        !           270:        prev = *aqp, aqp = &(*aqp)->next;
        !           271:     if (prev)
        !           272:        prev->done = 1;
        !           273: }
        !           274: 
        !           275: static void flush_amodes (void)
        !           276: {
        !           277:     while (aq_head != 0) {
        !           278:        struct amode_queue *q = aq_head;
        !           279:        aq_head = q->next;
        !           280:        start_brace ();
        !           281:        printf (q->buf);
        !           282:        free (q->buf);
        !           283:        free (q);
        !           284:     }
        !           285: }
        !           286: 
1.1.1.3   root      287: static void sync_m68k_pc (void)
                    288: {
1.1.1.5 ! root      289:     flush_amodes ();
1.1.1.3   root      290:     if (m68k_pc_offset == 0)
                    291:        return;
                    292:     printf ("m68k_incpc(%d);\n", m68k_pc_offset);
                    293:     switch (m68k_pc_offset) {
                    294:      case 0:
1.1.1.5 ! root      295:        /*fprintf (stderr, "refilling prefetch at 0\n"); */
1.1.1.3   root      296:        break;
                    297:      case 2:
1.1.1.5 ! root      298:        fill_prefetch_2 ();
1.1.1.3   root      299:        break;
                    300:      default:
1.1.1.5 ! root      301:        fill_prefetch_0 ();
1.1.1.3   root      302:        break;
                    303:     }
                    304:     m68k_pc_offset = 0;
                    305: }
                    306: 
                    307: /* getv == 1: fetch data; getv != 0: check for odd address. If movem != 0,
1.1.1.5 ! root      308:  * the calling routine handles Apdi and Aipi modes. */
1.1.1.3   root      309: static void genamode (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem)
1.1       root      310: {
1.1.1.5 ! root      311:     int queued = 0;
        !           312: 
        !           313:     switch (mode) {
1.1       root      314:      case Dreg:
                    315:        if (movem)
1.1.1.5 ! root      316:            abort ();
        !           317:        start_brace ();
1.1.1.3   root      318:        if (getv == 1)
1.1.1.5 ! root      319:            switch (size) {
1.1       root      320:             case sz_byte:
1.1.1.2   root      321: #ifdef AMIGA
                    322:                /* sam: I don't know why gcc.2.7.2.1 produces a code worse */
                    323:                /* if it is not done like that: */
1.1.1.3   root      324:                printf ("\tuae_s8 %s = ((uae_u8*)&m68k_dreg(regs, %s))[3];\n", name, reg);
1.1.1.2   root      325: #else
1.1.1.3   root      326:                printf ("\tuae_s8 %s = m68k_dreg(regs, %s);\n", name, reg);
1.1.1.2   root      327: #endif
1.1       root      328:                break;
                    329:             case sz_word:
1.1.1.2   root      330: #ifdef AMIGA
1.1.1.3   root      331:                printf ("\tuae_s16 %s = ((uae_s16*)&m68k_dreg(regs, %s))[1];\n", name, reg);
1.1.1.2   root      332: #else
1.1.1.3   root      333:                printf ("\tuae_s16 %s = m68k_dreg(regs, %s);\n", name, reg);
1.1.1.2   root      334: #endif
1.1       root      335:                break;
                    336:             case sz_long:
1.1.1.3   root      337:                printf ("\tuae_s32 %s = m68k_dreg(regs, %s);\n", name, reg);
1.1       root      338:                break;
1.1.1.5 ! root      339:             default:
        !           340:                abort ();
1.1       root      341:            }
1.1.1.3   root      342:        return;
1.1       root      343:      case Areg:
                    344:        if (movem)
1.1.1.5 ! root      345:            abort ();
        !           346:        start_brace ();
1.1.1.3   root      347:        if (getv == 1)
1.1.1.5 ! root      348:            switch (size) {
1.1       root      349:             case sz_word:
1.1.1.3   root      350:                printf ("\tuae_s16 %s = m68k_areg(regs, %s);\n", name, reg);
1.1       root      351:                break;
                    352:             case sz_long:
1.1.1.3   root      353:                printf ("\tuae_s32 %s = m68k_areg(regs, %s);\n", name, reg);
1.1       root      354:                break;
1.1.1.5 ! root      355:             default:
        !           356:                abort ();
1.1       root      357:            }
1.1.1.3   root      358:        return;
1.1       root      359:      case Aind:
1.1.1.5 ! root      360:        start_brace ();
1.1.1.3   root      361:        printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
1.1       root      362:        break;
                    363:      case Aipi:
1.1.1.5 ! root      364:        start_brace ();
1.1.1.3   root      365:        printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
1.1       root      366:        break;
                    367:      case Apdi:
1.1.1.5 ! root      368:        start_brace ();
        !           369:        switch (size) {
1.1       root      370:         case sz_byte:
1.1.1.3   root      371:            if (movem)
                    372:                printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
                    373:            else
                    374:                printf ("\tuaecptr %sa = m68k_areg(regs, %s) - areg_byteinc[%s];\n", name, reg, reg);
1.1       root      375:            break;
                    376:         case sz_word:
1.1.1.3   root      377:            printf ("\tuaecptr %sa = m68k_areg(regs, %s) - %d;\n", name, reg, movem ? 0 : 2);
1.1       root      378:            break;
                    379:         case sz_long:
1.1.1.3   root      380:            printf ("\tuaecptr %sa = m68k_areg(regs, %s) - %d;\n", name, reg, movem ? 0 : 4);
1.1       root      381:            break;
1.1.1.5 ! root      382:         default:
        !           383:            abort ();
1.1       root      384:        }
                    385:        break;
                    386:      case Ad16:
1.1.1.5 ! root      387:        start_brace ();
        !           388:        printf ("\tuaecptr %sa = m68k_areg(regs, %s) + (uae_s32)(uae_s16)%s;\n", name, reg, gen_nextiword ());
1.1       root      389:        break;
                    390:      case Ad8r:
1.1.1.3   root      391:        if (cpu_level > 1) {
                    392:            if (next_cpu_level < 1)
                    393:                next_cpu_level = 1;
1.1.1.5 ! root      394:            sync_m68k_pc ();
        !           395:            start_brace ();
1.1.1.3   root      396:            printf ("\tuaecptr %sa = get_disp_ea_020(m68k_areg(regs, %s), next_iword());\n", name, reg);
1.1.1.5 ! root      397:        } else {
        !           398:            start_brace ();
        !           399:            printf ("\tuaecptr %sa = get_disp_ea_000(m68k_areg(regs, %s), %s);\n", name, reg, gen_nextiword ());
        !           400:        }
1.1       root      401:        break;
                    402:      case PC16:
1.1.1.5 ! root      403:        queue_amode ("\tuaecptr %sa = m68k_getpc () + %d;\n", name, m68k_pc_offset);
        !           404:        queue_amode ("\t%sa += (uae_s32)(uae_s16)%s;\n", name, gen_nextiword ());
        !           405:        queued = 1;
1.1       root      406:        break;
                    407:      case PC8r:
1.1.1.3   root      408:        if (cpu_level > 1) {
                    409:            if (next_cpu_level < 1)
                    410:                next_cpu_level = 1;
1.1.1.5 ! root      411:            flush_amodes ();
        !           412:            sync_m68k_pc ();
        !           413:            start_brace ();
1.1.1.3   root      414:            printf ("\tuaecptr tmppc = m68k_getpc();\n");
                    415:            printf ("\tuaecptr %sa = get_disp_ea_020(tmppc, next_iword());\n", name);
                    416:        } else {
1.1.1.5 ! root      417:            queue_amode ("\tuaecptr tmppc = m68k_getpc() + %d;\n", m68k_pc_offset);
        !           418:            queue_amode ("\tuaecptr %sa = get_disp_ea_000(tmppc, %s);\n", name, gen_nextiword ());
        !           419:            queued = 1;
1.1       root      420:        }
1.1.1.3   root      421: 
1.1       root      422:        break;
                    423:      case absw:
1.1.1.5 ! root      424:        queue_amode ("\tuaecptr %sa = (uae_s32)(uae_s16)%s;\n", name, gen_nextiword ());
        !           425:        queued = 1;
1.1       root      426:        break;
                    427:      case absl:
1.1.1.5 ! root      428:        queue_amode ("\tuaecptr %sa = %s;\n", name, gen_nextilong ());
        !           429:        queued = 1;
1.1       root      430:        break;
                    431:      case imm:
1.1.1.3   root      432:        if (getv != 1)
                    433:            abort ();
1.1.1.5 ! root      434:        switch (size) {
1.1.1.3   root      435:         case sz_byte:
1.1.1.5 ! root      436:            queue_amode ("\tuae_s8 %s = %s;\n", name, gen_nextibyte ());
1.1.1.3   root      437:            break;
                    438:         case sz_word:
1.1.1.5 ! root      439:            queue_amode ("\tuae_s16 %s = %s;\n", name, gen_nextiword ());
1.1.1.3   root      440:            break;
                    441:         case sz_long:
1.1.1.5 ! root      442:            queue_amode ("\tuae_s32 %s = %s;\n", name, gen_nextilong ());
1.1.1.3   root      443:            break;
1.1.1.5 ! root      444:         default:
        !           445:            abort ();
1.1.1.3   root      446:        }
                    447:        return;
                    448:      case imm0:
1.1.1.5 ! root      449:        if (getv != 1)
        !           450:            abort ();
        !           451:        queue_amode ("\tuae_s8 %s = %s;\n", name, gen_nextibyte ());
1.1.1.3   root      452:        return;
                    453:      case imm1:
1.1.1.5 ! root      454:        if (getv != 1)
        !           455:            abort ();
        !           456:        queue_amode ("\tuae_s16 %s = %s;\n", name, gen_nextiword ());
1.1.1.3   root      457:        return;
                    458:      case imm2:
1.1.1.5 ! root      459:        if (getv != 1)
        !           460:            abort ();
        !           461:        queue_amode ("\tuae_s32 %s = %s;\n", name, gen_nextilong ());
1.1.1.3   root      462:        return;
                    463:      case immi:
1.1.1.5 ! root      464:        if (getv != 1)
        !           465:            abort ();
1.1.1.3   root      466:        printf ("\tuae_u32 %s = %s;\n", name, reg);
                    467:        return;
                    468:      default:
1.1.1.5 ! root      469:        abort ();
1.1.1.3   root      470:     }
                    471: 
1.1.1.5 ! root      472:     if (queued)
        !           473:        done_queue ();
        !           474: 
1.1.1.3   root      475:     /* We get here for all non-reg non-immediate addressing modes to
                    476:      * actually fetch the value. */
                    477: 
                    478:     if (using_exception_3 && getv != 0 && size != sz_byte) {
1.1.1.5 ! root      479:        if (queued) {
        !           480:            flush_amodes ();
        !           481:            queued = 0;
        !           482:        }
        !           483:            
1.1.1.3   root      484:        printf ("\tif ((%sa & 1) != 0) {\n", name);
                    485:        printf ("\t\tlast_fault_for_exception_3 = %sa;\n", name);
1.1.1.5 ! root      486:        printf ("\t\tlast_op_for_exception_3 = opcode;\n");
1.1.1.3   root      487:        printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + %d;\n", m68k_pc_offset);
                    488:        printf ("\t\tException(3, 0);\n");
                    489:        printf ("\t\tgoto %s;\n", endlabelstr);
                    490:        printf ("\t}\n");
1.1.1.5 ! root      491:        need_endlabel = 1;
1.1.1.3   root      492:        start_brace ();
                    493:     }
                    494:     /* We now might have to fix up the register for pre-dec or post-inc
                    495:      * addressing modes. */
                    496:     if (!movem)
                    497:        switch (mode) {
                    498:         case Aipi:
1.1.1.5 ! root      499:            if (queued)
        !           500:                abort ();
        !           501:            switch (size) {
1.1       root      502:             case sz_byte:
1.1.1.3   root      503:                printf ("\tm68k_areg(regs, %s) += areg_byteinc[%s];\n", reg, reg);
1.1       root      504:                break;
                    505:             case sz_word:
1.1.1.3   root      506:                printf ("\tm68k_areg(regs, %s) += 2;\n", reg);
1.1       root      507:                break;
                    508:             case sz_long:
1.1.1.3   root      509:                printf ("\tm68k_areg(regs, %s) += 4;\n", reg);
1.1       root      510:                break;
1.1.1.5 ! root      511:             default:
        !           512:                abort ();
1.1       root      513:            }
1.1.1.3   root      514:            break;
                    515:         case Apdi:
1.1.1.5 ! root      516:            if (queued)
        !           517:                abort ();
1.1.1.3   root      518:            printf ("\tm68k_areg (regs, %s) = %sa;\n", reg, name);
                    519:            break;
                    520:         default:
                    521:            break;
                    522:        }
1.1.1.5 ! root      523:     if (getv == 1) {
        !           524:        switch (size) {
        !           525:         case sz_byte: insn_n_cycles += 2; break;
        !           526:         case sz_word: insn_n_cycles += 2; break;
        !           527:         case sz_long: insn_n_cycles += 4; break;
        !           528:         default: abort ();
        !           529:        }
        !           530:        if (queued)
        !           531:            switch (size) {
        !           532:             case sz_byte: queue_amode ("\tuae_s8 %s = get_byte(%sa);\n", name, name); break;
        !           533:             case sz_word: queue_amode ("\tuae_s16 %s = get_word(%sa);\n", name, name); break;
        !           534:             case sz_long: queue_amode ("\tuae_s32 %s = get_long(%sa);\n", name, name); break;
        !           535:             default: abort ();
        !           536:            }
        !           537:        else {
        !           538:            start_brace ();
        !           539:            switch (size) {
        !           540:             case sz_byte: printf ("\tuae_s8 %s = get_byte(%sa);\n", name, name); break;
        !           541:             case sz_word: printf ("\tuae_s16 %s = get_word(%sa);\n", name, name); break;
        !           542:             case sz_long: printf ("\tuae_s32 %s = get_long(%sa);\n", name, name); break;
        !           543:             default: abort ();
        !           544:            }
        !           545:        }
        !           546:     }
1.1       root      547: }
                    548: 
1.1.1.3   root      549: static void genastore (char *from, amodes mode, char *reg, wordsizes size, char *to)
1.1       root      550: {
1.1.1.5 ! root      551:     switch (mode) {
1.1       root      552:      case Dreg:
1.1.1.5 ! root      553:        switch (size) {
1.1       root      554:         case sz_byte:
1.1.1.3   root      555:            printf ("\tm68k_dreg(regs, %s) = (m68k_dreg(regs, %s) & ~0xff) | ((%s) & 0xff);\n", reg, reg, from);
1.1       root      556:            break;
                    557:         case sz_word:
1.1.1.3   root      558:            printf ("\tm68k_dreg(regs, %s) = (m68k_dreg(regs, %s) & ~0xffff) | ((%s) & 0xffff);\n", reg, reg, from);
1.1       root      559:            break;
                    560:         case sz_long:
1.1.1.3   root      561:            printf ("\tm68k_dreg(regs, %s) = (%s);\n", reg, from);
1.1       root      562:            break;
1.1.1.5 ! root      563:         default:
        !           564:            abort ();
1.1       root      565:        }
                    566:        break;
                    567:      case Areg:
1.1.1.5 ! root      568:        switch (size) {
1.1       root      569:         case sz_word:
1.1.1.3   root      570:            fprintf (stderr, "Foo\n");
                    571:            printf ("\tm68k_areg(regs, %s) = (uae_s32)(uae_s16)(%s);\n", reg, from);
1.1       root      572:            break;
                    573:         case sz_long:
1.1.1.3   root      574:            printf ("\tm68k_areg(regs, %s) = (%s);\n", reg, from);
1.1       root      575:            break;
1.1.1.5 ! root      576:         default:
        !           577:            abort ();
1.1       root      578:        }
                    579:        break;
                    580:      case Aind:
                    581:      case Aipi:
                    582:      case Apdi:
                    583:      case Ad16:
                    584:      case Ad8r:
                    585:      case absw:
                    586:      case absl:
                    587:      case PC16:
                    588:      case PC8r:
1.1.1.3   root      589:        if (using_prefetch)
1.1.1.5 ! root      590:            sync_m68k_pc ();
        !           591:        switch (size) {
1.1       root      592:         case sz_byte:
1.1.1.5 ! root      593:            insn_n_cycles += 2;
1.1.1.3   root      594:            printf ("\tput_byte(%sa,%s);\n", to, from);
1.1       root      595:            break;
                    596:         case sz_word:
1.1.1.5 ! root      597:            insn_n_cycles += 2;
        !           598:            if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
        !           599:                abort ();
1.1.1.3   root      600:            printf ("\tput_word(%sa,%s);\n", to, from);
1.1       root      601:            break;
                    602:         case sz_long:
1.1.1.5 ! root      603:            insn_n_cycles += 4;
        !           604:            if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
        !           605:                abort ();
1.1.1.3   root      606:            printf ("\tput_long(%sa,%s);\n", to, from);
1.1       root      607:            break;
1.1.1.5 ! root      608:         default:
        !           609:            abort ();
1.1       root      610:        }
                    611:        break;
                    612:      case imm:
                    613:      case imm0:
                    614:      case imm1:
                    615:      case imm2:
                    616:      case immi:
1.1.1.5 ! root      617:        abort ();
1.1       root      618:        break;
1.1.1.3   root      619:      default:
1.1.1.5 ! root      620:        abort ();
1.1       root      621:     }
                    622: }
                    623: 
1.1.1.5 ! root      624: static void genmovemel (uae_u16 opcode)
1.1       root      625: {
                    626:     char getcode[100];
                    627:     int size = table68k[opcode].size == sz_long ? 4 : 2;
1.1.1.3   root      628: 
                    629:     if (table68k[opcode].size == sz_long) {
1.1.1.5 ! root      630:        strcpy (getcode, "get_long(srca)");
1.1.1.3   root      631:     } else {
1.1.1.5 ! root      632:        strcpy (getcode, "(uae_s32)(uae_s16)get_word(srca)");
1.1       root      633:     }
1.1.1.3   root      634: 
1.1.1.5 ! root      635:     printf ("\tuae_u16 mask = %s;\n", gen_nextiword ());
1.1.1.3   root      636:     printf ("\tunsigned int dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n");
                    637:     genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, 1);
1.1.1.5 ! root      638:     flush_amodes ();
        !           639:     start_brace ();
1.1.1.3   root      640:     printf ("\twhile (dmask) { m68k_dreg(regs, movem_index1[dmask]) = %s; srca += %d; dmask = movem_next[dmask]; }\n",
1.1.1.5 ! root      641:            getcode, size);
1.1.1.3   root      642:     printf ("\twhile (amask) { m68k_areg(regs, movem_index1[amask]) = %s; srca += %d; amask = movem_next[amask]; }\n",
1.1.1.5 ! root      643:            getcode, size);
1.1       root      644: 
                    645:     if (table68k[opcode].dmode == Aipi)
1.1.1.3   root      646:        printf ("\tm68k_areg(regs, dstreg) = srca;\n");
1.1       root      647: }
                    648: 
1.1.1.5 ! root      649: static void genmovemle (uae_u16 opcode)
1.1       root      650: {
                    651:     char putcode[100];
                    652:     int size = table68k[opcode].size == sz_long ? 4 : 2;
                    653:     if (table68k[opcode].size == sz_long) {
1.1.1.5 ! root      654:        strcpy (putcode, "put_long(srca,");
1.1.1.3   root      655:     } else {
1.1.1.5 ! root      656:        strcpy (putcode, "put_word(srca,");
1.1       root      657:     }
1.1.1.3   root      658: 
1.1.1.5 ! root      659:     printf ("\tuae_u16 mask = %s;\n", gen_nextiword ());
1.1.1.3   root      660:     genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, 1);
1.1.1.5 ! root      661:     flush_amodes ();
1.1.1.3   root      662:     if (using_prefetch)
1.1.1.5 ! root      663:        sync_m68k_pc ();
1.1.1.3   root      664: 
1.1.1.5 ! root      665:     start_brace ();
1.1       root      666:     if (table68k[opcode].dmode == Apdi) {
1.1.1.3   root      667:        printf ("\tuae_u16 amask = mask & 0xff, dmask = (mask >> 8) & 0xff;\n");
                    668:        printf ("\twhile (amask) { srca -= %d; %s m68k_areg(regs, movem_index2[amask])); amask = movem_next[amask]; }\n",
1.1.1.5 ! root      669:                size, putcode);
1.1.1.3   root      670:        printf ("\twhile (dmask) { srca -= %d; %s m68k_dreg(regs, movem_index2[dmask])); dmask = movem_next[dmask]; }\n",
1.1.1.5 ! root      671:                size, putcode);
1.1.1.3   root      672:        printf ("\tm68k_areg(regs, dstreg) = srca;\n");
1.1.1.2   root      673:     } else {
1.1.1.3   root      674:        printf ("\tuae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n");
                    675:        printf ("\twhile (dmask) { %s m68k_dreg(regs, movem_index1[dmask])); srca += %d; dmask = movem_next[dmask]; }\n",
1.1.1.5 ! root      676:                putcode, size);
1.1.1.3   root      677:        printf ("\twhile (amask) { %s m68k_areg(regs, movem_index1[amask])); srca += %d; amask = movem_next[amask]; }\n",
1.1.1.5 ! root      678:                putcode, size);
1.1       root      679:     }
                    680: }
                    681: 
                    682: typedef enum {
                    683:     flag_logical, flag_add, flag_sub, flag_cmp, flag_addx, flag_subx, flag_zn,
                    684:     flag_av, flag_sv
                    685: } flagtypes;
                    686: 
1.1.1.5 ! root      687: static void genflags_normal (flagtypes type, wordsizes size, char *value, char *src, char *dst)
1.1       root      688: {
1.1.1.5 ! root      689:     char vstr[100], sstr[100], dstr[100];
        !           690:     char usstr[100], udstr[100];
        !           691:     char unsstr[100], undstr[100];
1.1       root      692: 
1.1.1.5 ! root      693:     switch (size) {
1.1       root      694:      case sz_byte:
1.1.1.5 ! root      695:        strcpy (vstr, "((uae_s8)(");
        !           696:        strcpy (usstr, "((uae_u8)(");
1.1       root      697:        break;
                    698:      case sz_word:
1.1.1.5 ! root      699:        strcpy (vstr, "((uae_s16)(");
        !           700:        strcpy (usstr, "((uae_u16)(");
1.1       root      701:        break;
                    702:      case sz_long:
1.1.1.5 ! root      703:        strcpy (vstr, "((uae_s32)(");
        !           704:        strcpy (usstr, "((uae_u32)(");
1.1       root      705:        break;
                    706:      default:
1.1.1.5 ! root      707:        abort ();
1.1       root      708:     }
1.1.1.5 ! root      709:     strcpy (unsstr, usstr);
1.1       root      710: 
1.1.1.5 ! root      711:     strcpy (sstr, vstr);
        !           712:     strcpy (dstr, vstr);
        !           713:     strcat (vstr, value);
        !           714:     strcat (vstr, "))");
        !           715:     strcat (dstr, dst);
        !           716:     strcat (dstr, "))");
        !           717:     strcat (sstr, src);
        !           718:     strcat (sstr, "))");
        !           719: 
        !           720:     strcpy (udstr, usstr);
        !           721:     strcat (udstr, dst);
        !           722:     strcat (udstr, "))");
        !           723:     strcat (usstr, src);
        !           724:     strcat (usstr, "))");
        !           725: 
        !           726:     strcpy (undstr, unsstr);
        !           727:     strcat (unsstr, "-");
        !           728:     strcat (undstr, "~");
        !           729:     strcat (undstr, dst);
        !           730:     strcat (undstr, "))");
        !           731:     strcat (unsstr, src);
        !           732:     strcat (unsstr, "))");
1.1       root      733: 
                    734:     switch (type) {
                    735:      case flag_logical:
                    736:      case flag_zn:
                    737:      case flag_av:
                    738:      case flag_sv:
                    739:      case flag_addx:
                    740:      case flag_subx:
                    741:        break;
1.1.1.3   root      742: 
1.1       root      743:      case flag_add:
1.1.1.5 ! root      744:        start_brace ();
1.1.1.3   root      745:        printf ("uae_u32 %s = %s + %s;\n", value, dstr, sstr);
1.1       root      746:        break;
                    747:      case flag_sub:
                    748:      case flag_cmp:
1.1.1.5 ! root      749:        start_brace ();
1.1.1.3   root      750:        printf ("uae_u32 %s = %s - %s;\n", value, dstr, sstr);
1.1       root      751:        break;
                    752:     }
                    753: 
                    754: 
                    755:     switch (type) {
                    756:      case flag_logical:
                    757:      case flag_zn:
                    758:        break;
1.1.1.3   root      759: 
1.1       root      760:      case flag_add:
                    761:      case flag_sub:
                    762:      case flag_addx:
                    763:      case flag_subx:
                    764:      case flag_cmp:
                    765:      case flag_av:
                    766:      case flag_sv:
1.1.1.5 ! root      767:        start_brace ();
        !           768:        printf ("\t" BOOL_TYPE " flgs = %s < 0;\n", sstr);
        !           769:        printf ("\t" BOOL_TYPE " flgo = %s < 0;\n", dstr);
        !           770:        printf ("\t" BOOL_TYPE " flgn = %s < 0;\n", vstr);
1.1       root      771:        break;
                    772:     }
1.1.1.3   root      773: 
1.1.1.5 ! root      774:     switch (type) {
1.1       root      775:      case flag_logical:
1.1.1.3   root      776:        printf ("\tVFLG = CFLG = 0;\n");
                    777:        printf ("\tZFLG = %s == 0;\n", vstr);
                    778:        printf ("\tNFLG = %s < 0;\n", vstr);
1.1       root      779:        break;
                    780:      case flag_av:
1.1.1.5 ! root      781:        printf ("\tVFLG = (flgs ^ flgn) & (flgo ^ flgn);\n");
1.1       root      782:        break;
                    783:      case flag_sv:
1.1.1.5 ! root      784:        printf ("\tVFLG = (flgs ^ flgo) & (flgn ^ flgo);\n");
1.1       root      785:        break;
                    786:      case flag_zn:
1.1.1.3   root      787:        printf ("\tif (%s != 0) ZFLG = 0;\n", vstr);
                    788:        printf ("\tNFLG = %s < 0;\n", vstr);
1.1       root      789:        break;
                    790:      case flag_add:
1.1.1.3   root      791:        printf ("\tZFLG = %s == 0;\n", vstr);
1.1.1.5 ! root      792:        printf ("\tVFLG = (flgs ^ flgn) & (flgo ^ flgn);\n");
1.1.1.3   root      793:        printf ("\tCFLG = XFLG = %s < %s;\n", undstr, usstr);
                    794:        printf ("\tNFLG = flgn != 0;\n");
1.1       root      795:        break;
                    796:      case flag_sub:
1.1.1.3   root      797:        printf ("\tZFLG = %s == 0;\n", vstr);
1.1.1.5 ! root      798:        printf ("\tVFLG = (flgs ^ flgo) & (flgn ^ flgo);\n");
1.1.1.3   root      799:        printf ("\tCFLG = XFLG = %s > %s;\n", usstr, udstr);
                    800:        printf ("\tNFLG = flgn != 0;\n");
1.1       root      801:        break;
                    802:      case flag_addx:
1.1.1.5 ! root      803: #if 0
        !           804:        printf ("\tVFLG = (flgs && flgo && !flgn) || (!flgs && !flgo && flgn);\n"); /* minterm SON: 0x42 */
        !           805:        printf ("\tXFLG = CFLG = (flgs && flgo) || (!flgn && (flgo || flgs));\n"); /* minterm SON: 0xD4 */
        !           806: #else
        !           807:        printf ("\tVFLG = (flgs ^ flgn) & (flgo ^ flgn);\n"); /* minterm SON: 0x42 */
        !           808:        printf ("\tXFLG = CFLG = flgs ^ ((flgs ^ flgo) & (flgo ^ flgn));\n"); /* minterm SON: 0xD4 */
        !           809: #endif
1.1       root      810:        break;
                    811:      case flag_subx:
1.1.1.5 ! root      812: #if 0
        !           813:        printf ("\tVFLG = (!flgs && flgo && !flgn) || (flgs && !flgo && flgn);\n"); /* minterm SON: 0x24 */
        !           814:        printf ("\tXFLG = CFLG = (flgs && !flgo) || (flgn && (!flgo || flgs));\n"); /* minterm SON: 0xB2 */
        !           815: #else
        !           816:        printf ("\tVFLG = (flgs ^ flgo) & (flgo ^ flgn);\n"); /* minterm SON: 0x24 */
        !           817:        printf ("\tXFLG = CFLG = flgs ^ ((flgs ^ flgn) & (flgo ^ flgn));\n"); /* minterm SON: 0xB2 */
        !           818: #endif
1.1       root      819:        break;
                    820:      case flag_cmp:
1.1.1.3   root      821:        printf ("\tZFLG = %s == 0;\n", vstr);
                    822:        printf ("\tVFLG = (flgs != flgo) && (flgn != flgo);\n");
                    823:        printf ("\tCFLG = %s > %s;\n", usstr, udstr);
                    824:        printf ("\tNFLG = flgn != 0;\n");
1.1       root      825:        break;
                    826:     }
                    827: }
                    828: 
1.1.1.5 ! root      829: static void genflags (flagtypes type, wordsizes size, char *value, char *src, char *dst)
1.1       root      830: {
1.1.1.3   root      831: #ifdef X86_ASSEMBLY
1.1.1.5 ! root      832:     start_brace ();
1.1.1.3   root      833:     printf ("\tuae_u32 scratch;\n");
1.1       root      834:     switch (type) {
1.1.1.5 ! root      835:      case flag_add:
        !           836:      case flag_sub:
        !           837:        start_brace ();
1.1.1.3   root      838:        printf ("\tuae_u32 %s;\n", value);
1.1       root      839:        break;
                    840: 
1.1.1.3   root      841:      default:
1.1       root      842:        break;
                    843:     }
                    844: 
1.1.1.3   root      845:     /* At least some of those casts are fairly important! */
1.1.1.5 ! root      846:     switch (type) {
1.1       root      847:      case flag_logical:
1.1.1.5 ! root      848:        if (strcmp (value, "0") == 0) {
1.1.1.3   root      849:            printf ("\t*(uae_u32 *)&regflags = 64;\n");
1.1       root      850:        } else {
1.1.1.5 ! root      851:            switch (size) {
1.1.1.3   root      852:             case sz_byte: printf ("\tx86_flag_testb ((uae_s8)(%s));\n", value); break;
                    853:             case sz_word: printf ("\tx86_flag_testw ((uae_s16)(%s));\n", value); break;
                    854:             case sz_long: printf ("\tx86_flag_testl ((uae_s32)(%s));\n", value); break;
1.1       root      855:            }
                    856:        }
                    857:        return;
                    858: 
                    859:      case flag_add:
1.1.1.5 ! root      860:        switch (size) {
1.1.1.3   root      861:         case sz_byte: printf ("\tx86_flag_addb (%s, (uae_s8)(%s), (uae_s8)(%s));\n", value, src, dst); break;
                    862:         case sz_word: printf ("\tx86_flag_addw (%s, (uae_s16)(%s), (uae_s16)(%s));\n", value, src, dst); break;
                    863:         case sz_long: printf ("\tx86_flag_addl (%s, (uae_s32)(%s), (uae_s32)(%s));\n", value, src, dst); break;
1.1       root      864:        }
                    865:        return;
                    866: 
                    867:      case flag_sub:
1.1.1.5 ! root      868:        switch (size) {
1.1.1.3   root      869:         case sz_byte: printf ("\tx86_flag_subb (%s, (uae_s8)(%s), (uae_s8)(%s));\n", value, src, dst); break;
                    870:         case sz_word: printf ("\tx86_flag_subw (%s, (uae_s16)(%s), (uae_s16)(%s));\n", value, src, dst); break;
                    871:         case sz_long: printf ("\tx86_flag_subl (%s, (uae_s32)(%s), (uae_s32)(%s));\n", value, src, dst); break;
1.1       root      872:        }
                    873:        return;
                    874: 
                    875:      case flag_cmp:
1.1.1.5 ! root      876:        switch (size) {
1.1.1.3   root      877:         case sz_byte: printf ("\tx86_flag_cmpb ((uae_s8)(%s), (uae_s8)(%s));\n", src, dst); break;
                    878:         case sz_word: printf ("\tx86_flag_cmpw ((uae_s16)(%s), (uae_s16)(%s));\n", src, dst); break;
                    879:         case sz_long: printf ("\tx86_flag_cmpl ((uae_s32)(%s), (uae_s32)(%s));\n", src, dst); break;
1.1       root      880:        }
                    881:        return;
1.1.1.5 ! root      882:        
1.1.1.3   root      883:      default:
                    884:        break;
1.1       root      885:     }
1.1.1.2   root      886: #elif defined(M68K_FLAG_OPT)
1.1.1.3   root      887:     /* sam: here I'm cloning what X86_ASSEMBLY does */
                    888: #define EXT(size)  (size==sz_byte?"b":(size==sz_word?"w":"l"))
                    889: #define CAST(size) (size==sz_byte?"uae_s8":(size==sz_word?"uae_s16":"uae_s32"))
1.1.1.2   root      890:     switch (type) {
1.1.1.5 ! root      891:      case flag_add:
        !           892:      case flag_sub:
        !           893:        start_brace ();
1.1.1.3   root      894:        printf ("\tuae_u32 %s;\n", value);
1.1.1.2   root      895:        break;
                    896: 
1.1.1.3   root      897:      default:
1.1.1.2   root      898:        break;
                    899:     }
                    900: 
1.1.1.5 ! root      901:     switch (type) {
1.1.1.2   root      902:      case flag_logical:
1.1.1.5 ! root      903:        if (strcmp (value, "0") == 0) {
        !           904:            printf ("\t*(uae_u16 *)&regflags = 4;\n");  /* Z = 1 */
1.1.1.2   root      905:        } else {
1.1.1.5 ! root      906:            printf ("\tm68k_flag_tst (%s, (%s)(%s));\n",
        !           907:                    EXT (size), CAST (size), value);
1.1.1.2   root      908:        }
                    909:        return;
                    910: 
                    911:      case flag_add:
1.1.1.3   root      912:        printf ("\t{uae_u16 ccr;\n");
1.1.1.5 ! root      913:        printf ("\tm68k_flag_add (%s, (%s)%s, (%s)(%s), (%s)(%s));\n",
        !           914:                EXT (size), CAST (size), value, CAST (size), src, CAST (size), dst);
1.1.1.3   root      915:        printf ("\t((uae_u16*)&regflags)[1]=((uae_u16*)&regflags)[0]=ccr;}\n");
1.1.1.2   root      916:        return;
                    917: 
                    918:      case flag_sub:
1.1.1.3   root      919:        printf ("\t{uae_u16 ccr;\n");
1.1.1.5 ! root      920:        printf ("\tm68k_flag_sub (%s, (%s)%s, (%s)(%s), (%s)(%s));\n",
        !           921:                EXT (size), CAST (size), value, CAST (size), src, CAST (size), dst);
1.1.1.3   root      922:        printf ("\t((uae_u16*)&regflags)[1]=((uae_u16*)&regflags)[0]=ccr;}\n");
1.1.1.2   root      923:        return;
                    924: 
                    925:      case flag_cmp:
1.1.1.5 ! root      926:        printf ("\tm68k_flag_cmp (%s, (%s)(%s), (%s)(%s));\n",
        !           927:                EXT (size), CAST (size), src, CAST (size), dst);
1.1.1.2   root      928:        return;
1.1.1.3   root      929: 
                    930:      default:
                    931:        break;
1.1.1.2   root      932:     }
1.1.1.3   root      933: #elif defined(ACORN_FLAG_OPT) && defined(__GNUC_MINOR__)
                    934: /*
                    935:  * This is new. Might be quite buggy.
                    936:  */
1.1.1.5 ! root      937:     switch (type) {
        !           938:      case flag_av:
        !           939:      case flag_sv:
        !           940:      case flag_zn:
        !           941:      case flag_addx:
        !           942:      case flag_subx:
        !           943:        break;
        !           944: 
        !           945:      case flag_logical:
        !           946:        if (strcmp (value, "0") == 0) {
        !           947:            /* v=c=n=0 z=1 */
        !           948:            printf ("\t*(ULONG*)&regflags = 0x40000000;\n");
1.1.1.3   root      949:            return;
1.1.1.5 ! root      950:        } else {
        !           951:            start_brace ();
        !           952:            switch (size) {
        !           953:             case sz_byte:
        !           954:                printf ("\tUBYTE ccr;\n");
        !           955:                printf ("\tULONG shift;\n");
        !           956:                printf ("\t__asm__(\"mov %%2,%%1,lsl#24\n\ttst %%2,%%2\n\tmov %%0,r15,lsr#24\n\tbic %%0,%%0,#0x30\"\n"
        !           957:                        "\t: \"=r\" (ccr) : \"r\" (%s), \"r\" (shift) : \"cc\" );\n", value);
        !           958:                printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
        !           959:                return;
        !           960:             case sz_word:
        !           961:                printf ("\tUBYTE ccr;\n");
        !           962:                printf ("\tULONG shift;\n");
        !           963:                printf ("\t__asm__(\"mov %%2,%%1,lsl#16\n\ttst %%2,%%2\n\tmov %%0,r15,lsr#24\n\tbic %%0,%%0,#0x30\"\n"
        !           964:                        "\t: \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", value);
        !           965:                printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
        !           966:                return;
        !           967:             case sz_long:
        !           968:                printf ("\tUBYTE ccr;\n");
        !           969:                printf ("\t__asm__(\"tst %%1,%%1\n\tmov %%0,r15,lsr#24\n\tbic %%0,%%0,#0x30\"\n"
        !           970:                        "\t: \"=r\" (ccr) : \"r\" ((LONG)%s) : \"cc\" );\n", value);
        !           971:                printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
        !           972:                return;
        !           973:            }
1.1.1.3   root      974:        }
1.1.1.5 ! root      975:        break;
        !           976:      case flag_add:
        !           977:        if (strcmp (dst, "0") == 0) {
        !           978:            printf ("/* Error! Hier muss Peter noch was machen !!! (ADD-Flags) */");
        !           979:        } else {
        !           980:            start_brace ();
        !           981:            switch (size) {
        !           982:             case sz_byte:
        !           983:                printf ("\tULONG ccr, shift, %s;\n", value);
        !           984:                printf ("\t__asm__(\"mov %%4,%%3,lsl#24\n\tadds %%0,%%4,%%2,lsl#24\n\tmov %%0,%%0,asr#24\n\tmov %%1,r15\n\torr %%1,%%1,%%1,lsr#29\"\n"
        !           985:                        "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" (%s), \"r\" (%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
        !           986:                printf ("\t*(ULONG*)&regflags = ccr;\n");
        !           987:                return;
        !           988:             case sz_word:
        !           989:                printf ("\tULONG ccr, shift, %s;\n", value);
        !           990:                printf ("\t__asm__(\"mov %%4,%%3,lsl#16\n\tadds %%0,%%4,%%2,lsl#16\n\tmov %%0,%%0,asr#16\n\tmov %%1,r15\n\torr %%1,%%1,%%1,lsr#29\"\n"
        !           991:                        "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
        !           992:                printf ("\t*(ULONG*)&regflags = ccr;\n");
        !           993:                return;
        !           994:             case sz_long:
        !           995:                printf ("\tULONG ccr, %s;\n", value);
        !           996:                printf ("\t__asm__(\"adds %%0,%%3,%%2\n\tmov %%1,r15\n\torr %%1,%%1,%%1,lsr#29\"\n"
        !           997:                        "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((LONG)%s), \"r\" ((LONG)%s) : \"cc\" );\n", value, src, dst);
        !           998:                printf ("\t*(ULONG*)&regflags = ccr;\n");
        !           999:                return;
        !          1000:            }
1.1.1.3   root     1001:        }
1.1.1.5 ! root     1002:        break;
        !          1003:      case flag_sub:
        !          1004:        if (strcmp (dst, "0") == 0) {
        !          1005:            printf ("/* Error! Hier muss Peter noch was machen !!! (SUB-Flags) */");
        !          1006:        } else {
        !          1007:            start_brace ();
        !          1008:            switch (size) {
        !          1009:             case sz_byte:
        !          1010:                printf ("\tULONG ccr, shift, %s;\n", value);
        !          1011:                printf ("\t__asm__(\"mov %%4,%%3,lsl#24\n\tsubs %%0,%%4,%%2,lsl#24\n\tmov %%0,%%0,asr#24\n\tmov %%1,r15\n\teor %%1,%%1,#0x20000000\n\torr %%1,%%1,%%1,lsr#29\"\n"
        !          1012:                        "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" (%s), \"r\" (%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
        !          1013:                printf ("\t*(ULONG*)&regflags = ccr;\n");
        !          1014:                return;
        !          1015:             case sz_word:
        !          1016:                printf ("\tULONG ccr, shift, %s;\n", value);
        !          1017:                printf ("\t__asm__(\"mov %%4,%%3,lsl#16\n\tsubs %%0,%%4,%%2,lsl#16\n\tmov %%0,%%0,asr#16\n\tmov %%1,r15\n\teor %%1,%%1,#0x20000000\n\torr %%1,%%1,%%1,lsr#29\"\n"
        !          1018:                        "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
        !          1019:                printf ("\t*(ULONG*)&regflags = ccr;\n");
        !          1020:                return;
        !          1021:             case sz_long:
        !          1022:                printf ("\tULONG ccr, %s;\n", value);
        !          1023:                printf ("\t__asm__(\"subs %%0,%%3,%%2\n\tmov %%1,r15\n\teor %%1,%%1,#0x20000000\n\torr %%1,%%1,%%1,lsr#29\"\n"
        !          1024:                        "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((LONG)%s), \"r\" ((LONG)%s) : \"cc\" );\n", value, src, dst);
        !          1025:                printf ("\t*(ULONG*)&regflags = ccr;\n");
        !          1026:                return;
        !          1027:            }
1.1.1.3   root     1028:        }
1.1.1.5 ! root     1029:        break;
        !          1030:      case flag_cmp:
        !          1031:        if (strcmp (dst, "0") == 0) {
        !          1032:            printf ("/*Error! Hier muss Peter noch was machen !!! (CMP-Flags)*/");
        !          1033:        } else {
        !          1034:            start_brace ();
        !          1035:            switch (size) {
        !          1036:             case sz_byte:
        !          1037:                printf ("\tULONG shift, ccr;\n");
        !          1038:                printf ("\t__asm__(\"mov %%3,%%2,lsl#24\n\tcmp %%3,%%1,lsl#24\n\tmov %%0,r15,lsr#24\n\teor %%0,%%0,#0x20\"\n"
        !          1039:                        "\t: \"=r\" (ccr) : \"r\" (%s), \"r\" (%s), \"r\" (shift) : \"cc\" );\n", src, dst);
        !          1040:                printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
        !          1041:                return;
        !          1042:             case sz_word:
        !          1043:                printf ("\tULONG shift, ccr;\n");
        !          1044:                printf ("\t__asm__(\"mov %%3,%%2,lsl#16\n\tcmp %%3,%%1,lsl#16\n\tmov %%0,r15,lsr#24\n\teor %%0,%%0,#0x20\"\n"
        !          1045:                        "\t: \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", src, dst);
        !          1046:                printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
        !          1047:                return;
        !          1048:             case sz_long:
        !          1049:                printf ("\tULONG ccr;\n");
        !          1050:                printf ("\t__asm__(\"cmp %%2,%%1\n\tmov %%0,r15,lsr#24\n\teor %%0,%%0,#0x20\"\n"
        !          1051:                        "\t: \"=r\" (ccr) : \"r\" ((LONG)%s), \"r\" ((LONG)%s) : \"cc\" );\n", src, dst);
        !          1052:                printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
        !          1053:                /*printf ("\tprintf (\"%%08x %%08x %%08x\\n\", %s, %s, *((ULONG*)&regflags));\n", src, dst); */
        !          1054:                return;
        !          1055:            }
        !          1056:        }
        !          1057:        break;
        !          1058:     }
1.1       root     1059: #endif
1.1.1.5 ! root     1060:     genflags_normal (type, size, value, src, dst);
1.1       root     1061: }
1.1.1.3   root     1062: 
1.1.1.5 ! root     1063: static void gen_opcode (unsigned long int opcode)
1.1       root     1064: {
1.1.1.5 ! root     1065:     aq_head = 0;
        !          1066:     insn_n_cycles = 2;
        !          1067: 
1.1       root     1068:     start_brace ();
1.1.1.3   root     1069: #if 0
                   1070:     printf ("uae_u8 *m68k_pc = regs.pc_p;\n");
                   1071: #endif
                   1072:     m68k_pc_offset = 2;
1.1       root     1073:     switch (table68k[opcode].plev) {
1.1.1.3   root     1074:      case 0: /* not privileged */
1.1       root     1075:        break;
1.1.1.3   root     1076:      case 1: /* unprivileged only on 68000 */
                   1077:        if (cpu_level == 0)
1.1       root     1078:            break;
1.1.1.3   root     1079:        if (next_cpu_level < 0)
                   1080:            next_cpu_level = 0;
                   1081: 
1.1.1.5 ! root     1082:        /* fall through */
1.1       root     1083:      case 2: /* priviledged */
1.1.1.3   root     1084:        printf ("if (!regs.s) { Exception(8,0); goto %s; }\n", endlabelstr);
1.1.1.5 ! root     1085:        need_endlabel = 1;
        !          1086:        start_brace ();
1.1       root     1087:        break;
1.1.1.3   root     1088:      case 3: /* privileged if size == word */
1.1       root     1089:        if (table68k[opcode].size == sz_byte)
                   1090:            break;
1.1.1.3   root     1091:        printf ("if (!regs.s) { Exception(8,0); goto %s; }\n", endlabelstr);
1.1.1.5 ! root     1092:        need_endlabel = 1;
        !          1093:        start_brace ();
1.1       root     1094:        break;
                   1095:     }
1.1.1.5 ! root     1096:     switch (table68k[opcode].mnemo) {
1.1       root     1097:      case i_OR:
1.1.1.3   root     1098:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1099:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1100:        flush_amodes ();
1.1.1.3   root     1101:        printf ("\tsrc |= dst;\n");
1.1.1.5 ! root     1102:        genflags (flag_logical, table68k[opcode].size, "src", "", "");
1.1.1.3   root     1103:        genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1104:        break;
                   1105:      case i_AND:
1.1.1.3   root     1106:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1107:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1108:        flush_amodes ();
1.1.1.3   root     1109:        printf ("\tsrc &= dst;\n");
1.1.1.5 ! root     1110:        genflags (flag_logical, table68k[opcode].size, "src", "", "");
1.1.1.3   root     1111:        genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1112:        break;
                   1113:      case i_EOR:
1.1.1.3   root     1114:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1115:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1116:        flush_amodes ();
1.1.1.3   root     1117:        printf ("\tsrc ^= dst;\n");
1.1.1.5 ! root     1118:        genflags (flag_logical, table68k[opcode].size, "src", "", "");
1.1.1.3   root     1119:        genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1120:        break;
                   1121:      case i_ORSR:
1.1.1.3   root     1122:        printf ("\tMakeSR();\n");
                   1123:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1124:        flush_amodes ();
1.1       root     1125:        if (table68k[opcode].size == sz_byte) {
1.1.1.3   root     1126:            printf ("\tsrc &= 0xFF;\n");
1.1       root     1127:        }
1.1.1.3   root     1128:        printf ("\tregs.sr |= src;\n");
                   1129:        printf ("\tMakeFromSR();\n");
1.1       root     1130:        break;
1.1.1.3   root     1131:      case i_ANDSR:
                   1132:        printf ("\tMakeSR();\n");
                   1133:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1134:        flush_amodes ();
1.1       root     1135:        if (table68k[opcode].size == sz_byte) {
1.1.1.3   root     1136:            printf ("\tsrc |= 0xFF00;\n");
1.1       root     1137:        }
1.1.1.3   root     1138:        printf ("\tregs.sr &= src;\n");
                   1139:        printf ("\tMakeFromSR();\n");
1.1       root     1140:        break;
                   1141:      case i_EORSR:
1.1.1.3   root     1142:        printf ("\tMakeSR();\n");
                   1143:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1144:        flush_amodes ();
1.1       root     1145:        if (table68k[opcode].size == sz_byte) {
1.1.1.3   root     1146:            printf ("\tsrc &= 0xFF;\n");
1.1       root     1147:        }
1.1.1.3   root     1148:        printf ("\tregs.sr ^= src;\n");
                   1149:        printf ("\tMakeFromSR();\n");
1.1       root     1150:        break;
1.1.1.3   root     1151:      case i_SUB:
                   1152:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1153:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1154:        flush_amodes ();
1.1       root     1155:        start_brace ();
1.1.1.5 ! root     1156:        genflags (flag_sub, table68k[opcode].size, "newv", "src", "dst");
1.1.1.3   root     1157:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1158:        break;
                   1159:      case i_SUBA:
1.1.1.3   root     1160:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1161:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0);
1.1.1.5 ! root     1162:        flush_amodes ();
1.1       root     1163:        start_brace ();
1.1.1.3   root     1164:        printf ("\tuae_u32 newv = dst - src;\n");
                   1165:        genastore ("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst");
1.1       root     1166:        break;
                   1167:      case i_SUBX:
1.1.1.3   root     1168:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1169:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1170:        flush_amodes ();
1.1       root     1171:        start_brace ();
1.1.1.3   root     1172:        printf ("\tuae_u32 newv = dst - src - (XFLG ? 1 : 0);\n");
1.1.1.5 ! root     1173:        genflags (flag_subx, table68k[opcode].size, "newv", "src", "dst");
        !          1174:        genflags (flag_zn, table68k[opcode].size, "newv", "", "");
1.1.1.3   root     1175:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1176:        break;
                   1177:      case i_SBCD:
                   1178:        /* Let's hope this works... */
1.1.1.3   root     1179:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1180:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1181:        flush_amodes ();
1.1       root     1182:        start_brace ();
1.1.1.3   root     1183:        printf ("\tuae_u16 newv_lo = (dst & 0xF) - (src & 0xF) - (XFLG ? 1 : 0);\n");
                   1184:        printf ("\tuae_u16 newv_hi = (dst & 0xF0) - (src & 0xF0);\n");
                   1185:        printf ("\tuae_u16 newv;\n");
                   1186:        printf ("\tif (newv_lo > 9) { newv_lo-=6; newv_hi-=0x10; }\n");
                   1187:        printf ("\tnewv = newv_hi + (newv_lo & 0xF);");
                   1188:        printf ("\tCFLG = XFLG = (newv_hi & 0x1F0) > 0x90;\n");
                   1189:        printf ("\tif (CFLG) newv -= 0x60;\n");
1.1.1.5 ! root     1190:        genflags (flag_zn, table68k[opcode].size, "newv", "", "");
        !          1191:        genflags (flag_sv, table68k[opcode].size, "newv", "src", "dst");
1.1.1.3   root     1192:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1193:        break;
                   1194:      case i_ADD:
1.1.1.3   root     1195:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1196:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1197:        flush_amodes ();
1.1       root     1198:        start_brace ();
1.1.1.5 ! root     1199:        genflags (flag_add, table68k[opcode].size, "newv", "src", "dst");
1.1.1.3   root     1200:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1201:        break;
1.1.1.3   root     1202:      case i_ADDA:
                   1203:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1204:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0);
1.1.1.5 ! root     1205:        flush_amodes ();
1.1       root     1206:        start_brace ();
1.1.1.3   root     1207:        printf ("\tuae_u32 newv = dst + src;\n");
                   1208:        genastore ("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst");
1.1       root     1209:        break;
                   1210:      case i_ADDX:
1.1.1.3   root     1211:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1212:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1213:        flush_amodes ();
1.1       root     1214:        start_brace ();
1.1.1.3   root     1215:        printf ("\tuae_u32 newv = dst + src + (XFLG ? 1 : 0);\n");
1.1.1.5 ! root     1216:        genflags (flag_addx, table68k[opcode].size, "newv", "src", "dst");
        !          1217:        genflags (flag_zn, table68k[opcode].size, "newv", "", "");
1.1.1.3   root     1218:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1219:        break;
                   1220:      case i_ABCD:
1.1.1.3   root     1221:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1222:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1223:        flush_amodes ();
1.1       root     1224:        start_brace ();
1.1.1.3   root     1225:        printf ("\tuae_u16 newv_lo = (src & 0xF) + (dst & 0xF) + (XFLG ? 1 : 0);\n");
                   1226:        printf ("\tuae_u16 newv_hi = (src & 0xF0) + (dst & 0xF0);\n");
                   1227:        printf ("\tuae_u16 newv;\n");
                   1228:        printf ("\tif (newv_lo > 9) { newv_lo +=6; }\n");
                   1229:        printf ("\tnewv = newv_hi + newv_lo;");
                   1230:        printf ("\tCFLG = XFLG = (newv & 0x1F0) > 0x90;\n");
                   1231:        printf ("\tif (CFLG) newv += 0x60;\n");
1.1.1.5 ! root     1232:        genflags (flag_zn, table68k[opcode].size, "newv", "", "");
        !          1233:        genflags (flag_sv, table68k[opcode].size, "newv", "src", "dst");
1.1.1.3   root     1234:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1235:        break;
                   1236:      case i_NEG:
1.1.1.3   root     1237:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1238:        flush_amodes ();
1.1       root     1239:        start_brace ();
1.1.1.5 ! root     1240:        genflags (flag_sub, table68k[opcode].size, "dst", "src", "0");
        !          1241:        genastore ("dst", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1242:        break;
                   1243:      case i_NEGX:
1.1.1.3   root     1244:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1245:        flush_amodes ();
1.1       root     1246:        start_brace ();
1.1.1.3   root     1247:        printf ("\tuae_u32 newv = 0 - src - (XFLG ? 1 : 0);\n");
1.1.1.5 ! root     1248:        genflags (flag_subx, table68k[opcode].size, "newv", "src", "0");
        !          1249:        genflags (flag_zn, table68k[opcode].size, "newv", "", "");
1.1.1.3   root     1250:        genastore ("newv", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1251:        break;
1.1.1.3   root     1252:      case i_NBCD:
                   1253:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1254:        flush_amodes ();
1.1       root     1255:        start_brace ();
1.1.1.3   root     1256:        printf ("\tuae_u16 newv_lo = - (src & 0xF) - (XFLG ? 1 : 0);\n");
                   1257:        printf ("\tuae_u16 newv_hi = - (src & 0xF0);\n");
                   1258:        printf ("\tuae_u16 newv;\n");
                   1259:        printf ("\tif (newv_lo > 9) { newv_lo-=6; newv_hi-=0x10; }\n");
                   1260:        printf ("\tnewv = newv_hi + (newv_lo & 0xF);");
                   1261:        printf ("\tCFLG = XFLG = (newv_hi & 0x1F0) > 0x90;\n");
                   1262:        printf ("\tif (CFLG) newv -= 0x60;\n");
1.1.1.5 ! root     1263:        genflags (flag_zn, table68k[opcode].size, "newv", "", "");
1.1.1.3   root     1264:        genastore ("newv", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1265:        break;
1.1.1.3   root     1266:      case i_CLR:
                   1267:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 2, 0);
1.1.1.5 ! root     1268:        flush_amodes ();
        !          1269:        genflags (flag_logical, table68k[opcode].size, "0", "", "");
        !          1270:        genastore ("0", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1271:        break;
1.1.1.3   root     1272:      case i_NOT:
                   1273:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1274:        flush_amodes ();
1.1       root     1275:        start_brace ();
1.1.1.3   root     1276:        printf ("\tuae_u32 dst = ~src;\n");
1.1.1.5 ! root     1277:        genflags (flag_logical, table68k[opcode].size, "dst", "", "");
        !          1278:        genastore ("dst", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1279:        break;
                   1280:      case i_TST:
1.1.1.3   root     1281:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1282:        flush_amodes ();
        !          1283:        genflags (flag_logical, table68k[opcode].size, "src", "", "");
1.1       root     1284:        break;
                   1285:      case i_BTST:
1.1.1.3   root     1286:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1287:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1288:        flush_amodes ();
1.1       root     1289:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1290:            printf ("\tsrc &= 7;\n");
1.1       root     1291:        else
1.1.1.3   root     1292:            printf ("\tsrc &= 31;\n");
                   1293:        printf ("\tZFLG = !(dst & (1 << src));\n");
1.1       root     1294:        break;
                   1295:      case i_BCHG:
1.1.1.3   root     1296:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1297:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1298:        flush_amodes ();
1.1       root     1299:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1300:            printf ("\tsrc &= 7;\n");
1.1       root     1301:        else
1.1.1.3   root     1302:            printf ("\tsrc &= 31;\n");
                   1303:        printf ("\tZFLG = !(dst & (1 << src));\n");
                   1304:        printf ("\tdst ^= (1 << src);\n");
                   1305:        genastore ("dst", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1306:        break;
                   1307:      case i_BCLR:
1.1.1.3   root     1308:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1309:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1310:        flush_amodes ();
1.1       root     1311:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1312:            printf ("\tsrc &= 7;\n");
1.1       root     1313:        else
1.1.1.3   root     1314:            printf ("\tsrc &= 31;\n");
                   1315:        printf ("\tZFLG = !(dst & (1 << src));\n");
                   1316:        printf ("\tdst &= ~(1 << src);\n");
                   1317:        genastore ("dst", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1318:        break;
                   1319:      case i_BSET:
1.1.1.3   root     1320:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1321:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1322:        flush_amodes ();
1.1       root     1323:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1324:            printf ("\tsrc &= 7;\n");
1.1       root     1325:        else
1.1.1.3   root     1326:            printf ("\tsrc &= 31;\n");
                   1327:        printf ("\tZFLG = !(dst & (1 << src));\n");
                   1328:        printf ("\tdst |= (1 << src);\n");
                   1329:        genastore ("dst", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1330:        break;
                   1331:      case i_CMPM:
                   1332:      case i_CMP:
1.1.1.3   root     1333:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1334:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1335:        flush_amodes ();
1.1       root     1336:        start_brace ();
1.1.1.5 ! root     1337:        genflags (flag_cmp, table68k[opcode].size, "newv", "src", "dst");
1.1       root     1338:        break;
1.1.1.3   root     1339:      case i_CMPA:
                   1340:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1341:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0);
1.1.1.5 ! root     1342:        flush_amodes ();
1.1       root     1343:        start_brace ();
1.1.1.5 ! root     1344:        genflags (flag_cmp, sz_long, "newv", "src", "dst");
1.1       root     1345:        break;
                   1346:        /* The next two are coded a little unconventional, but they are doing
                   1347:         * weird things... */
                   1348:      case i_MVPRM:
1.1.1.3   root     1349:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1350:        flush_amodes ();
        !          1351: 
        !          1352:        printf ("\tuaecptr memp = m68k_areg(regs, dstreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword ());
1.1       root     1353:        if (table68k[opcode].size == sz_word) {
1.1.1.3   root     1354:            printf ("\tput_byte(memp, src >> 8); put_byte(memp + 2, src);\n");
1.1       root     1355:        } else {
1.1.1.3   root     1356:            printf ("\tput_byte(memp, src >> 24); put_byte(memp + 2, src >> 16);\n");
                   1357:            printf ("\tput_byte(memp + 4, src >> 8); put_byte(memp + 6, src);\n");
1.1       root     1358:        }
                   1359:        break;
1.1.1.3   root     1360:      case i_MVPMR:
1.1.1.5 ! root     1361:        printf ("\tuaecptr memp = m68k_areg(regs, srcreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword ());
1.1.1.3   root     1362:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
1.1.1.5 ! root     1363:        flush_amodes ();
1.1       root     1364:        if (table68k[opcode].size == sz_word) {
1.1.1.3   root     1365:            printf ("\tuae_u16 val = (get_byte(memp) << 8) + get_byte(memp + 2);\n");
1.1       root     1366:        } else {
1.1.1.3   root     1367:            printf ("\tuae_u32 val = (get_byte(memp) << 24) + (get_byte(memp + 2) << 16)\n");
                   1368:            printf ("              + (get_byte(memp + 4) << 8) + get_byte(memp + 6);\n");
1.1       root     1369:        }
1.1.1.3   root     1370:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1371:        break;
                   1372:      case i_MOVE:
1.1.1.3   root     1373:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1374:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
1.1.1.5 ! root     1375:        flush_amodes ();
        !          1376:        genflags (flag_logical, table68k[opcode].size, "src", "", "");
1.1.1.3   root     1377:        genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1378:        break;
                   1379:      case i_MOVEA:
1.1.1.3   root     1380:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1381:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
1.1.1.5 ! root     1382:        flush_amodes ();
1.1       root     1383:        if (table68k[opcode].size == sz_word) {
1.1.1.3   root     1384:            printf ("\tuae_u32 val = (uae_s32)(uae_s16)src;\n");
1.1       root     1385:        } else {
1.1.1.3   root     1386:            printf ("\tuae_u32 val = src;\n");
1.1       root     1387:        }
1.1.1.3   root     1388:        genastore ("val", table68k[opcode].dmode, "dstreg", sz_long, "dst");
1.1       root     1389:        break;
1.1.1.3   root     1390:      case i_MVSR2:
                   1391:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 2, 0);
1.1.1.5 ! root     1392:        flush_amodes ();
1.1.1.3   root     1393:        printf ("\tMakeSR();\n");
1.1       root     1394:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1395:            genastore ("regs.sr & 0xff", table68k[opcode].smode, "srcreg", sz_word, "src");
1.1       root     1396:        else
1.1.1.3   root     1397:            genastore ("regs.sr", table68k[opcode].smode, "srcreg", sz_word, "src");
1.1       root     1398:        break;
                   1399:      case i_MV2SR:
1.1.1.3   root     1400:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0);
1.1.1.5 ! root     1401:        flush_amodes ();
1.1       root     1402:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1403:            printf ("\tMakeSR();\n\tregs.sr &= 0xFF00;\n\tregs.sr |= src & 0xFF;\n");
                   1404:        else {
                   1405:            printf ("\tregs.sr = src;\n");
1.1       root     1406:        }
1.1.1.3   root     1407:        printf ("\tMakeFromSR();\n");
1.1       root     1408:        break;
1.1.1.3   root     1409:      case i_SWAP:
                   1410:        genamode (table68k[opcode].smode, "srcreg", sz_long, "src", 1, 0);
1.1.1.5 ! root     1411:        flush_amodes ();
1.1       root     1412:        start_brace ();
1.1.1.3   root     1413:        printf ("\tuae_u32 dst = ((src >> 16)&0xFFFF) | ((src&0xFFFF)<<16);\n");
1.1.1.5 ! root     1414:        genflags (flag_logical, sz_long, "dst", "", "");
        !          1415:        genastore ("dst", table68k[opcode].smode, "srcreg", sz_long, "src");
1.1       root     1416:        break;
                   1417:      case i_EXG:
1.1.1.3   root     1418:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1419:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1420:        flush_amodes ();
        !          1421:        genastore ("dst", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
        !          1422:        genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1423:        break;
                   1424:      case i_EXT:
1.1.1.3   root     1425:        genamode (table68k[opcode].smode, "srcreg", sz_long, "src", 1, 0);
1.1.1.5 ! root     1426:        flush_amodes ();
1.1       root     1427:        start_brace ();
1.1.1.5 ! root     1428:        switch (table68k[opcode].size) {
1.1.1.3   root     1429:         case sz_byte: printf ("\tuae_u32 dst = (uae_s32)(uae_s8)src;\n"); break;
                   1430:         case sz_word: printf ("\tuae_u16 dst = (uae_s16)(uae_s8)src;\n"); break;
                   1431:         case sz_long: printf ("\tuae_u32 dst = (uae_s32)(uae_s16)src;\n"); break;
1.1.1.5 ! root     1432:         default: abort ();
1.1       root     1433:        }
1.1.1.5 ! root     1434:        genflags (flag_logical,
        !          1435:                  table68k[opcode].size == sz_word ? sz_word : sz_long, "dst", "", "");
        !          1436:        genastore ("dst", table68k[opcode].smode, "srcreg",
        !          1437:            table68k[opcode].size == sz_word ? sz_word : sz_long, "src");
1.1       root     1438:        break;
                   1439:      case i_MVMEL:
1.1.1.5 ! root     1440:        genmovemel (opcode);
1.1       root     1441:        break;
                   1442:      case i_MVMLE:
1.1.1.5 ! root     1443:        genmovemle (opcode);
1.1       root     1444:        break;
                   1445:      case i_TRAP:
1.1.1.3   root     1446:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1447:        flush_amodes ();
        !          1448:        sync_m68k_pc ();
1.1.1.3   root     1449:        printf ("\tException(src+32,0);\n");
                   1450:        m68k_pc_offset = 0;
1.1       root     1451:        break;
                   1452:      case i_MVR2USP:
1.1.1.3   root     1453:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1454:        flush_amodes ();
1.1.1.3   root     1455:        printf ("\tregs.usp = src;\n");
1.1       root     1456:        break;
1.1.1.3   root     1457:      case i_MVUSP2R:
                   1458:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 2, 0);
1.1.1.5 ! root     1459:        flush_amodes ();
1.1.1.3   root     1460:        genastore ("regs.usp", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1461:        break;
                   1462:      case i_RESET:
1.1.1.3   root     1463:        printf ("\tcustomreset();\n");
1.1       root     1464:        break;
                   1465:      case i_NOP:
                   1466:        break;
                   1467:      case i_STOP:
1.1.1.3   root     1468:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1469:        flush_amodes ();
1.1.1.3   root     1470:        printf ("\tregs.sr = src;\n");
                   1471:        printf ("\tMakeFromSR();\n");
                   1472:        printf ("\tm68k_setstopped(1);\n");
1.1       root     1473:        break;
                   1474:      case i_RTE:
1.1.1.3   root     1475:        if (cpu_level == 0) {
                   1476:            genamode (Aipi, "7", sz_word, "sr", 1, 0);
                   1477:            genamode (Aipi, "7", sz_long, "pc", 1, 0);
1.1.1.5 ! root     1478:            flush_amodes ();
1.1.1.3   root     1479:            printf ("\tregs.sr = sr; m68k_setpc_rte(pc);\n");
                   1480:            fill_prefetch_0 ();
                   1481:            printf ("\tMakeFromSR();\n");
                   1482:        } else {
1.1       root     1483:            int old_brace_level = n_braces;
1.1.1.3   root     1484:            if (next_cpu_level < 0)
                   1485:                next_cpu_level = 0;
                   1486:            printf ("\tuae_u16 newsr; uae_u32 newpc; for (;;) {\n");
                   1487:            genamode (Aipi, "7", sz_word, "sr", 1, 0);
                   1488:            genamode (Aipi, "7", sz_long, "pc", 1, 0);
                   1489:            genamode (Aipi, "7", sz_word, "format", 1, 0);
1.1.1.5 ! root     1490:            flush_amodes ();
1.1.1.3   root     1491:            printf ("\tnewsr = sr; newpc = pc;\n");
                   1492:            printf ("\tif ((format & 0xF000) == 0x0000) { break; }\n");
                   1493:            printf ("\telse if ((format & 0xF000) == 0x1000) { ; }\n");
                   1494:            printf ("\telse if ((format & 0xF000) == 0x2000) { m68k_areg(regs, 7) += 4; break; }\n");
                   1495:            printf ("\telse if ((format & 0xF000) == 0x8000) { m68k_areg(regs, 7) += 50; break; }\n");
                   1496:            printf ("\telse if ((format & 0xF000) == 0x9000) { m68k_areg(regs, 7) += 12; break; }\n");
                   1497:            printf ("\telse if ((format & 0xF000) == 0xa000) { m68k_areg(regs, 7) += 24; break; }\n");
                   1498:            printf ("\telse if ((format & 0xF000) == 0xb000) { m68k_areg(regs, 7) += 84; break; }\n");
                   1499:            printf ("\telse { Exception(14,0); goto %s; }\n", endlabelstr);
                   1500:            printf ("\tregs.sr = newsr; MakeFromSR();\n}\n");
1.1       root     1501:            pop_braces (old_brace_level);
1.1.1.3   root     1502:            printf ("\tregs.sr = newsr; MakeFromSR();\n");
                   1503:            printf ("\tm68k_setpc_rte(newpc);\n");
                   1504:            fill_prefetch_0 ();
1.1.1.5 ! root     1505:            need_endlabel = 1;
1.1       root     1506:        }
1.1.1.3   root     1507:        /* PC is set and prefetch filled. */
                   1508:        m68k_pc_offset = 0;
1.1       root     1509:        break;
                   1510:      case i_RTD:
1.1.1.3   root     1511:        printf ("\tcompiler_flush_jsr_stack();\n");
                   1512:        genamode (Aipi, "7", sz_long, "pc", 1, 0);
                   1513:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "offs", 1, 0);
1.1.1.5 ! root     1514:        flush_amodes ();
1.1.1.3   root     1515:        printf ("\tm68k_areg(regs, 7) += offs;\n");
                   1516:        printf ("\tm68k_setpc_rte(pc);\n");
                   1517:        fill_prefetch_0 ();
                   1518:        /* PC is set and prefetch filled. */
                   1519:        m68k_pc_offset = 0;
1.1       root     1520:        break;
                   1521:      case i_LINK:
1.1.1.3   root     1522:        genamode (Apdi, "7", sz_long, "old", 2, 0);
                   1523:        genamode (table68k[opcode].smode, "srcreg", sz_long, "src", 1, 0);
1.1.1.5 ! root     1524:        flush_amodes ();
1.1.1.3   root     1525:        genastore ("src", Apdi, "7", sz_long, "old");
                   1526:        genastore ("m68k_areg(regs, 7)", table68k[opcode].smode, "srcreg", sz_long, "src");
                   1527:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "offs", 1, 0);
1.1.1.5 ! root     1528:        flush_amodes ();
1.1.1.3   root     1529:        printf ("\tm68k_areg(regs, 7) += offs;\n");
1.1       root     1530:        break;
                   1531:      case i_UNLK:
1.1.1.3   root     1532:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1533:        flush_amodes ();
1.1.1.3   root     1534:        printf ("\tm68k_areg(regs, 7) = src;\n");
                   1535:        genamode (Aipi, "7", sz_long, "old", 1, 0);
1.1.1.5 ! root     1536:        flush_amodes ();
1.1.1.3   root     1537:        genastore ("old", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1538:        break;
                   1539:      case i_RTS:
1.1.1.3   root     1540:        printf ("\tm68k_do_rts();\n");
                   1541:        fill_prefetch_0 ();
                   1542:        m68k_pc_offset = 0;
1.1       root     1543:        break;
                   1544:      case i_TRAPV:
1.1.1.3   root     1545:        sync_m68k_pc ();
                   1546:        printf ("\tif(VFLG) { Exception(7,m68k_getpc()); goto %s; }\n", endlabelstr);
1.1.1.5 ! root     1547:        need_endlabel = 1;
1.1       root     1548:        break;
1.1.1.2   root     1549:      case i_RTR:
1.1.1.3   root     1550:        printf ("\tcompiler_flush_jsr_stack();\n");
                   1551:        printf ("\tMakeSR();\n");
                   1552:        genamode (Aipi, "7", sz_word, "sr", 1, 0);
                   1553:        genamode (Aipi, "7", sz_long, "pc", 1, 0);
1.1.1.5 ! root     1554:        flush_amodes ();
1.1.1.3   root     1555:        printf ("\tregs.sr &= 0xFF00; sr &= 0xFF;\n");
                   1556:        printf ("\tregs.sr |= sr; m68k_setpc(pc);\n");
                   1557:        fill_prefetch_0 ();
                   1558:        printf ("\tMakeFromSR();\n");
                   1559:        m68k_pc_offset = 0;
1.1       root     1560:        break;
                   1561:      case i_JSR:
1.1.1.3   root     1562:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0);
1.1.1.5 ! root     1563:        flush_amodes ();
1.1.1.3   root     1564:        printf ("\tm68k_do_jsr(m68k_getpc() + %d, srca);\n", m68k_pc_offset);
                   1565:        fill_prefetch_0 ();
                   1566:        m68k_pc_offset = 0;
                   1567:        break;
                   1568:      case i_JMP:
                   1569:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0);
1.1.1.5 ! root     1570:        flush_amodes ();
1.1.1.3   root     1571:        printf ("\tm68k_setpc(srca);\n");
                   1572:        fill_prefetch_0 ();
                   1573:        m68k_pc_offset = 0;
1.1       root     1574:        break;
                   1575:      case i_BSR:
1.1.1.3   root     1576:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1577:        flush_amodes ();
1.1.1.3   root     1578:        printf ("\tuae_s32 s = (uae_s32)src + 2;\n");
                   1579:        if (using_exception_3) {
                   1580:            printf ("\tif (src & 1) {\n");
                   1581:            printf ("\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
                   1582:            printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + s;\n");
                   1583:            printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
                   1584:            printf ("\t}\n");
1.1.1.5 ! root     1585:            need_endlabel = 1;
1.1.1.3   root     1586:        }
                   1587:        printf ("\tm68k_do_bsr(m68k_getpc() + %d, s);\n", m68k_pc_offset);
                   1588:        fill_prefetch_0 ();
                   1589:        m68k_pc_offset = 0;
1.1       root     1590:        break;
                   1591:      case i_Bcc:
1.1.1.3   root     1592:        if (table68k[opcode].size == sz_long) {
                   1593:            if (cpu_level < 2) {
                   1594:                printf ("\tm68k_incpc(2);\n");
                   1595:                printf ("\tif (!cctrue(%d)) goto %s;\n", table68k[opcode].cc, endlabelstr);
                   1596:                printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
                   1597:                printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + 1;\n");
                   1598:                printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
1.1.1.5 ! root     1599:                need_endlabel = 1;
1.1.1.3   root     1600:            } else {
                   1601:                if (next_cpu_level < 1)
                   1602:                    next_cpu_level = 1;
                   1603:            }
                   1604:        }
                   1605:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     1606:        flush_amodes ();
1.1.1.3   root     1607:        printf ("\tif (!cctrue(%d)) goto didnt_jump;\n", table68k[opcode].cc);
                   1608:        if (using_exception_3) {
                   1609:            printf ("\tif (src & 1) {\n");
                   1610:            printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
                   1611:            printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + 2 + (uae_s32)src;\n");
                   1612:            printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
                   1613:            printf ("\t}\n");
1.1.1.5 ! root     1614:            need_endlabel = 1;
1.1.1.3   root     1615:        }
1.1       root     1616: #ifdef USE_COMPILER
1.1.1.3   root     1617:        printf ("\tm68k_setpc_bcc(m68k_getpc() + 2 + (uae_s32)src);\n");
1.1       root     1618: #else
1.1.1.3   root     1619:        printf ("\tm68k_incpc ((uae_s32)src + 2);\n");
1.1       root     1620: #endif
1.1.1.3   root     1621:        fill_prefetch_0 ();
                   1622:        printf ("\tgoto %s;\n", endlabelstr);
                   1623:        printf ("didnt_jump:;\n");
1.1.1.5 ! root     1624:        need_endlabel = 1;
1.1       root     1625:        break;
                   1626:      case i_LEA:
1.1.1.3   root     1627:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0);
                   1628:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
1.1.1.5 ! root     1629:        flush_amodes ();
1.1.1.3   root     1630:        genastore ("srca", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1631:        break;
                   1632:      case i_PEA:
1.1.1.3   root     1633:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0);
                   1634:        genamode (Apdi, "7", sz_long, "dst", 2, 0);
1.1.1.5 ! root     1635:        flush_amodes ();
1.1.1.3   root     1636:        genastore ("srca", Apdi, "7", sz_long, "dst");
1.1       root     1637:        break;
                   1638:      case i_DBcc:
1.1.1.3   root     1639:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1640:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "offs", 1, 0);
1.1.1.5 ! root     1641:        flush_amodes ();
1.1.1.3   root     1642: 
                   1643:        printf ("\tif (!cctrue(%d)) {\n", table68k[opcode].cc);
                   1644:        genastore ("(src-1)", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
                   1645: 
                   1646:        printf ("\t\tif (src) {\n");
                   1647:        if (using_exception_3) {
                   1648:            printf ("\t\t\tif (offs & 1) {\n");
                   1649:            printf ("\t\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
                   1650:            printf ("\t\t\tlast_fault_for_exception_3 = m68k_getpc() + 2 + (uae_s32)offs + 2;\n");
                   1651:            printf ("\t\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
                   1652:            printf ("\t\t}\n");
1.1.1.5 ! root     1653:            need_endlabel = 1;
1.1.1.3   root     1654:        }
1.1       root     1655: #ifdef USE_COMPILER
1.1.1.3   root     1656:        printf ("\t\t\tm68k_setpc_bcc(m68k_getpc() + (uae_s32)offs + 2);\n");
1.1       root     1657: #else
1.1.1.3   root     1658:        printf ("\t\t\tm68k_incpc((uae_s32)offs + 2);\n");
1.1       root     1659: #endif
1.1.1.3   root     1660:        fill_prefetch_0 ();
                   1661:        printf ("\t\tgoto %s;\n", endlabelstr);
                   1662:        printf ("\t\t}\n");
                   1663:        printf ("\t}\n");
1.1.1.5 ! root     1664:        need_endlabel = 1;
1.1       root     1665:        break;
1.1.1.3   root     1666:      case i_Scc:
                   1667:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 2, 0);
1.1.1.5 ! root     1668:        flush_amodes ();
1.1       root     1669:        start_brace ();
1.1.1.3   root     1670:        printf ("\tint val = cctrue(%d) ? 0xff : 0;\n", table68k[opcode].cc);
1.1.1.5 ! root     1671:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1672:        break;
                   1673:      case i_DIVU:
1.1.1.3   root     1674:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
                   1675:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0);
                   1676:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0);
1.1.1.5 ! root     1677:        flush_amodes ();
1.1.1.3   root     1678:        printf ("\tif(src == 0) { Exception(5,oldpc); goto %s; } else {\n", endlabelstr);
                   1679:        printf ("\tuae_u32 newv = (uae_u32)dst / (uae_u32)(uae_u16)src;\n");
                   1680:        printf ("\tuae_u32 rem = (uae_u32)dst %% (uae_u32)(uae_u16)src;\n");
1.1       root     1681:        /* The N flag appears to be set each time there is an overflow.
                   1682:         * Weird. */
1.1.1.3   root     1683:        printf ("\tif (newv > 0xffff) { VFLG = NFLG = 1; CFLG = 0; } else\n\t{\n");
1.1.1.5 ! root     1684:        genflags (flag_logical, sz_word, "newv", "", "");
1.1.1.3   root     1685:        printf ("\tnewv = (newv & 0xffff) | ((uae_u32)rem << 16);\n");
1.1.1.5 ! root     1686:        genastore ("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst");
1.1.1.3   root     1687:        printf ("\t}\n");
                   1688:        printf ("\t}\n");
1.1.1.5 ! root     1689:        insn_n_cycles += 68;
        !          1690:        need_endlabel = 1;
1.1.1.3   root     1691:        break;
                   1692:      case i_DIVS:
                   1693:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
                   1694:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0);
                   1695:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0);
1.1.1.5 ! root     1696:        flush_amodes ();
1.1.1.3   root     1697:        printf ("\tif(src == 0) { Exception(5,oldpc); goto %s; } else {\n", endlabelstr);
                   1698:        printf ("\tuae_s32 newv = (uae_s32)dst / (uae_s32)(uae_s16)src;\n");
                   1699:        printf ("\tuae_u16 rem = (uae_s32)dst %% (uae_s32)(uae_s16)src;\n");
                   1700:        printf ("\tif ((newv & 0xffff8000) != 0 && (newv & 0xffff8000) != 0xffff8000) { VFLG = NFLG = 1; CFLG = 0; } else\n\t{\n");
                   1701:        printf ("\tif (((uae_s16)rem < 0) != ((uae_s32)dst < 0)) rem = -rem;\n");
1.1.1.5 ! root     1702:        genflags (flag_logical, sz_word, "newv", "", "");
1.1.1.3   root     1703:        printf ("\tnewv = (newv & 0xffff) | ((uae_u32)rem << 16);\n");
1.1.1.5 ! root     1704:        genastore ("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst");
1.1.1.3   root     1705:        printf ("\t}\n");
                   1706:        printf ("\t}\n");
1.1.1.5 ! root     1707:        insn_n_cycles += 72;
        !          1708:        need_endlabel = 1;
1.1.1.3   root     1709:        break;
                   1710:      case i_MULU:
                   1711:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0);
                   1712:        genamode (table68k[opcode].dmode, "dstreg", sz_word, "dst", 1, 0);
1.1.1.5 ! root     1713:        flush_amodes ();
1.1       root     1714:        start_brace ();
1.1.1.3   root     1715:        printf ("\tuae_u32 newv = (uae_u32)(uae_u16)dst * (uae_u32)(uae_u16)src;\n");
1.1.1.5 ! root     1716:        genflags (flag_logical, sz_long, "newv", "", "");
        !          1717:        genastore ("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst");
        !          1718:        insn_n_cycles += 32;
1.1       root     1719:        break;
                   1720:      case i_MULS:
1.1.1.3   root     1721:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0);
                   1722:        genamode (table68k[opcode].dmode, "dstreg", sz_word, "dst", 1, 0);
1.1.1.5 ! root     1723:        flush_amodes ();
1.1       root     1724:        start_brace ();
1.1.1.3   root     1725:        printf ("\tuae_u32 newv = (uae_s32)(uae_s16)dst * (uae_s32)(uae_s16)src;\n");
1.1.1.5 ! root     1726:        genflags (flag_logical, sz_long, "newv", "", "");
        !          1727:        genastore ("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst");
        !          1728:        insn_n_cycles += 32;
1.1       root     1729:        break;
                   1730:      case i_CHK:
1.1.1.3   root     1731:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
                   1732:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1733:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     1734:        flush_amodes ();
1.1.1.3   root     1735:        printf ("\tif ((uae_s32)dst < 0) { NFLG=1; Exception(6,oldpc); goto %s; }\n", endlabelstr);
                   1736:        printf ("\telse if (dst > src) { NFLG=0; Exception(6,oldpc); goto %s; }\n", endlabelstr);
1.1.1.5 ! root     1737:        need_endlabel = 1;
1.1       root     1738:        break;
1.1.1.3   root     1739: 
1.1       root     1740:      case i_CHK2:
1.1.1.3   root     1741:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
1.1       root     1742:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     1743:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
1.1.1.5 ! root     1744:        flush_amodes ();
1.1.1.3   root     1745:        printf ("\t{uae_s32 upper,lower,reg = regs.regs[(extra >> 12) & 15];\n");
1.1       root     1746:        switch (table68k[opcode].size) {
1.1.1.3   root     1747:         case sz_byte:
                   1748:            printf ("\tlower=(uae_s32)(uae_s8)get_byte(dsta); upper = (uae_s32)(uae_s8)get_byte(dsta+1);\n");
                   1749:            printf ("\tif ((extra & 0x8000) == 0) reg = (uae_s32)(uae_s8)reg;\n");
                   1750:            break;
                   1751:         case sz_word:
                   1752:            printf ("\tlower=(uae_s32)(uae_s16)get_word(dsta); upper = (uae_s32)(uae_s16)get_word(dsta+2);\n");
                   1753:            printf ("\tif ((extra & 0x8000) == 0) reg = (uae_s32)(uae_s16)reg;\n");
                   1754:            break;
                   1755:         case sz_long:
                   1756:            printf ("\tlower=get_long(dsta); upper = get_long(dsta+4);\n");
                   1757:            break;
                   1758:         default:
1.1.1.5 ! root     1759:            abort ();
1.1.1.3   root     1760:        }
                   1761:        printf ("\tZFLG=upper == reg || lower == reg;\n");
                   1762:        printf ("\tCFLG=lower <= upper ? reg < lower || reg > upper : reg > upper || reg < lower;\n");
                   1763:        printf ("\tif ((extra & 0x800) && CFLG) { Exception(6,oldpc); goto %s; }\n}\n", endlabelstr);
1.1.1.5 ! root     1764:        need_endlabel = 1;
1.1.1.3   root     1765:        break;
                   1766: 
                   1767:      case i_ASR:
                   1768:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1769:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     1770:        flush_amodes ();
1.1.1.3   root     1771:        start_brace ();
1.1.1.5 ! root     1772:        switch (table68k[opcode].size) {
1.1.1.3   root     1773:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1774:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1775:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     1776:         default: abort ();
1.1       root     1777:        }
1.1.1.5 ! root     1778:        switch (table68k[opcode].size) {
1.1.1.3   root     1779:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1780:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1781:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     1782:         default: abort ();
1.1.1.3   root     1783:        }
                   1784:        printf ("\tuae_u32 sign = cmask & val;\n");
                   1785:        printf ("\tcnt &= 63;\n");
                   1786:        printf ("\tVFLG = 0;\n");
                   1787:        printf ("\tif (!cnt) { CFLG = 0; } else {\n");
1.1.1.5 ! root     1788:        printf ("\tif (cnt >= %d) {\n", bit_size (table68k[opcode].size));
        !          1789:        printf ("\t\tval = sign ? %s : 0;\n", bit_mask (table68k[opcode].size));
1.1.1.3   root     1790:        printf ("\t\tCFLG=XFLG= sign ? 1 : 0;\n");
                   1791:        printf ("\t} else {\n");
                   1792:        printf ("\t\tCFLG=XFLG=(val >> (cnt-1)) & 1;\n");
                   1793:        printf ("\t\tval >>= cnt;\n");
                   1794:        printf ("\t\tif (sign) val |= %s << (%d - cnt);\n",
1.1.1.5 ! root     1795:                bit_mask (table68k[opcode].size),
        !          1796:                bit_size (table68k[opcode].size));
1.1.1.3   root     1797:        printf ("\t}}\n");
                   1798:        printf ("\tNFLG = sign != 0;\n");
                   1799:        printf ("\tZFLG = val == 0;\n");
                   1800:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1801:        break;
                   1802:      case i_ASL:
1.1.1.3   root     1803:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1804:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     1805:        flush_amodes ();
1.1       root     1806:        start_brace ();
1.1.1.5 ! root     1807:        switch (table68k[opcode].size) {
1.1.1.3   root     1808:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1809:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1810:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     1811:         default: abort ();
1.1       root     1812:        }
1.1.1.5 ! root     1813:        switch (table68k[opcode].size) {
1.1.1.3   root     1814:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1815:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1816:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     1817:         default: abort ();
1.1       root     1818:        }
1.1.1.3   root     1819:        printf ("\tcnt &= 63;\n");
                   1820:        printf ("\tVFLG = 0;\n");
                   1821:        printf ("\tif (!cnt) { CFLG = 0; } else {\n");
1.1.1.5 ! root     1822:        printf ("\tif (cnt >= %d) {\n", bit_size (table68k[opcode].size));
1.1.1.3   root     1823:        printf ("\t\tVFLG = val != 0;\n");
                   1824:        printf ("\t\tCFLG=XFLG = cnt == %d ? val & 1 : 0;\n",
1.1.1.5 ! root     1825:                bit_size (table68k[opcode].size));
1.1.1.3   root     1826:        printf ("\t\tval = 0;\n");
                   1827:        printf ("\t} else {\n");
                   1828:        printf ("\t\tuae_u32 mask = (%s << (%d - cnt)) & %s;\n",
1.1.1.5 ! root     1829:                bit_mask (table68k[opcode].size),
        !          1830:                bit_size (table68k[opcode].size) - 1,
        !          1831:                bit_mask (table68k[opcode].size));
1.1.1.3   root     1832:        printf ("\t\tCFLG=XFLG=(val << (cnt-1)) & cmask ? 1 : 0;\n");
                   1833:        printf ("\t\tVFLG = (val & mask) != mask && (val & mask) != 0;\n");
                   1834:        printf ("\t\tval <<= cnt;\n");
                   1835:        printf ("\t}}\n");
                   1836:        printf ("\tNFLG = (val&cmask) != 0;\n");
                   1837:        printf ("\tZFLG = val == 0;\n");
                   1838:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1839:        break;
                   1840:      case i_LSR:
1.1.1.3   root     1841:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1842:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     1843:        flush_amodes ();
1.1       root     1844:        start_brace ();
1.1.1.5 ! root     1845:        switch (table68k[opcode].size) {
1.1.1.3   root     1846:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1847:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1848:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     1849:         default: abort ();
1.1       root     1850:        }
1.1.1.5 ! root     1851:        switch (table68k[opcode].size) {
1.1.1.3   root     1852:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1853:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1854:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     1855:         default: abort ();
1.1       root     1856:        }
1.1.1.3   root     1857:        printf ("\tcnt &= 63;\n");
                   1858:        printf ("\tif (!cnt) { CFLG = 0; } else {\n");
1.1.1.5 ! root     1859:        printf ("\tif (cnt >= %d) {\n", bit_size (table68k[opcode].size));
1.1.1.3   root     1860:        printf ("\t\tCFLG=XFLG = cnt == %d ? (val & cmask ? 1 : 0) : 0;\n",
1.1.1.5 ! root     1861:                bit_size (table68k[opcode].size));
1.1.1.3   root     1862:        printf ("\t\tval = 0;\n");
                   1863:        printf ("\t} else {\n");
                   1864:        printf ("\t\tCFLG=XFLG=(val >> (cnt-1)) & 1;\n");
                   1865:        printf ("\t\tval >>= cnt;\n");
                   1866:        printf ("\t}}\n");
                   1867:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1868:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1869:        break;
                   1870:      case i_LSL:
1.1.1.3   root     1871:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1872:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     1873:        flush_amodes ();
1.1       root     1874:        start_brace ();
1.1.1.5 ! root     1875:        switch (table68k[opcode].size) {
1.1.1.3   root     1876:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1877:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1878:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     1879:         default: abort ();
1.1       root     1880:        }
1.1.1.5 ! root     1881:        switch (table68k[opcode].size) {
1.1.1.3   root     1882:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1883:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1884:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     1885:         default: abort ();
1.1       root     1886:        }
1.1.1.3   root     1887:        printf ("\tcnt &= 63;\n");
                   1888:        printf ("\tif (!cnt) { CFLG = 0; } else {\n");
1.1.1.5 ! root     1889:        printf ("\tif (cnt >= %d) {\n", bit_size (table68k[opcode].size));
1.1.1.3   root     1890:        printf ("\t\tCFLG=XFLG = cnt == %d ? val & 1 : 0;\n",
1.1.1.5 ! root     1891:                bit_size (table68k[opcode].size));
1.1.1.3   root     1892:        printf ("\t\tval = 0;\n");
                   1893:        printf ("\t} else {\n");
                   1894:        printf ("\t\tCFLG=XFLG=(val << (cnt-1)) & cmask ? 1 : 0;\n");
                   1895:        printf ("\t\tval <<= cnt;\n");
                   1896:        printf ("\t}}\n");
                   1897:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1898:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1899:        break;
                   1900:      case i_ROL:
1.1.1.3   root     1901:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1902:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     1903:        flush_amodes ();
1.1       root     1904:        start_brace ();
1.1.1.5 ! root     1905:        switch (table68k[opcode].size) {
1.1.1.3   root     1906:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1907:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1908:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     1909:         default: abort ();
1.1       root     1910:        }
1.1.1.5 ! root     1911:        switch (table68k[opcode].size) {
1.1.1.3   root     1912:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1913:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1914:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     1915:         default: abort ();
1.1       root     1916:        }
1.1.1.3   root     1917:        printf ("\tcnt &= 63;\n");
                   1918:        printf ("\tif (!cnt) { CFLG = 0; } else {\n");
                   1919:        printf ("\tuae_u32 carry;\n");
                   1920:        printf ("\tfor(;cnt;--cnt){\n");
                   1921:        printf ("\tcarry=val&cmask; val <<= 1;\n");
                   1922:        printf ("\tif(carry) val |= 1;\n");
                   1923:        printf ("\t}\n");
                   1924:        printf ("\tCFLG = carry!=0;\n}\n");
                   1925:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1926:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1927:        break;
                   1928:      case i_ROR:
1.1.1.3   root     1929:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1930:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     1931:        flush_amodes ();
1.1       root     1932:        start_brace ();
1.1.1.5 ! root     1933:        switch (table68k[opcode].size) {
1.1.1.3   root     1934:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1935:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1936:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     1937:         default: abort ();
1.1       root     1938:        }
1.1.1.5 ! root     1939:        switch (table68k[opcode].size) {
1.1.1.3   root     1940:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1941:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1942:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     1943:         default: abort ();
1.1       root     1944:        }
1.1.1.3   root     1945:        printf ("\tcnt &= 63;\n");
                   1946:        printf ("\tif (!cnt) { CFLG = 0; } else {");
                   1947:        printf ("\tuae_u32 carry;\n");
                   1948:        printf ("\tfor(;cnt;--cnt){\n");
                   1949:        printf ("\tcarry=val&1; val = val >> 1;\n");
                   1950:        printf ("\tif(carry) val |= cmask;\n");
                   1951:        printf ("\t}\n");
                   1952:        printf ("\tCFLG = carry;\n}\n");
                   1953:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1954:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1955:        break;
1.1.1.3   root     1956:      case i_ROXL:
                   1957:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1958:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     1959:        flush_amodes ();
1.1       root     1960:        start_brace ();
1.1.1.5 ! root     1961:        switch (table68k[opcode].size) {
1.1.1.3   root     1962:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1963:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1964:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     1965:         default: abort ();
1.1       root     1966:        }
1.1.1.5 ! root     1967:        switch (table68k[opcode].size) {
1.1.1.3   root     1968:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1969:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1970:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     1971:         default: abort ();
1.1       root     1972:        }
1.1.1.3   root     1973:        printf ("\tuae_u32 carry;\n");
                   1974:        printf ("\tcnt &= 63;\n");
                   1975:        printf ("\tfor(;cnt;--cnt){\n");
                   1976:        printf ("\tcarry=val&cmask; val <<= 1;\n");
                   1977:        printf ("\tif(XFLG) val |= 1;\n");
                   1978:        printf ("\tXFLG = carry != 0;\n");
                   1979:        printf ("\t}\n");
                   1980:        printf ("\tCFLG = XFLG;\n");
                   1981:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1982:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1983:        break;
                   1984:      case i_ROXR:
1.1.1.3   root     1985:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1986:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     1987:        flush_amodes ();
1.1       root     1988:        start_brace ();
1.1.1.5 ! root     1989:        switch (table68k[opcode].size) {
1.1.1.3   root     1990:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1991:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1992:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     1993:         default: abort ();
1.1       root     1994:        }
1.1.1.5 ! root     1995:        switch (table68k[opcode].size) {
1.1.1.3   root     1996:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1997:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1998:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     1999:         default: abort ();
1.1       root     2000:        }
1.1.1.3   root     2001:        printf ("\tuae_u32 carry;\n");
                   2002:        printf ("\tcnt &= 63;\n");
                   2003:        printf ("\tfor(;cnt;--cnt){\n");
                   2004:        printf ("\tcarry=val&1; val >>= 1;\n");
                   2005:        printf ("\tif(XFLG) val |= cmask;\n");
                   2006:        printf ("\tXFLG = carry;\n");
                   2007:        printf ("\t}\n");
                   2008:        printf ("\tCFLG = XFLG;\n");
                   2009:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   2010:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     2011:        break;
                   2012:      case i_ASRW:
1.1.1.3   root     2013:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     2014:        flush_amodes ();
1.1.1.3   root     2015:        printf ("\tVFLG = 0;\n");
1.1       root     2016:        start_brace ();
1.1.1.5 ! root     2017:        switch (table68k[opcode].size) {
1.1.1.3   root     2018:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   2019:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   2020:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     2021:         default: abort ();
1.1       root     2022:        }
1.1.1.5 ! root     2023:        switch (table68k[opcode].size) {
1.1.1.3   root     2024:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   2025:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   2026:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     2027:         default: abort ();
1.1       root     2028:        }
1.1.1.3   root     2029:        printf ("\tuae_u32 sign = cmask & val;\n");
                   2030:        printf ("\tCFLG=XFLG=val&1; val = (val >> 1) | sign;\n");
                   2031:        printf ("\tNFLG = sign != 0;\n");
                   2032:        printf ("\tZFLG = val == 0;\n");
                   2033:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     2034:        break;
                   2035:      case i_ASLW:
1.1.1.3   root     2036:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     2037:        flush_amodes ();
1.1.1.3   root     2038:        printf ("\tVFLG = 0;\n");
1.1       root     2039:        start_brace ();
1.1.1.5 ! root     2040:        switch (table68k[opcode].size) {
1.1.1.3   root     2041:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   2042:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   2043:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     2044:         default: abort ();
1.1       root     2045:        }
1.1.1.5 ! root     2046:        switch (table68k[opcode].size) {
1.1.1.3   root     2047:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   2048:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   2049:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     2050:         default: abort ();
1.1       root     2051:        }
1.1.1.3   root     2052:        printf ("\tuae_u32 sign = cmask & val;\n");
                   2053:        printf ("\tCFLG=XFLG=(val&cmask)!=0; val <<= 1;\n");
                   2054:        printf ("\tif ((val&cmask)!=sign) VFLG=1;\n");
                   2055:        printf ("\tNFLG = (val&cmask) != 0;\n");
                   2056:        printf ("\tZFLG = val == 0;\n");
                   2057:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     2058:        break;
                   2059:      case i_LSRW:
1.1.1.3   root     2060:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     2061:        flush_amodes ();
1.1       root     2062:        start_brace ();
1.1.1.5 ! root     2063:        switch (table68k[opcode].size) {
1.1.1.3   root     2064:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   2065:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   2066:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     2067:         default: abort ();
1.1       root     2068:        }
1.1.1.3   root     2069:        printf ("\tuae_u32 carry = val&1;\n");
                   2070:        printf ("\tval >>= 1;\n");
1.1.1.5 ! root     2071:        genflags (flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     2072:        printf ("CFLG = XFLG = carry!=0;\n");
                   2073:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     2074:        break;
                   2075:      case i_LSLW:
1.1.1.3   root     2076:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     2077:        flush_amodes ();
1.1       root     2078:        start_brace ();
1.1.1.5 ! root     2079:        switch (table68k[opcode].size) {
1.1.1.3   root     2080:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   2081:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   2082:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     2083:         default: abort ();
1.1       root     2084:        }
1.1.1.5 ! root     2085:        switch (table68k[opcode].size) {
1.1.1.3   root     2086:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   2087:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   2088:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     2089:         default: abort ();
1.1       root     2090:        }
1.1.1.3   root     2091:        printf ("\tuae_u32 carry = val&cmask;\n");
                   2092:        printf ("\tval <<= 1;\n");
1.1.1.5 ! root     2093:        genflags (flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     2094:        printf ("CFLG = XFLG = carry!=0;\n");
                   2095:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     2096:        break;
                   2097:      case i_ROLW:
1.1.1.3   root     2098:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     2099:        flush_amodes ();
1.1       root     2100:        start_brace ();
1.1.1.5 ! root     2101:        switch (table68k[opcode].size) {
1.1.1.3   root     2102:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   2103:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   2104:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     2105:         default: abort ();
1.1       root     2106:        }
1.1.1.5 ! root     2107:        switch (table68k[opcode].size) {
1.1.1.3   root     2108:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   2109:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   2110:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     2111:         default: abort ();
1.1       root     2112:        }
1.1.1.3   root     2113:        printf ("\tuae_u32 carry = val&cmask;\n");
                   2114:        printf ("\tval <<= 1;\n");
                   2115:        printf ("\tif(carry)  val |= 1;\n");
1.1.1.5 ! root     2116:        genflags (flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     2117:        printf ("CFLG = carry!=0;\n");
                   2118:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     2119:        break;
                   2120:      case i_RORW:
1.1.1.3   root     2121:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     2122:        flush_amodes ();
1.1       root     2123:        start_brace ();
1.1.1.5 ! root     2124:        switch (table68k[opcode].size) {
1.1.1.3   root     2125:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   2126:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   2127:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     2128:         default: abort ();
1.1       root     2129:        }
1.1.1.3   root     2130:        printf ("\tuae_u32 carry = val&1;\n");
1.1.1.5 ! root     2131:        switch (table68k[opcode].size) {
1.1.1.3   root     2132:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   2133:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   2134:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     2135:         default: abort ();
1.1       root     2136:        }
1.1.1.3   root     2137:        printf ("\tval >>= 1;\n");
                   2138:        printf ("\tif(carry) val |= cmask;\n");
1.1.1.5 ! root     2139:        genflags (flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     2140:        printf ("CFLG = carry!=0;\n");
                   2141:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     2142:        break;
                   2143:      case i_ROXLW:
1.1.1.3   root     2144:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     2145:        flush_amodes ();
1.1       root     2146:        start_brace ();
1.1.1.5 ! root     2147:        switch (table68k[opcode].size) {
1.1.1.3   root     2148:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   2149:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   2150:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     2151:         default: abort ();
1.1       root     2152:        }
1.1.1.5 ! root     2153:        switch (table68k[opcode].size) {
1.1.1.3   root     2154:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   2155:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   2156:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     2157:         default: abort ();
1.1       root     2158:        }
1.1.1.3   root     2159:        printf ("\tuae_u32 carry = val&cmask;\n");
                   2160:        printf ("\tval <<= 1;\n");
                   2161:        printf ("\tif(XFLG) val |= 1;\n");
                   2162:        printf ("\tXFLG = carry != 0;\n");
1.1.1.5 ! root     2163:        genflags (flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     2164:        printf ("XFLG = CFLG = carry!=0;\n");
                   2165:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     2166:        break;
                   2167:      case i_ROXRW:
1.1.1.3   root     2168:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1.1.5 ! root     2169:        flush_amodes ();
1.1       root     2170:        start_brace ();
1.1.1.5 ! root     2171:        switch (table68k[opcode].size) {
1.1.1.3   root     2172:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   2173:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   2174:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1.1.5 ! root     2175:         default: abort ();
1.1       root     2176:        }
1.1.1.3   root     2177:        printf ("\tuae_u32 carry = val&1;\n");
1.1.1.5 ! root     2178:        switch (table68k[opcode].size) {
1.1.1.3   root     2179:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   2180:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   2181:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1.1.5 ! root     2182:         default: abort ();
1.1       root     2183:        }
1.1.1.3   root     2184:        printf ("\tval >>= 1;\n");
                   2185:        printf ("\tif(XFLG) val |= cmask;\n");
                   2186:        printf ("\tXFLG = carry != 0;\n");
1.1.1.5 ! root     2187:        genflags (flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     2188:        printf ("XFLG = CFLG = carry!=0;\n");
                   2189:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     2190:        break;
                   2191:      case i_MOVEC2:
                   2192:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     2193:        flush_amodes ();
        !          2194:        start_brace ();
1.1.1.3   root     2195:        printf ("\tint regno = (src >> 12) & 15;\n");
                   2196:        printf ("\tuae_u32 *regp = regs.regs + regno;\n");
                   2197:        printf ("\tm68k_movec2(src & 0xFFF, regp);\n");
1.1       root     2198:        break;
                   2199:      case i_MOVE2C:
                   2200:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     2201:        flush_amodes ();
        !          2202:        start_brace ();
1.1.1.3   root     2203:        printf ("\tint regno = (src >> 12) & 15;\n");
                   2204:        printf ("\tuae_u32 *regp = regs.regs + regno;\n");
                   2205:        printf ("\tm68k_move2c(src & 0xFFF, regp);\n");
1.1       root     2206:        break;
                   2207:      case i_CAS:
                   2208:        {
                   2209:            int old_brace_level;
                   2210:            genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   2211:            genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     2212:            flush_amodes ();
        !          2213:            start_brace ();
1.1.1.3   root     2214:            printf ("\tint ru = (src >> 6) & 7;\n");
                   2215:            printf ("\tint rc = src & 7;\n");
1.1.1.5 ! root     2216:            genflags (flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, rc)", "dst");
1.1.1.3   root     2217:            printf ("\tif (ZFLG)");
1.1       root     2218:            old_brace_level = n_braces;
                   2219:            start_brace ();
1.1.1.5 ! root     2220:            genastore ("(m68k_dreg(regs, ru))", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     2221:            pop_braces (old_brace_level);
1.1.1.3   root     2222:            printf ("else");
1.1       root     2223:            start_brace ();
1.1.1.3   root     2224:            printf ("m68k_dreg(regs, rc) = dst;\n");
1.1       root     2225:            pop_braces (old_brace_level);
                   2226:        }
                   2227:        break;
                   2228:      case i_CAS2:
                   2229:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.5 ! root     2230:        flush_amodes ();
1.1.1.3   root     2231:        printf ("\tuae_u32 rn1 = regs.regs[(extra >> 28) & 7];\n");
                   2232:        printf ("\tuae_u32 rn2 = regs.regs[(extra >> 12) & 7];\n");
1.1       root     2233:        if (table68k[opcode].size == sz_word) {
1.1.1.5 ! root     2234:            int old_brace_level = n_braces;
        !          2235:            printf ("\tuae_u16 dst1 = get_word(rn1), dst2 = get_word(rn2);\n");
        !          2236:            genflags (flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1");
        !          2237:            printf ("\tif (ZFLG) {\n");
        !          2238:            genflags (flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, extra & 7)", "dst2");
        !          2239:            printf ("\tif (ZFLG) {\n");
        !          2240:            printf ("\tput_word(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n");
        !          2241:            printf ("\tput_word(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n");
        !          2242:            printf ("\t}}\n");
        !          2243:            pop_braces (old_brace_level);
        !          2244:            printf ("\tif (!ZFLG) {\n");
        !          2245:            printf ("\tm68k_dreg(regs, (extra >> 22) & 7) = (m68k_dreg(regs, (extra >> 22) & 7) & ~0xffff) | (dst1 & 0xffff);\n");
        !          2246:            printf ("\tm68k_dreg(regs, (extra >> 6) & 7) = (m68k_dreg(regs, (extra >> 6) & 7) & ~0xffff) | (dst2 & 0xffff);\n");
        !          2247:            printf ("\t}\n");
1.1       root     2248:        } else {
1.1.1.5 ! root     2249:            int old_brace_level = n_braces;
        !          2250:            printf ("\tuae_u32 dst1 = get_long(rn1), dst2 = get_long(rn2);\n");
        !          2251:            genflags (flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1");
        !          2252:            printf ("\tif (ZFLG) {\n");
        !          2253:            genflags (flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, extra & 7)", "dst2");
        !          2254:            printf ("\tif (ZFLG) {\n");
        !          2255:            printf ("\tput_long(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n");
        !          2256:            printf ("\tput_long(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n");
        !          2257:            printf ("\t}}\n");
        !          2258:            pop_braces (old_brace_level);
        !          2259:            printf ("\tif (!ZFLG) {\n");
        !          2260:            printf ("\tm68k_dreg(regs, (extra >> 22) & 7) = dst1;\n");
        !          2261:            printf ("\tm68k_dreg(regs, (extra >> 6) & 7) = dst2;\n");
        !          2262:            printf ("\t}\n");
1.1       root     2263:        }
                   2264:        break;
1.1.1.5 ! root     2265:      case i_MOVES:             /* ignore DFC and SFC because we have no MMU */
1.1       root     2266:        {
                   2267:            int old_brace_level;
                   2268:            genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.5 ! root     2269:            flush_amodes ();
1.1.1.3   root     2270:            printf ("\tif (extra & 0x800)\n");
1.1       root     2271:            old_brace_level = n_braces;
                   2272:            start_brace ();
1.1.1.3   root     2273:            printf ("\tuae_u32 src = regs.regs[(extra >> 12) & 15];\n");
                   2274:            genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
1.1.1.5 ! root     2275:            flush_amodes ();
1.1.1.3   root     2276:            genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     2277:            pop_braces (old_brace_level);
1.1.1.3   root     2278:            printf ("else");
1.1       root     2279:            start_brace ();
1.1.1.3   root     2280:            genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     2281:            flush_amodes ();
1.1.1.3   root     2282:            printf ("\tif (extra & 0x8000) {\n");
1.1.1.5 ! root     2283:            switch (table68k[opcode].size) {
1.1.1.3   root     2284:             case sz_byte: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = (uae_s32)(uae_s8)src;\n"); break;
                   2285:             case sz_word: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = (uae_s32)(uae_s16)src;\n"); break;
                   2286:             case sz_long: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = src;\n"); break;
1.1.1.5 ! root     2287:             default: abort ();
1.1       root     2288:            }
1.1.1.3   root     2289:            printf ("\t} else {\n");
                   2290:            genastore ("src", Dreg, "(extra >> 12) & 7", table68k[opcode].size, "");
                   2291:            printf ("\t}\n");
1.1       root     2292:            pop_braces (old_brace_level);
                   2293:        }
                   2294:        break;
1.1.1.5 ! root     2295:      case i_BKPT:              /* only needed for hardware emulators */
        !          2296:        sync_m68k_pc ();
1.1.1.3   root     2297:        printf ("\top_illg(opcode);\n");
1.1       root     2298:        break;
1.1.1.5 ! root     2299:      case i_CALLM:             /* not present in 68030 */
        !          2300:        sync_m68k_pc ();
1.1.1.3   root     2301:        printf ("\top_illg(opcode);\n");
1.1       root     2302:        break;
1.1.1.5 ! root     2303:      case i_RTM:               /* not present in 68030 */
        !          2304:        sync_m68k_pc ();
1.1.1.3   root     2305:        printf ("\top_illg(opcode);\n");
1.1       root     2306:        break;
                   2307:      case i_TRAPcc:
                   2308:        if (table68k[opcode].smode != am_unknown && table68k[opcode].smode != am_illg)
                   2309:            genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "dummy", 1, 0);
1.1.1.5 ! root     2310:        flush_amodes ();
1.1.1.3   root     2311:        printf ("\tif (cctrue(%d)) { Exception(7,m68k_getpc()); goto %s; }\n", table68k[opcode].cc, endlabelstr);
1.1.1.5 ! root     2312:        need_endlabel = 1;
1.1       root     2313:        break;
                   2314:      case i_DIVL:
1.1.1.3   root     2315:        sync_m68k_pc ();
                   2316:        start_brace ();
                   2317:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
1.1       root     2318:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
                   2319:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     2320:        flush_amodes ();
        !          2321:        sync_m68k_pc ();
1.1.1.3   root     2322:        printf ("\tm68k_divl(opcode, dst, extra, oldpc);\n");
1.1       root     2323:        break;
                   2324:      case i_MULL:
                   2325:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
                   2326:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.5 ! root     2327:        flush_amodes ();
        !          2328:        sync_m68k_pc ();
1.1.1.3   root     2329:        printf ("\tm68k_mull(opcode, dst, extra);\n");
1.1       root     2330:        break;
                   2331:      case i_BFTST:
                   2332:      case i_BFEXTU:
                   2333:      case i_BFCHG:
                   2334:      case i_BFEXTS:
                   2335:      case i_BFCLR:
                   2336:      case i_BFFFO:
                   2337:      case i_BFSET:
                   2338:      case i_BFINS:
                   2339:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     2340:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 2, 0);
1.1.1.5 ! root     2341:        flush_amodes ();
        !          2342:        start_brace ();
1.1.1.3   root     2343:        printf ("\tuae_s32 offset = extra & 0x800 ? m68k_dreg(regs, (extra >> 6) & 7) : (extra >> 6) & 0x1f;\n");
                   2344:        printf ("\tint width = (((extra & 0x20 ? m68k_dreg(regs, extra & 7) : extra) -1) & 0x1f) +1;\n");
1.1       root     2345:        if (table68k[opcode].dmode == Dreg) {
1.1.1.3   root     2346:            printf ("\tuae_u32 tmp = m68k_dreg(regs, dstreg) << (offset & 0x1f);\n");
                   2347:        } else {
                   2348:            printf ("\tuae_u32 tmp,bf0,bf1;\n");
                   2349:            printf ("\tdsta += (offset >> 3) | (offset & 0x80000000 ? ~0x1fffffff : 0);\n");
                   2350:            printf ("\tbf0 = get_long(dsta);bf1 = get_byte(dsta+4) & 0xff;\n");
                   2351:            printf ("\ttmp = (bf0 << (offset & 7)) | (bf1 >> (8 - (offset & 7)));\n");
                   2352:        }
                   2353:        printf ("\ttmp >>= (32 - width);\n");
                   2354:        printf ("\tNFLG = tmp & (1 << (width-1)) ? 1 : 0;ZFLG = tmp == 0;VFLG = 0;CFLG = 0;\n");
1.1.1.5 ! root     2355:        switch (table68k[opcode].mnemo) {
1.1.1.3   root     2356:         case i_BFTST:
                   2357:            break;
                   2358:         case i_BFEXTU:
                   2359:            printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n");
                   2360:            break;
                   2361:         case i_BFCHG:
                   2362:            printf ("\ttmp = ~tmp;\n");
                   2363:            break;
                   2364:         case i_BFEXTS:
                   2365:            printf ("\tif (NFLG) tmp |= width == 32 ? 0 : (-1 << width);\n");
                   2366:            printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n");
                   2367:            break;
                   2368:         case i_BFCLR:
                   2369:            printf ("\ttmp = 0;\n");
                   2370:            break;
                   2371:         case i_BFFFO:
                   2372:            printf ("\t{ uae_u32 mask = 1 << (width-1);\n");
                   2373:            printf ("\twhile (mask) { if (tmp & mask) break; mask >>= 1; offset++; }}\n");
                   2374:            printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = offset;\n");
                   2375:            break;
                   2376:         case i_BFSET:
                   2377:            printf ("\ttmp = 0xffffffff;\n");
                   2378:            break;
                   2379:         case i_BFINS:
                   2380:            printf ("\ttmp = m68k_dreg(regs, (extra >> 12) & 7);\n");
                   2381:            break;
                   2382:         default:
                   2383:            break;
1.1       root     2384:        }
1.1.1.5 ! root     2385:        if (table68k[opcode].mnemo == i_BFCHG
        !          2386:            || table68k[opcode].mnemo == i_BFCLR
        !          2387:            || table68k[opcode].mnemo == i_BFSET
        !          2388:            || table68k[opcode].mnemo == i_BFINS)
        !          2389:        {
        !          2390:            printf ("\ttmp <<= (32 - width);\n");
        !          2391:            if (table68k[opcode].dmode == Dreg) {
        !          2392:                printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & ((offset & 0x1f) == 0 ? 0 :\n");
        !          2393:                printf ("\t\t(0xffffffff << (32 - (offset & 0x1f))))) |\n");
        !          2394:                printf ("\t\t(tmp >> (offset & 0x1f)) |\n");
        !          2395:                printf ("\t\t(((offset & 0x1f) + width) >= 32 ? 0 :\n");
        !          2396:                printf (" (m68k_dreg(regs, dstreg) & ((uae_u32)0xffffffff >> ((offset & 0x1f) + width))));\n");
        !          2397:            } else {
        !          2398:                printf ("\tbf0 = (bf0 & (0xff000000 << (8 - (offset & 7)))) |\n");
        !          2399:                printf ("\t\t(tmp >> (offset & 7)) |\n");
        !          2400:                printf ("\t\t(((offset & 7) + width) >= 32 ? 0 :\n");
        !          2401:                printf ("\t\t (bf0 & ((uae_u32)0xffffffff >> ((offset & 7) + width))));\n");
        !          2402:                printf ("\tput_long(dsta,bf0 );\n");
        !          2403:                printf ("\tif (((offset & 7) + width) > 32) {\n");
        !          2404:                printf ("\t\tbf1 = (bf1 & (0xff >> (width - 32 + (offset & 7)))) |\n");
        !          2405:                printf ("\t\t\t(tmp << (8 - (offset & 7)));\n");
        !          2406:                printf ("\t\tput_byte(dsta+4,bf1);\n");
        !          2407:                printf ("\t}\n");
        !          2408:            }
1.1       root     2409:        }
                   2410:        break;
                   2411:      case i_PACK:
                   2412:        if (table68k[opcode].smode == Dreg) {
1.1.1.5 ! root     2413:            printf ("\tuae_u16 val = m68k_dreg(regs, srcreg) + %s;\n", gen_nextiword ());
1.1.1.3   root     2414:            printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffffff00) | ((val >> 4) & 0xf0) | (val & 0xf);\n");
                   2415:        } else {
                   2416:            printf ("\tuae_u16 val;\n");
                   2417:            printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
                   2418:            printf ("\tval = (uae_u16)get_byte(m68k_areg(regs, srcreg));\n");
                   2419:            printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
1.1.1.5 ! root     2420:            printf ("\tval = (val | ((uae_u16)get_byte(m68k_areg(regs, srcreg)) << 8)) + %s;\n", gen_nextiword ());
1.1.1.3   root     2421:            printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
                   2422:            printf ("\tput_byte(m68k_areg(regs, dstreg),((val >> 4) & 0xf0) | (val & 0xf));\n");
1.1       root     2423:        }
                   2424:        break;
                   2425:      case i_UNPK:
                   2426:        if (table68k[opcode].smode == Dreg) {
1.1.1.3   root     2427:            printf ("\tuae_u16 val = m68k_dreg(regs, srcreg);\n");
1.1.1.5 ! root     2428:            printf ("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + %s;\n", gen_nextiword ());
1.1.1.3   root     2429:            printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffff0000) | (val & 0xffff);\n");
                   2430:        } else {
                   2431:            printf ("\tuae_u16 val;\n");
                   2432:            printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
                   2433:            printf ("\tval = (uae_u16)get_byte(m68k_areg(regs, srcreg));\n");
1.1.1.5 ! root     2434:            printf ("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + %s;\n", gen_nextiword ());
1.1.1.3   root     2435:            printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
                   2436:            printf ("\tput_byte(m68k_areg(regs, dstreg),val);\n");
                   2437:            printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
                   2438:            printf ("\tput_byte(m68k_areg(regs, dstreg),val >> 8);\n");
1.1       root     2439:        }
                   2440:        break;
                   2441:      case i_TAS:
1.1.1.3   root     2442:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.5 ! root     2443:        flush_amodes ();
        !          2444:        genflags (flag_logical, table68k[opcode].size, "src", "", "");
1.1.1.3   root     2445:        printf ("\tsrc |= 0x80;\n");
                   2446:        genastore ("src", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     2447:        break;
                   2448:      case i_FPP:
                   2449:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.5 ! root     2450:        flush_amodes ();
        !          2451:        sync_m68k_pc ();
1.1.1.3   root     2452:        printf ("\tfpp_opp(opcode,extra);\n");
1.1       root     2453:        break;
                   2454:      case i_FDBcc:
                   2455:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.5 ! root     2456:        flush_amodes ();
        !          2457:        sync_m68k_pc ();
1.1.1.3   root     2458:        printf ("\tfdbcc_opp(opcode,extra);\n");
1.1       root     2459:        break;
                   2460:      case i_FScc:
                   2461:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.5 ! root     2462:        flush_amodes ();
        !          2463:        sync_m68k_pc ();
1.1.1.3   root     2464:        printf ("\tfscc_opp(opcode,extra);\n");
1.1       root     2465:        break;
                   2466:      case i_FTRAPcc:
1.1.1.5 ! root     2467:        sync_m68k_pc ();
        !          2468:        start_brace ();
1.1.1.3   root     2469:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
1.1       root     2470:        if (table68k[opcode].smode != am_unknown && table68k[opcode].smode != am_illg)
                   2471:            genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "dummy", 1, 0);
1.1.1.5 ! root     2472:        flush_amodes ();
        !          2473:        sync_m68k_pc ();
1.1.1.3   root     2474:        printf ("\tftrapcc_opp(opcode,oldpc);\n");
1.1       root     2475:        break;
                   2476:      case i_FBcc:
1.1.1.5 ! root     2477:        sync_m68k_pc ();
        !          2478:        start_brace ();
1.1.1.3   root     2479:        printf ("\tuaecptr pc = m68k_getpc();\n");
1.1       root     2480:        genamode (table68k[opcode].dmode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.5 ! root     2481:        flush_amodes ();
        !          2482:        sync_m68k_pc ();
1.1.1.3   root     2483:        printf ("\tfbcc_opp(opcode,pc,extra);\n");
1.1       root     2484:        break;
                   2485:      case i_FSAVE:
1.1.1.5 ! root     2486:        sync_m68k_pc ();
1.1.1.3   root     2487:        printf ("\tfsave_opp(opcode);\n");
1.1       root     2488:        break;
                   2489:      case i_FRESTORE:
1.1.1.5 ! root     2490:        sync_m68k_pc ();
1.1.1.3   root     2491:        printf ("\tfrestore_opp(opcode);\n");
1.1       root     2492:        break;
                   2493:      case i_MMUOP:
                   2494:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.5 ! root     2495:        flush_amodes ();
        !          2496:        sync_m68k_pc ();
1.1.1.3   root     2497:        printf ("\tmmu_op(opcode,extra);\n");
1.1       root     2498:        break;
                   2499:      default:
1.1.1.5 ! root     2500:        abort ();
1.1       root     2501:        break;
1.1.1.5 ! root     2502:     }
1.1       root     2503:     finish_braces ();
1.1.1.3   root     2504:     sync_m68k_pc ();
1.1       root     2505: }
                   2506: 
1.1.1.5 ! root     2507: static void generate_includes (FILE * f)
1.1.1.3   root     2508: {
                   2509:     fprintf (f, "#include \"sysconfig.h\"\n");
                   2510:     fprintf (f, "#include \"sysdeps.h\"\n");
                   2511:     fprintf (f, "#include \"config.h\"\n");
                   2512:     fprintf (f, "#include \"options.h\"\n");
                   2513:     fprintf (f, "#include \"machdep/m68k.h\"\n");
                   2514:     fprintf (f, "#include \"memory.h\"\n");
                   2515:     fprintf (f, "#include \"custom.h\"\n");
                   2516:     fprintf (f, "#include \"readcpu.h\"\n");
                   2517:     fprintf (f, "#include \"newcpu.h\"\n");
                   2518:     fprintf (f, "#include \"compiler.h\"\n");
                   2519:     fprintf (f, "#include \"cputbl.h\"\n");
                   2520: }
                   2521: 
                   2522: static int postfix;
                   2523: 
                   2524: static void generate_one_opcode (int rp)
1.1       root     2525: {
                   2526:     int i;
1.1.1.3   root     2527:     uae_u16 smsk, dmsk;
                   2528:     long int opcode = opcode_map[rp];
1.1       root     2529: 
1.1.1.3   root     2530:     if (table68k[opcode].mnemo == i_ILLG
                   2531:        || table68k[opcode].clev > cpu_level)
                   2532:        return;
1.1       root     2533: 
1.1.1.5 ! root     2534:     for (i = 0; lookuptab[i].name[0]; i++) {
1.1.1.3   root     2535:        if (table68k[opcode].mnemo == lookuptab[i].mnemo)
                   2536:            break;
                   2537:     }
1.1       root     2538: 
1.1.1.3   root     2539:     if (table68k[opcode].handler != -1)
                   2540:        return;
1.1       root     2541: 
1.1.1.3   root     2542:     if (opcode_next_clev[rp] != cpu_level) {
                   2543:        fprintf (stblfile, "{ op_%lx_%d, 0, %ld }, /* %s */\n", opcode, opcode_last_postfix[rp],
                   2544:                 opcode, lookuptab[i].name);
                   2545:        return;
                   2546:     }
                   2547:     fprintf (stblfile, "{ op_%lx_%d, 0, %ld }, /* %s */\n", opcode, postfix, opcode, lookuptab[i].name);
                   2548:     fprintf (headerfile, "extern cpuop_func op_%lx_%d;\n", opcode, postfix);
1.1.1.5 ! root     2549:     printf ("unsigned long REGPARAM2 op_%lx_%d(uae_u32 opcode) /* %s */\n{\n", opcode, postfix, lookuptab[i].name);
1.1.1.3   root     2550: 
                   2551:     switch (table68k[opcode].stype) {
                   2552:      case 0: smsk = 7; break;
                   2553:      case 1: smsk = 255; break;
                   2554:      case 2: smsk = 15; break;
                   2555:      case 3: smsk = 7; break;
                   2556:      case 4: smsk = 7; break;
                   2557:      case 5: smsk = 63; break;
1.1.1.5 ! root     2558:      default: abort ();
1.1.1.3   root     2559:     }
                   2560:     dmsk = 7;
                   2561: 
                   2562:     next_cpu_level = -1;
                   2563:     if (table68k[opcode].suse
1.1.1.5 ! root     2564:        && table68k[opcode].smode != imm && table68k[opcode].smode != imm0
1.1.1.3   root     2565:        && table68k[opcode].smode != imm1 && table68k[opcode].smode != imm2
                   2566:        && table68k[opcode].smode != absw && table68k[opcode].smode != absl
                   2567:        && table68k[opcode].smode != PC8r && table68k[opcode].smode != PC16)
                   2568:     {
                   2569:        if (table68k[opcode].spos == -1) {
1.1.1.5 ! root     2570:            if (((int) table68k[opcode].sreg) >= 128)
        !          2571:                printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%d;\n", (int) table68k[opcode].sreg);
1.1.1.3   root     2572:            else
1.1.1.5 ! root     2573:                printf ("\tuae_u32 srcreg = %d;\n", (int) table68k[opcode].sreg);
1.1.1.3   root     2574:        } else {
                   2575:            char source[100];
1.1.1.5 ! root     2576: 
        !          2577:            /* Check that we can do the little endian optimization safely.  */
        !          2578:            if (table68k[opcode].spos < 8 && (smsk << table68k[opcode].spos) > 255)
        !          2579:                abort ();
1.1.1.3   root     2580:            
1.1.1.5 ! root     2581:            printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n");
        !          2582: 
        !          2583:            if (table68k[opcode].spos != 8)
        !          2584:                sprintf (source, "((opcode >> %d) & %d)", (int) table68k[opcode].spos ^ 8, smsk);
        !          2585:            else
        !          2586:                sprintf (source, "(opcode & %d)", smsk);
        !          2587: 
        !          2588:            if (table68k[opcode].stype == 3)
        !          2589:                printf ("\tuae_u32 srcreg = imm8_table[%s];\n", source);
        !          2590:            else if (table68k[opcode].stype == 1)
        !          2591:                printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%s;\n", source);
        !          2592:            else
        !          2593:                printf ("\tuae_u32 srcreg = %s;\n", source);
        !          2594: 
        !          2595:            printf ("#else\n");
        !          2596: 
1.1.1.3   root     2597:            if (table68k[opcode].spos)
1.1.1.5 ! root     2598:                sprintf (source, "((opcode >> %d) & %d)", (int) table68k[opcode].spos, smsk);
1.1.1.3   root     2599:            else
1.1.1.5 ! root     2600:                sprintf (source, "(opcode & %d)", smsk);
        !          2601: 
1.1.1.3   root     2602:            if (table68k[opcode].stype == 3)
                   2603:                printf ("\tuae_u32 srcreg = imm8_table[%s];\n", source);
                   2604:            else if (table68k[opcode].stype == 1)
                   2605:                printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%s;\n", source);
                   2606:            else
                   2607:                printf ("\tuae_u32 srcreg = %s;\n", source);
1.1.1.5 ! root     2608: 
        !          2609:            printf ("#endif\n");
1.1       root     2610:        }
1.1.1.3   root     2611:     }
                   2612:     if (table68k[opcode].duse
                   2613:        /* Yes, the dmode can be imm, in case of LINK or DBcc */
1.1.1.5 ! root     2614:        && table68k[opcode].dmode != imm && table68k[opcode].dmode != imm0
1.1.1.3   root     2615:        && table68k[opcode].dmode != imm1 && table68k[opcode].dmode != imm2
1.1.1.5 ! root     2616:        && table68k[opcode].dmode != absw && table68k[opcode].dmode != absl)
        !          2617:     {
1.1.1.3   root     2618:        if (table68k[opcode].dpos == -1) {
1.1.1.5 ! root     2619:            if (((int) table68k[opcode].dreg) >= 128)
        !          2620:                printf ("\tuae_u32 dstreg = (uae_s32)(uae_s8)%d;\n", (int) table68k[opcode].dreg);
1.1.1.3   root     2621:            else
1.1.1.5 ! root     2622:                printf ("\tuae_u32 dstreg = %d;\n", (int) table68k[opcode].dreg);
1.1.1.3   root     2623:        } else {
1.1.1.5 ! root     2624:            int pos = table68k[opcode].dpos;
        !          2625:            /* Check that we can do the little endian optimization safely.  */
        !          2626:            if (pos < 8 && (dmsk << pos) > 255)
        !          2627:                abort ();
        !          2628:            
        !          2629:            printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n");
        !          2630: 
        !          2631:            if (pos != 8)
        !          2632:                printf ("\tuae_u32 dstreg = (opcode >> %d) & %d;\n",
        !          2633:                        pos ^ 8, dmsk);
        !          2634:            else
        !          2635:                printf ("\tuae_u32 dstreg = opcode & %d;\n", dmsk);
        !          2636: 
        !          2637:            printf ("#else\n");
        !          2638: 
        !          2639:            if (pos)
1.1.1.3   root     2640:                printf ("\tuae_u32 dstreg = (opcode >> %d) & %d;\n",
1.1.1.5 ! root     2641:                        pos, dmsk);
1.1.1.3   root     2642:            else
                   2643:                printf ("\tuae_u32 dstreg = opcode & %d;\n", dmsk);
1.1.1.5 ! root     2644: 
        !          2645:            printf ("#endif\n");
1.1       root     2646:        }
                   2647:     }
1.1.1.5 ! root     2648:     need_endlabel = 0;
1.1.1.3   root     2649:     endlabelno++;
                   2650:     sprintf (endlabelstr, "endlabel%d", endlabelno);
                   2651:     gen_opcode (opcode);
1.1.1.5 ! root     2652:     if (need_endlabel)
        !          2653:        printf ("%s: (void)0;\n", endlabelstr);
        !          2654:     printf ("return %d;\n", insn_n_cycles);
1.1.1.3   root     2655:     printf ("}\n");
                   2656:     opcode_next_clev[rp] = next_cpu_level;
                   2657:     opcode_last_postfix[rp] = postfix;
1.1       root     2658: }
                   2659: 
1.1.1.3   root     2660: static void generate_func (void)
1.1       root     2661: {
1.1.1.5 ! root     2662:     int i, j, rp;
1.1       root     2663: 
1.1.1.3   root     2664:     using_prefetch = 0;
                   2665:     using_exception_3 = 0;
                   2666:     for (i = 0; i < 5; i++) {
                   2667:        cpu_level = 3 - i;
                   2668:        if (i == 4) {
                   2669:            cpu_level = 0;
                   2670:            using_prefetch = 1;
                   2671:            using_exception_3 = 1;
                   2672:            for (rp = 0; rp < nr_cpuop_funcs; rp++)
                   2673:                opcode_next_clev[rp] = 0;
                   2674:        }
                   2675:        postfix = i;
                   2676:        fprintf (stblfile, "struct cputbl op_smalltbl_%d[] = {\n", postfix);
                   2677: 
1.1.1.5 ! root     2678:        /* sam: this is for people with low memory (eg. me :)) */
        !          2679:        printf ("\n"
        !          2680:                 "#if !defined(PART_1) && !defined(PART_2) && "
        !          2681:                    "!defined(PART_3) && !defined(PART_4) && "
        !          2682:                    "!defined(PART_5) && !defined(PART_6) && "
        !          2683:                    "!defined(PART_7) && !defined(PART_8)"
        !          2684:                "\n"
        !          2685:                "#define PART_1 1\n"
        !          2686:                "#define PART_2 1\n"
        !          2687:                "#define PART_3 1\n"
        !          2688:                "#define PART_4 1\n"
        !          2689:                "#define PART_5 1\n"
        !          2690:                "#define PART_6 1\n"
        !          2691:                "#define PART_7 1\n"
        !          2692:                "#define PART_8 1\n"
        !          2693:                "#endif\n\n");
        !          2694:        
        !          2695:        rp = 0;
        !          2696:        for(j=1;j<=8;++j) {
        !          2697:                int k = (j*nr_cpuop_funcs)/8;
        !          2698:                printf ("#ifdef PART_%d\n",j);
        !          2699:                for (; rp < k; rp++)
        !          2700:                   generate_one_opcode (rp);
        !          2701:                printf ("#endif\n\n");
        !          2702:        }
        !          2703: 
1.1.1.3   root     2704:        fprintf (stblfile, "{ 0, 0, 0 }};\n");
1.1       root     2705:     }
                   2706: 
                   2707: }
                   2708: 
1.1.1.3   root     2709: int main (int argc, char **argv)
1.1.1.5 ! root     2710: {
1.1       root     2711:     read_table68k ();
                   2712:     do_merges ();
1.1.1.3   root     2713: 
1.1.1.5 ! root     2714:     opcode_map = (int *) xmalloc (sizeof (int) * nr_cpuop_funcs);
        !          2715:     opcode_last_postfix = (int *) xmalloc (sizeof (int) * nr_cpuop_funcs);
        !          2716:     opcode_next_clev = (int *) xmalloc (sizeof (int) * nr_cpuop_funcs);
        !          2717:     counts = (unsigned long *) xmalloc (65536 * sizeof (unsigned long));
        !          2718:     read_counts ();
1.1.1.3   root     2719: 
                   2720:     /* It would be a lot nicer to put all in one file (we'd also get rid of
                   2721:      * cputbl.h that way), but cpuopti can't cope.  That could be fixed, but
                   2722:      * I don't dare to touch the 68k version.  */
1.1.1.5 ! root     2723: 
1.1.1.3   root     2724:     headerfile = fopen ("cputbl.h", "wb");
                   2725:     stblfile = fopen ("cpustbl.c", "wb");
                   2726:     freopen ("cpuemu.c", "wb", stdout);
                   2727: 
                   2728:     generate_includes (stdout);
                   2729:     generate_includes (stblfile);
                   2730: 
                   2731:     generate_func ();
                   2732: 
                   2733:     free (table68k);
1.1       root     2734:     return 0;
                   2735: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.