--- uae/src/gencpu.c 2018/04/24 16:46:03 1.1.1.7 +++ uae/src/gencpu.c 2018/04/24 16:48:31 1.1.1.8 @@ -195,13 +195,6 @@ static void fill_prefetch_2 (void) printf ("fill_prefetch_2 ();\n"); } -static void swap_opcode (void) -{ - 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) { if (m68k_pc_offset == 0) @@ -233,7 +226,7 @@ static void genamode (amodes mode, char if (getv == 1) switch (size) { case sz_byte: -#ifdef AMIGA +#if defined(AMIGA) && !defined(WARPUP) /* sam: I don't know why gcc.2.7.2.1 produces a code worse */ /* if it is not done like that: */ printf ("\tuae_s8 %s = ((uae_u8*)&m68k_dreg(regs, %s))[3];\n", name, reg); @@ -242,7 +235,7 @@ static void genamode (amodes mode, char #endif break; case sz_word: -#ifdef AMIGA +#if defined(AMIGA) && !defined(WARPUP) printf ("\tuae_s16 %s = ((uae_s16*)&m68k_dreg(regs, %s))[1];\n", name, reg); #else printf ("\tuae_s16 %s = m68k_dreg(regs, %s);\n", name, reg); @@ -682,7 +675,7 @@ static void genflags_normal (flagtypes t break; case flag_add: printf ("\tSET_ZFLG (%s == 0);\n", vstr); - printf ("\tVFLG = (flgs ^ flgn) & (flgo ^ flgn));\n"); + printf ("\tSET_VFLG ((flgs ^ flgn) & (flgo ^ flgn));\n"); printf ("\tSET_CFLG (%s < %s);\n", undstr, usstr); duplicate_carry (); printf ("\tSET_NFLG (flgn != 0);\n"); @@ -691,6 +684,7 @@ static void genflags_normal (flagtypes t printf ("\tSET_ZFLG (%s == 0);\n", vstr); printf ("\tSET_VFLG ((flgs ^ flgo) & (flgn ^ flgo));\n"); printf ("\tSET_CFLG (%s > %s);\n", usstr, udstr); + duplicate_carry (); printf ("\tSET_NFLG (flgn != 0);\n"); break; case flag_addx: @@ -1159,6 +1153,7 @@ static void gen_opcode (unsigned long in printf ("\tif (newv_lo > 9) { newv_lo-=6; newv_hi-=0x10; }\n"); printf ("\tnewv = newv_hi + (newv_lo & 0xF);"); printf ("\tSET_CFLG (cflg = (newv_hi & 0x1F0) > 0x90);\n"); + duplicate_carry(); printf ("\tif (cflg) newv -= 0x60;\n"); genflags (flag_zn, curi->size, "newv", "", ""); genastore ("newv", curi->smode, "srcreg", curi->size, "src"); @@ -2036,8 +2031,8 @@ static void gen_opcode (unsigned long in break; case i_CAS2: genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0); - printf ("\tuae_u32 rn1 = regs.regs[(extra >> 28) & 7];\n"); - printf ("\tuae_u32 rn2 = regs.regs[(extra >> 12) & 7];\n"); + printf ("\tuae_u32 rn1 = regs.regs[(extra >> 28) & 15];\n"); + printf ("\tuae_u32 rn2 = regs.regs[(extra >> 12) & 15];\n"); if (curi->size == sz_word) { int old_brace_level = n_braces; printf ("\tuae_u16 dst1 = get_word(rn1), dst2 = get_word(rn2);\n"); @@ -2249,19 +2244,16 @@ static void gen_opcode (unsigned long in case i_FPP: genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0); sync_m68k_pc (); - swap_opcode (); printf ("\tfpp_opp(opcode,extra);\n"); break; case i_FDBcc: genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0); sync_m68k_pc (); - swap_opcode (); printf ("\tfdbcc_opp(opcode,extra);\n"); break; case i_FScc: genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0); sync_m68k_pc (); - swap_opcode (); printf ("\tfscc_opp(opcode,extra);\n"); break; case i_FTRAPcc: @@ -2271,7 +2263,6 @@ static void gen_opcode (unsigned long in if (curi->smode != am_unknown && curi->smode != am_illg) genamode (curi->smode, "srcreg", curi->size, "dummy", 1, 0); sync_m68k_pc (); - swap_opcode (); printf ("\tftrapcc_opp(opcode,oldpc);\n"); break; case i_FBcc: @@ -2280,23 +2271,19 @@ static void gen_opcode (unsigned long in printf ("\tuaecptr pc = m68k_getpc();\n"); genamode (curi->dmode, "srcreg", curi->size, "extra", 1, 0); 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 (curi->smode, "srcreg", curi->size, "extra", 1, 0); sync_m68k_pc (); - swap_opcode (); printf ("\tmmu_op(opcode,extra);\n"); break; default: @@ -2382,25 +2369,6 @@ static void generate_one_opcode (int rp) if (pos < 8 && (smsk >> (8 - pos)) != 0) abort (); #endif - printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n"); - - 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); - - if (table68k[opcode].stype == 3) - printf ("\tuae_u32 srcreg = imm8_table[%s];\n", source); - else if (table68k[opcode].stype == 1) - printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%s;\n", source); - else - printf ("\tuae_u32 srcreg = %s;\n", source); - - printf ("#else\n"); - if (pos) sprintf (source, "((opcode >> %d) & %d)", pos, smsk); else @@ -2412,8 +2380,6 @@ static void generate_one_opcode (int rp) printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%s;\n", source); else printf ("\tuae_u32 srcreg = %s;\n", source); - - printf ("#endif\n"); } } if (table68k[opcode].duse @@ -2434,26 +2400,11 @@ static void generate_one_opcode (int rp) if (pos < 8 && (dmsk >> (8 - pos)) != 0) abort (); #endif - printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n"); - - 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 - printf ("\tuae_u32 dstreg = opcode & %d;\n", dmsk); - - printf ("#else\n"); - if (pos) printf ("\tuae_u32 dstreg = (opcode >> %d) & %d;\n", pos, dmsk); else printf ("\tuae_u32 dstreg = opcode & %d;\n", dmsk); - - printf ("#endif\n"); } } need_endlabel = 0;