--- uae/src/gencpu.c 2018/04/24 16:41:56 1.1.1.5 +++ uae/src/gencpu.c 2018/04/24 16:44:39 1.1.1.6 @@ -48,15 +48,6 @@ static int *opcode_next_clev; static int *opcode_last_postfix; static unsigned long *counts; -struct amode_queue -{ - struct amode_queue *next; - char *buf; - unsigned int done:1; -}; - -static struct amode_queue *aq_head; - static void read_counts (void) { FILE *file; @@ -204,89 +195,15 @@ static void fill_prefetch_2 (void) printf ("fill_prefetch_2 ();\n"); } -/* To allow the compiler to generate better code, we try to pre-schedule - * the C code we generate to put addressing mode generation code that is - * likely to require many registers earlier than code that is likely to - * use fewer registers. */ - -#define DO_QUEUEING 1 - - -#if __GNUC__ - 1 > 1 || __GNUC_MINOR__ - 1 > 6 -static void queue_amode (const char *, ...) __attribute__ ((format (printf, 1, 2))); -#endif - -static void queue_amode (const char *fmt, ...) -{ - char buf[160]; - struct amode_queue *prev, **aqp; - va_list ap; - va_start (ap, fmt); - -#if DO_QUEUEING -#ifdef HAVE_VSPRINTF - vsprintf (buf, fmt, ap); -#else - { - int x1, x2, x3, x4, x5, x6, x7, x8; - x1 = va_arg (ap, int); - x2 = va_arg (ap, int); - x3 = va_arg (ap, int); - x4 = va_arg (ap, int); - x5 = va_arg (ap, int); - x6 = va_arg (ap, int); - x7 = va_arg (ap, int); - x8 = va_arg (ap, int); - sprintf (buf, fmt, x1, x2, x3, x4, x5, x6, x7, x8); - } -#endif - aqp = &aq_head; - prev = 0; - while (*aqp != 0) - prev = *aqp, aqp = &(*aqp)->next; - if (prev != 0 && ! prev->done) { - char *tmpbuf = prev->buf; - prev->buf = (char *) xmalloc (strlen (tmpbuf) + strlen (buf) + 1); - strcpy (prev->buf, tmpbuf); - strcat (prev->buf, buf); - } else { - struct amode_queue *tmp = (struct amode_queue *) xmalloc (sizeof *tmp); - tmp->next = 0; - tmp->buf = my_strdup (buf); - *aqp = tmp; - } -#else - start_brace (); - vprintf (fmt, ap); -#endif -} - -static void done_queue (void) +static void swap_opcode (void) { - struct amode_queue *prev, **aqp; - aqp = &aq_head; - prev = 0; - while (*aqp != 0) - prev = *aqp, aqp = &(*aqp)->next; - if (prev) - prev->done = 1; -} - -static void flush_amodes (void) -{ - while (aq_head != 0) { - struct amode_queue *q = aq_head; - aq_head = q->next; - start_brace (); - printf (q->buf); - free (q->buf); - free (q); - } + printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n"); + printf ("\topcode = ((opcode << 8) & 0xFF00) | ((opcode >> 8) & 0xFF);\n"); + printf ("#endif\n"); } static void sync_m68k_pc (void) { - flush_amodes (); if (m68k_pc_offset == 0) return; printf ("m68k_incpc(%d);\n", m68k_pc_offset); @@ -308,13 +225,11 @@ static void sync_m68k_pc (void) * the calling routine handles Apdi and Aipi modes. */ static void genamode (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem) { - int queued = 0; - + start_brace (); switch (mode) { case Dreg: if (movem) abort (); - start_brace (); if (getv == 1) switch (size) { case sz_byte: @@ -343,7 +258,6 @@ static void genamode (amodes mode, char case Areg: if (movem) abort (); - start_brace (); if (getv == 1) switch (size) { case sz_word: @@ -357,15 +271,12 @@ static void genamode (amodes mode, char } return; case Aind: - start_brace (); printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg); break; case Aipi: - start_brace (); printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg); break; case Apdi: - start_brace (); switch (size) { case sz_byte: if (movem) @@ -384,7 +295,6 @@ static void genamode (amodes mode, char } break; case Ad16: - start_brace (); printf ("\tuaecptr %sa = m68k_areg(regs, %s) + (uae_s32)(uae_s16)%s;\n", name, reg, gen_nextiword ()); break; case Ad8r: @@ -394,52 +304,46 @@ static void genamode (amodes mode, char sync_m68k_pc (); start_brace (); printf ("\tuaecptr %sa = get_disp_ea_020(m68k_areg(regs, %s), next_iword());\n", name, reg); - } else { - start_brace (); + } else printf ("\tuaecptr %sa = get_disp_ea_000(m68k_areg(regs, %s), %s);\n", name, reg, gen_nextiword ()); - } + break; case PC16: - queue_amode ("\tuaecptr %sa = m68k_getpc () + %d;\n", name, m68k_pc_offset); - queue_amode ("\t%sa += (uae_s32)(uae_s16)%s;\n", name, gen_nextiword ()); - queued = 1; + printf ("\tuaecptr %sa = m68k_getpc () + %d;\n", name, m68k_pc_offset); + printf ("\t%sa += (uae_s32)(uae_s16)%s;\n", name, gen_nextiword ()); break; case PC8r: if (cpu_level > 1) { if (next_cpu_level < 1) next_cpu_level = 1; - flush_amodes (); sync_m68k_pc (); start_brace (); printf ("\tuaecptr tmppc = m68k_getpc();\n"); printf ("\tuaecptr %sa = get_disp_ea_020(tmppc, next_iword());\n", name); } else { - queue_amode ("\tuaecptr tmppc = m68k_getpc() + %d;\n", m68k_pc_offset); - queue_amode ("\tuaecptr %sa = get_disp_ea_000(tmppc, %s);\n", name, gen_nextiword ()); - queued = 1; + printf ("\tuaecptr tmppc = m68k_getpc() + %d;\n", m68k_pc_offset); + printf ("\tuaecptr %sa = get_disp_ea_000(tmppc, %s);\n", name, gen_nextiword ()); } break; case absw: - queue_amode ("\tuaecptr %sa = (uae_s32)(uae_s16)%s;\n", name, gen_nextiword ()); - queued = 1; + printf ("\tuaecptr %sa = (uae_s32)(uae_s16)%s;\n", name, gen_nextiword ()); break; case absl: - queue_amode ("\tuaecptr %sa = %s;\n", name, gen_nextilong ()); - queued = 1; + printf ("\tuaecptr %sa = %s;\n", name, gen_nextilong ()); break; case imm: if (getv != 1) abort (); switch (size) { case sz_byte: - queue_amode ("\tuae_s8 %s = %s;\n", name, gen_nextibyte ()); + printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte ()); break; case sz_word: - queue_amode ("\tuae_s16 %s = %s;\n", name, gen_nextiword ()); + printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword ()); break; case sz_long: - queue_amode ("\tuae_s32 %s = %s;\n", name, gen_nextilong ()); + printf ("\tuae_s32 %s = %s;\n", name, gen_nextilong ()); break; default: abort (); @@ -448,17 +352,17 @@ static void genamode (amodes mode, char case imm0: if (getv != 1) abort (); - queue_amode ("\tuae_s8 %s = %s;\n", name, gen_nextibyte ()); + printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte ()); return; case imm1: if (getv != 1) abort (); - queue_amode ("\tuae_s16 %s = %s;\n", name, gen_nextiword ()); + printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword ()); return; case imm2: if (getv != 1) abort (); - queue_amode ("\tuae_s32 %s = %s;\n", name, gen_nextilong ()); + printf ("\tuae_s32 %s = %s;\n", name, gen_nextilong ()); return; case immi: if (getv != 1) @@ -469,18 +373,10 @@ static void genamode (amodes mode, char abort (); } - if (queued) - done_queue (); - /* We get here for all non-reg non-immediate addressing modes to * actually fetch the value. */ - if (using_exception_3 && getv != 0 && size != sz_byte) { - if (queued) { - flush_amodes (); - queued = 0; - } - + if (using_exception_3 && getv != 0 && size != sz_byte) { printf ("\tif ((%sa & 1) != 0) {\n", name); printf ("\t\tlast_fault_for_exception_3 = %sa;\n", name); printf ("\t\tlast_op_for_exception_3 = opcode;\n"); @@ -491,13 +387,28 @@ static void genamode (amodes mode, char need_endlabel = 1; start_brace (); } + + if (getv == 1) { + switch (size) { + case sz_byte: insn_n_cycles += 2; break; + case sz_word: insn_n_cycles += 2; break; + case sz_long: insn_n_cycles += 4; break; + default: abort (); + } + start_brace (); + switch (size) { + case sz_byte: printf ("\tuae_s8 %s = get_byte(%sa);\n", name, name); break; + case sz_word: printf ("\tuae_s16 %s = get_word(%sa);\n", name, name); break; + case sz_long: printf ("\tuae_s32 %s = get_long(%sa);\n", name, name); break; + default: abort (); + } + } + /* We now might have to fix up the register for pre-dec or post-inc * addressing modes. */ if (!movem) switch (mode) { case Aipi: - if (queued) - abort (); switch (size) { case sz_byte: printf ("\tm68k_areg(regs, %s) += areg_byteinc[%s];\n", reg, reg); @@ -513,37 +424,11 @@ static void genamode (amodes mode, char } break; case Apdi: - if (queued) - abort (); printf ("\tm68k_areg (regs, %s) = %sa;\n", reg, name); break; default: break; } - if (getv == 1) { - switch (size) { - case sz_byte: insn_n_cycles += 2; break; - case sz_word: insn_n_cycles += 2; break; - case sz_long: insn_n_cycles += 4; break; - default: abort (); - } - if (queued) - switch (size) { - case sz_byte: queue_amode ("\tuae_s8 %s = get_byte(%sa);\n", name, name); break; - case sz_word: queue_amode ("\tuae_s16 %s = get_word(%sa);\n", name, name); break; - case sz_long: queue_amode ("\tuae_s32 %s = get_long(%sa);\n", name, name); break; - default: abort (); - } - else { - start_brace (); - switch (size) { - case sz_byte: printf ("\tuae_s8 %s = get_byte(%sa);\n", name, name); break; - case sz_word: printf ("\tuae_s16 %s = get_word(%sa);\n", name, name); break; - case sz_long: printf ("\tuae_s32 %s = get_long(%sa);\n", name, name); break; - default: abort (); - } - } - } } static void genastore (char *from, amodes mode, char *reg, wordsizes size, char *to) @@ -635,7 +520,6 @@ static void genmovemel (uae_u16 opcode) printf ("\tuae_u16 mask = %s;\n", gen_nextiword ()); printf ("\tunsigned int dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n"); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, 1); - flush_amodes (); start_brace (); printf ("\twhile (dmask) { m68k_dreg(regs, movem_index1[dmask]) = %s; srca += %d; dmask = movem_next[dmask]; }\n", getcode, size); @@ -658,7 +542,6 @@ static void genmovemle (uae_u16 opcode) printf ("\tuae_u16 mask = %s;\n", gen_nextiword ()); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, 1); - flush_amodes (); if (using_prefetch) sync_m68k_pc (); @@ -1062,7 +945,6 @@ static void genflags (flagtypes type, wo static void gen_opcode (unsigned long int opcode) { - aq_head = 0; insn_n_cycles = 2; start_brace (); @@ -1097,7 +979,6 @@ static void gen_opcode (unsigned long in case i_OR: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); printf ("\tsrc |= dst;\n"); genflags (flag_logical, table68k[opcode].size, "src", "", ""); genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); @@ -1105,7 +986,6 @@ static void gen_opcode (unsigned long in case i_AND: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); printf ("\tsrc &= dst;\n"); genflags (flag_logical, table68k[opcode].size, "src", "", ""); genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); @@ -1113,7 +993,6 @@ static void gen_opcode (unsigned long in case i_EOR: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); printf ("\tsrc ^= dst;\n"); genflags (flag_logical, table68k[opcode].size, "src", "", ""); genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); @@ -1121,7 +1000,6 @@ static void gen_opcode (unsigned long in case i_ORSR: printf ("\tMakeSR();\n"); genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); if (table68k[opcode].size == sz_byte) { printf ("\tsrc &= 0xFF;\n"); } @@ -1131,7 +1009,6 @@ static void gen_opcode (unsigned long in case i_ANDSR: printf ("\tMakeSR();\n"); genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); if (table68k[opcode].size == sz_byte) { printf ("\tsrc |= 0xFF00;\n"); } @@ -1141,7 +1018,6 @@ static void gen_opcode (unsigned long in case i_EORSR: printf ("\tMakeSR();\n"); genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); if (table68k[opcode].size == sz_byte) { printf ("\tsrc &= 0xFF;\n"); } @@ -1151,7 +1027,6 @@ static void gen_opcode (unsigned long in case i_SUB: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); start_brace (); genflags (flag_sub, table68k[opcode].size, "newv", "src", "dst"); genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); @@ -1159,7 +1034,6 @@ static void gen_opcode (unsigned long in case i_SUBA: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u32 newv = dst - src;\n"); genastore ("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst"); @@ -1167,7 +1041,6 @@ static void gen_opcode (unsigned long in case i_SUBX: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u32 newv = dst - src - (XFLG ? 1 : 0);\n"); genflags (flag_subx, table68k[opcode].size, "newv", "src", "dst"); @@ -1178,7 +1051,6 @@ static void gen_opcode (unsigned long in /* Let's hope this works... */ genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u16 newv_lo = (dst & 0xF) - (src & 0xF) - (XFLG ? 1 : 0);\n"); printf ("\tuae_u16 newv_hi = (dst & 0xF0) - (src & 0xF0);\n"); @@ -1194,7 +1066,6 @@ static void gen_opcode (unsigned long in case i_ADD: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); start_brace (); genflags (flag_add, table68k[opcode].size, "newv", "src", "dst"); genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); @@ -1202,7 +1073,6 @@ static void gen_opcode (unsigned long in case i_ADDA: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u32 newv = dst + src;\n"); genastore ("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst"); @@ -1210,7 +1080,6 @@ static void gen_opcode (unsigned long in case i_ADDX: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u32 newv = dst + src + (XFLG ? 1 : 0);\n"); genflags (flag_addx, table68k[opcode].size, "newv", "src", "dst"); @@ -1220,7 +1089,6 @@ static void gen_opcode (unsigned long in case i_ABCD: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u16 newv_lo = (src & 0xF) + (dst & 0xF) + (XFLG ? 1 : 0);\n"); printf ("\tuae_u16 newv_hi = (src & 0xF0) + (dst & 0xF0);\n"); @@ -1235,14 +1103,12 @@ static void gen_opcode (unsigned long in break; case i_NEG: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); start_brace (); genflags (flag_sub, table68k[opcode].size, "dst", "src", "0"); genastore ("dst", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_NEGX: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u32 newv = 0 - src - (XFLG ? 1 : 0);\n"); genflags (flag_subx, table68k[opcode].size, "newv", "src", "0"); @@ -1251,7 +1117,6 @@ static void gen_opcode (unsigned long in break; case i_NBCD: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u16 newv_lo = - (src & 0xF) - (XFLG ? 1 : 0);\n"); printf ("\tuae_u16 newv_hi = - (src & 0xF0);\n"); @@ -1265,13 +1130,11 @@ static void gen_opcode (unsigned long in break; case i_CLR: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 2, 0); - flush_amodes (); genflags (flag_logical, table68k[opcode].size, "0", "", ""); genastore ("0", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_NOT: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u32 dst = ~src;\n"); genflags (flag_logical, table68k[opcode].size, "dst", "", ""); @@ -1279,13 +1142,11 @@ static void gen_opcode (unsigned long in break; case i_TST: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); genflags (flag_logical, table68k[opcode].size, "src", "", ""); break; case i_BTST: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); if (table68k[opcode].size == sz_byte) printf ("\tsrc &= 7;\n"); else @@ -1295,7 +1156,6 @@ static void gen_opcode (unsigned long in case i_BCHG: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); if (table68k[opcode].size == sz_byte) printf ("\tsrc &= 7;\n"); else @@ -1307,7 +1167,6 @@ static void gen_opcode (unsigned long in case i_BCLR: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); if (table68k[opcode].size == sz_byte) printf ("\tsrc &= 7;\n"); else @@ -1319,7 +1178,6 @@ static void gen_opcode (unsigned long in case i_BSET: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); if (table68k[opcode].size == sz_byte) printf ("\tsrc &= 7;\n"); else @@ -1332,14 +1190,12 @@ static void gen_opcode (unsigned long in case i_CMP: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); start_brace (); genflags (flag_cmp, table68k[opcode].size, "newv", "src", "dst"); break; case i_CMPA: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0); - flush_amodes (); start_brace (); genflags (flag_cmp, sz_long, "newv", "src", "dst"); break; @@ -1347,7 +1203,6 @@ static void gen_opcode (unsigned long in * weird things... */ case i_MVPRM: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); printf ("\tuaecptr memp = m68k_areg(regs, dstreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword ()); if (table68k[opcode].size == sz_word) { @@ -1360,7 +1215,6 @@ static void gen_opcode (unsigned long in case i_MVPMR: printf ("\tuaecptr memp = m68k_areg(regs, srcreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword ()); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0); - flush_amodes (); if (table68k[opcode].size == sz_word) { printf ("\tuae_u16 val = (get_byte(memp) << 8) + get_byte(memp + 2);\n"); } else { @@ -1372,14 +1226,12 @@ static void gen_opcode (unsigned long in case i_MOVE: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0); - flush_amodes (); genflags (flag_logical, table68k[opcode].size, "src", "", ""); genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_MOVEA: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0); - flush_amodes (); if (table68k[opcode].size == sz_word) { printf ("\tuae_u32 val = (uae_s32)(uae_s16)src;\n"); } else { @@ -1389,7 +1241,6 @@ static void gen_opcode (unsigned long in break; case i_MVSR2: genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 2, 0); - flush_amodes (); printf ("\tMakeSR();\n"); if (table68k[opcode].size == sz_byte) genastore ("regs.sr & 0xff", table68k[opcode].smode, "srcreg", sz_word, "src"); @@ -1398,7 +1249,6 @@ static void gen_opcode (unsigned long in break; case i_MV2SR: genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0); - flush_amodes (); if (table68k[opcode].size == sz_byte) printf ("\tMakeSR();\n\tregs.sr &= 0xFF00;\n\tregs.sr |= src & 0xFF;\n"); else { @@ -1408,7 +1258,6 @@ static void gen_opcode (unsigned long in break; case i_SWAP: genamode (table68k[opcode].smode, "srcreg", sz_long, "src", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u32 dst = ((src >> 16)&0xFFFF) | ((src&0xFFFF)<<16);\n"); genflags (flag_logical, sz_long, "dst", "", ""); @@ -1417,13 +1266,11 @@ static void gen_opcode (unsigned long in case i_EXG: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); genastore ("dst", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_EXT: genamode (table68k[opcode].smode, "srcreg", sz_long, "src", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u32 dst = (uae_s32)(uae_s8)src;\n"); break; @@ -1444,19 +1291,16 @@ static void gen_opcode (unsigned long in break; case i_TRAP: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); sync_m68k_pc (); printf ("\tException(src+32,0);\n"); m68k_pc_offset = 0; break; case i_MVR2USP: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); printf ("\tregs.usp = src;\n"); break; case i_MVUSP2R: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 2, 0); - flush_amodes (); genastore ("regs.usp", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_RESET: @@ -1466,7 +1310,6 @@ static void gen_opcode (unsigned long in break; case i_STOP: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); printf ("\tregs.sr = src;\n"); printf ("\tMakeFromSR();\n"); printf ("\tm68k_setstopped(1);\n"); @@ -1475,7 +1318,6 @@ static void gen_opcode (unsigned long in if (cpu_level == 0) { genamode (Aipi, "7", sz_word, "sr", 1, 0); genamode (Aipi, "7", sz_long, "pc", 1, 0); - flush_amodes (); printf ("\tregs.sr = sr; m68k_setpc_rte(pc);\n"); fill_prefetch_0 (); printf ("\tMakeFromSR();\n"); @@ -1487,7 +1329,6 @@ static void gen_opcode (unsigned long in genamode (Aipi, "7", sz_word, "sr", 1, 0); genamode (Aipi, "7", sz_long, "pc", 1, 0); genamode (Aipi, "7", sz_word, "format", 1, 0); - flush_amodes (); printf ("\tnewsr = sr; newpc = pc;\n"); printf ("\tif ((format & 0xF000) == 0x0000) { break; }\n"); printf ("\telse if ((format & 0xF000) == 0x1000) { ; }\n"); @@ -1511,7 +1352,6 @@ static void gen_opcode (unsigned long in printf ("\tcompiler_flush_jsr_stack();\n"); genamode (Aipi, "7", sz_long, "pc", 1, 0); genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "offs", 1, 0); - flush_amodes (); printf ("\tm68k_areg(regs, 7) += offs;\n"); printf ("\tm68k_setpc_rte(pc);\n"); fill_prefetch_0 (); @@ -1521,19 +1361,15 @@ static void gen_opcode (unsigned long in case i_LINK: genamode (Apdi, "7", sz_long, "old", 2, 0); genamode (table68k[opcode].smode, "srcreg", sz_long, "src", 1, 0); - flush_amodes (); genastore ("src", Apdi, "7", sz_long, "old"); genastore ("m68k_areg(regs, 7)", table68k[opcode].smode, "srcreg", sz_long, "src"); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "offs", 1, 0); - flush_amodes (); printf ("\tm68k_areg(regs, 7) += offs;\n"); break; case i_UNLK: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); printf ("\tm68k_areg(regs, 7) = src;\n"); genamode (Aipi, "7", sz_long, "old", 1, 0); - flush_amodes (); genastore ("old", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_RTS: @@ -1551,7 +1387,6 @@ static void gen_opcode (unsigned long in printf ("\tMakeSR();\n"); genamode (Aipi, "7", sz_word, "sr", 1, 0); genamode (Aipi, "7", sz_long, "pc", 1, 0); - flush_amodes (); printf ("\tregs.sr &= 0xFF00; sr &= 0xFF;\n"); printf ("\tregs.sr |= sr; m68k_setpc(pc);\n"); fill_prefetch_0 (); @@ -1560,21 +1395,18 @@ static void gen_opcode (unsigned long in break; case i_JSR: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); - flush_amodes (); printf ("\tm68k_do_jsr(m68k_getpc() + %d, srca);\n", m68k_pc_offset); fill_prefetch_0 (); m68k_pc_offset = 0; break; case i_JMP: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); - flush_amodes (); printf ("\tm68k_setpc(srca);\n"); fill_prefetch_0 (); m68k_pc_offset = 0; break; case i_BSR: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); printf ("\tuae_s32 s = (uae_s32)src + 2;\n"); if (using_exception_3) { printf ("\tif (src & 1) {\n"); @@ -1603,7 +1435,6 @@ static void gen_opcode (unsigned long in } } genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); printf ("\tif (!cctrue(%d)) goto didnt_jump;\n", table68k[opcode].cc); if (using_exception_3) { printf ("\tif (src & 1) {\n"); @@ -1626,19 +1457,16 @@ static void gen_opcode (unsigned long in case i_LEA: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0); - flush_amodes (); genastore ("srca", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_PEA: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); genamode (Apdi, "7", sz_long, "dst", 2, 0); - flush_amodes (); genastore ("srca", Apdi, "7", sz_long, "dst"); break; case i_DBcc: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "offs", 1, 0); - flush_amodes (); printf ("\tif (!cctrue(%d)) {\n", table68k[opcode].cc); genastore ("(src-1)", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); @@ -1665,7 +1493,6 @@ static void gen_opcode (unsigned long in break; case i_Scc: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 2, 0); - flush_amodes (); start_brace (); printf ("\tint val = cctrue(%d) ? 0xff : 0;\n", table68k[opcode].cc); genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); @@ -1674,7 +1501,6 @@ static void gen_opcode (unsigned long in printf ("\tuaecptr oldpc = m68k_getpc();\n"); genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0); - flush_amodes (); printf ("\tif(src == 0) { Exception(5,oldpc); goto %s; } else {\n", endlabelstr); printf ("\tuae_u32 newv = (uae_u32)dst / (uae_u32)(uae_u16)src;\n"); printf ("\tuae_u32 rem = (uae_u32)dst %% (uae_u32)(uae_u16)src;\n"); @@ -1693,7 +1519,6 @@ static void gen_opcode (unsigned long in printf ("\tuaecptr oldpc = m68k_getpc();\n"); genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0); - flush_amodes (); printf ("\tif(src == 0) { Exception(5,oldpc); goto %s; } else {\n", endlabelstr); printf ("\tuae_s32 newv = (uae_s32)dst / (uae_s32)(uae_s16)src;\n"); printf ("\tuae_u16 rem = (uae_s32)dst %% (uae_s32)(uae_s16)src;\n"); @@ -1710,7 +1535,6 @@ static void gen_opcode (unsigned long in case i_MULU: genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", sz_word, "dst", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u32 newv = (uae_u32)(uae_u16)dst * (uae_u32)(uae_u16)src;\n"); genflags (flag_logical, sz_long, "newv", "", ""); @@ -1720,7 +1544,6 @@ static void gen_opcode (unsigned long in case i_MULS: genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", sz_word, "dst", 1, 0); - flush_amodes (); start_brace (); printf ("\tuae_u32 newv = (uae_s32)(uae_s16)dst * (uae_s32)(uae_s16)src;\n"); genflags (flag_logical, sz_long, "newv", "", ""); @@ -1731,7 +1554,6 @@ static void gen_opcode (unsigned long in printf ("\tuaecptr oldpc = m68k_getpc();\n"); genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); printf ("\tif ((uae_s32)dst < 0) { NFLG=1; Exception(6,oldpc); goto %s; }\n", endlabelstr); printf ("\telse if (dst > src) { NFLG=0; Exception(6,oldpc); goto %s; }\n", endlabelstr); need_endlabel = 1; @@ -1741,7 +1563,6 @@ static void gen_opcode (unsigned long in printf ("\tuaecptr oldpc = m68k_getpc();\n"); genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0); - flush_amodes (); printf ("\t{uae_s32 upper,lower,reg = regs.regs[(extra >> 12) & 15];\n"); switch (table68k[opcode].size) { case sz_byte: @@ -1767,7 +1588,6 @@ static void gen_opcode (unsigned long in case i_ASR: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -1802,7 +1622,6 @@ static void gen_opcode (unsigned long in case i_ASL: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -1840,7 +1659,6 @@ static void gen_opcode (unsigned long in case i_LSR: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -1870,7 +1688,6 @@ static void gen_opcode (unsigned long in case i_LSL: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -1900,7 +1717,6 @@ static void gen_opcode (unsigned long in case i_ROL: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -1928,7 +1744,6 @@ static void gen_opcode (unsigned long in case i_ROR: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -1956,7 +1771,6 @@ static void gen_opcode (unsigned long in case i_ROXL: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -1984,7 +1798,6 @@ static void gen_opcode (unsigned long in case i_ROXR: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -2011,7 +1824,6 @@ static void gen_opcode (unsigned long in break; case i_ASRW: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); printf ("\tVFLG = 0;\n"); start_brace (); switch (table68k[opcode].size) { @@ -2034,7 +1846,6 @@ static void gen_opcode (unsigned long in break; case i_ASLW: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); printf ("\tVFLG = 0;\n"); start_brace (); switch (table68k[opcode].size) { @@ -2058,7 +1869,6 @@ static void gen_opcode (unsigned long in break; case i_LSRW: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -2074,7 +1884,6 @@ static void gen_opcode (unsigned long in break; case i_LSLW: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -2096,7 +1905,6 @@ static void gen_opcode (unsigned long in break; case i_ROLW: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -2119,7 +1927,6 @@ static void gen_opcode (unsigned long in break; case i_RORW: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -2142,7 +1949,6 @@ static void gen_opcode (unsigned long in break; case i_ROXLW: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -2166,7 +1972,6 @@ static void gen_opcode (unsigned long in break; case i_ROXRW: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); - flush_amodes (); start_brace (); switch (table68k[opcode].size) { case sz_byte: printf ("\tuae_u8 val = data;\n"); break; @@ -2190,7 +1995,6 @@ static void gen_opcode (unsigned long in break; case i_MOVEC2: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); start_brace (); printf ("\tint regno = (src >> 12) & 15;\n"); printf ("\tuae_u32 *regp = regs.regs + regno;\n"); @@ -2198,7 +2002,6 @@ static void gen_opcode (unsigned long in break; case i_MOVE2C: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); start_brace (); printf ("\tint regno = (src >> 12) & 15;\n"); printf ("\tuae_u32 *regp = regs.regs + regno;\n"); @@ -2209,7 +2012,6 @@ static void gen_opcode (unsigned long in int old_brace_level; genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); start_brace (); printf ("\tint ru = (src >> 6) & 7;\n"); printf ("\tint rc = src & 7;\n"); @@ -2227,7 +2029,6 @@ static void gen_opcode (unsigned long in break; case i_CAS2: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); - flush_amodes (); printf ("\tuae_u32 rn1 = regs.regs[(extra >> 28) & 7];\n"); printf ("\tuae_u32 rn2 = regs.regs[(extra >> 12) & 7];\n"); if (table68k[opcode].size == sz_word) { @@ -2266,19 +2067,16 @@ static void gen_opcode (unsigned long in { int old_brace_level; genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); - flush_amodes (); printf ("\tif (extra & 0x800)\n"); old_brace_level = n_braces; start_brace (); printf ("\tuae_u32 src = regs.regs[(extra >> 12) & 15];\n"); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0); - flush_amodes (); genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); pop_braces (old_brace_level); printf ("else"); start_brace (); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); printf ("\tif (extra & 0x8000) {\n"); switch (table68k[opcode].size) { case sz_byte: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = (uae_s32)(uae_s8)src;\n"); break; @@ -2307,7 +2105,6 @@ static void gen_opcode (unsigned long in case i_TRAPcc: if (table68k[opcode].smode != am_unknown && table68k[opcode].smode != am_illg) genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "dummy", 1, 0); - flush_amodes (); printf ("\tif (cctrue(%d)) { Exception(7,m68k_getpc()); goto %s; }\n", table68k[opcode].cc, endlabelstr); need_endlabel = 1; break; @@ -2317,14 +2114,12 @@ static void gen_opcode (unsigned long in printf ("\tuaecptr oldpc = m68k_getpc();\n"); genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); sync_m68k_pc (); printf ("\tm68k_divl(opcode, dst, extra, oldpc);\n"); break; case i_MULL: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); - flush_amodes (); sync_m68k_pc (); printf ("\tm68k_mull(opcode, dst, extra);\n"); break; @@ -2338,7 +2133,6 @@ static void gen_opcode (unsigned long in case i_BFINS: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 2, 0); - flush_amodes (); start_brace (); printf ("\tuae_s32 offset = extra & 0x800 ? m68k_dreg(regs, (extra >> 6) & 7) : (extra >> 6) & 0x1f;\n"); printf ("\tint width = (((extra & 0x20 ? m68k_dreg(regs, extra & 7) : extra) -1) & 0x1f) +1;\n"); @@ -2440,27 +2234,26 @@ static void gen_opcode (unsigned long in break; case i_TAS: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); - flush_amodes (); genflags (flag_logical, table68k[opcode].size, "src", "", ""); printf ("\tsrc |= 0x80;\n"); genastore ("src", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_FPP: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); - flush_amodes (); sync_m68k_pc (); + swap_opcode (); printf ("\tfpp_opp(opcode,extra);\n"); break; case i_FDBcc: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); - flush_amodes (); sync_m68k_pc (); + swap_opcode (); printf ("\tfdbcc_opp(opcode,extra);\n"); break; case i_FScc: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); - flush_amodes (); sync_m68k_pc (); + swap_opcode (); printf ("\tfscc_opp(opcode,extra);\n"); break; case i_FTRAPcc: @@ -2469,8 +2262,8 @@ static void gen_opcode (unsigned long in printf ("\tuaecptr oldpc = m68k_getpc();\n"); if (table68k[opcode].smode != am_unknown && table68k[opcode].smode != am_illg) genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "dummy", 1, 0); - flush_amodes (); sync_m68k_pc (); + swap_opcode (); printf ("\tftrapcc_opp(opcode,oldpc);\n"); break; case i_FBcc: @@ -2478,22 +2271,24 @@ static void gen_opcode (unsigned long in start_brace (); printf ("\tuaecptr pc = m68k_getpc();\n"); genamode (table68k[opcode].dmode, "srcreg", table68k[opcode].size, "extra", 1, 0); - flush_amodes (); sync_m68k_pc (); + swap_opcode (); printf ("\tfbcc_opp(opcode,pc,extra);\n"); break; case i_FSAVE: sync_m68k_pc (); + swap_opcode (); printf ("\tfsave_opp(opcode);\n"); break; case i_FRESTORE: sync_m68k_pc (); + swap_opcode (); printf ("\tfrestore_opp(opcode);\n"); break; case i_MMUOP: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); - flush_amodes (); sync_m68k_pc (); + swap_opcode (); printf ("\tmmu_op(opcode,extra);\n"); break; default: @@ -2573,15 +2368,20 @@ static void generate_one_opcode (int rp) printf ("\tuae_u32 srcreg = %d;\n", (int) table68k[opcode].sreg); } else { char source[100]; + int pos = table68k[opcode].spos; +#if 0 /* Check that we can do the little endian optimization safely. */ - if (table68k[opcode].spos < 8 && (smsk << table68k[opcode].spos) > 255) + if (pos < 8 && (smsk >> (8 - pos)) != 0) abort (); - +#endif printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n"); - if (table68k[opcode].spos != 8) - sprintf (source, "((opcode >> %d) & %d)", (int) table68k[opcode].spos ^ 8, smsk); + if (pos < 8 && (smsk >> (8 - pos)) != 0) + sprintf (source, "(((opcode >> %d) | (opcode << %d)) & %d)", + pos ^ 8, 8 - pos, dmsk); + else if (pos != 8) + sprintf (source, "((opcode >> %d) & %d)", pos ^ 8, smsk); else sprintf (source, "(opcode & %d)", smsk); @@ -2594,8 +2394,8 @@ static void generate_one_opcode (int rp) printf ("#else\n"); - if (table68k[opcode].spos) - sprintf (source, "((opcode >> %d) & %d)", (int) table68k[opcode].spos, smsk); + if (pos) + sprintf (source, "((opcode >> %d) & %d)", pos, smsk); else sprintf (source, "(opcode & %d)", smsk); @@ -2622,13 +2422,17 @@ static void generate_one_opcode (int rp) printf ("\tuae_u32 dstreg = %d;\n", (int) table68k[opcode].dreg); } else { int pos = table68k[opcode].dpos; +#if 0 /* Check that we can do the little endian optimization safely. */ - if (pos < 8 && (dmsk << pos) > 255) + if (pos < 8 && (dmsk >> (8 - pos)) != 0) abort (); - +#endif printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n"); - if (pos != 8) + if (pos < 8 && (dmsk >> (8 - pos)) != 0) + printf ("\tuae_u32 dstreg = ((opcode >> %d) | (opcode << %d)) & %d;\n", + pos ^ 8, 8 - pos, dmsk); + else if (pos != 8) printf ("\tuae_u32 dstreg = (opcode >> %d) & %d;\n", pos ^ 8, dmsk); else @@ -2650,7 +2454,7 @@ static void generate_one_opcode (int rp) sprintf (endlabelstr, "endlabel%d", endlabelno); gen_opcode (opcode); if (need_endlabel) - printf ("%s: (void)0;\n", endlabelstr); + printf ("%s: ;\n", endlabelstr); printf ("return %d;\n", insn_n_cycles); printf ("}\n"); opcode_next_clev[rp] = next_cpu_level;