diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c index af74cc085..7e1969aba 100644 --- a/src/dynarec/la64/dynarec_la64_00.c +++ b/src/dynarec/la64/dynarec_la64_00.c @@ -2173,21 +2173,31 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni switch ((nextop >> 3) & 7) { case 0: INST_NAME("ROL Eb, Ib"); - SETFLAGS(X_OF | X_CF, SF_SUBSET, NAT_FLAGS_FUSION); // removed PENDING on purpose + u8 = geted_ib(dyn, addr, ninst, nextop) & 0x1f; + if (u8) { + SETFLAGS(X_OF | X_CF, SF_SUBSET, NAT_FLAGS_FUSION); // removed PENDING on purpose GETEB(x1, 1); u8 = F8 & 0x1f; emit_rol8c(dyn, ninst, ed, u8, x4, x5, x6); EBBACK(); + } else { + FAKEED; + F8; + } break; case 1: INST_NAME("ROR Eb, Ib"); - MESSAGE(LOG_DUMP, "Need Optimization\n"); - SETFLAGS(X_OF | X_CF, SF_SET_DF, NAT_FLAGS_NOFUSION); - GETEB(x1, 1); - u8 = F8 & 0x1f; - MOV32w(x2, u8); - CALL_(const_ror8, ed, x3, x1, x2); - EBBACK(); + u8 = geted_ib(dyn, addr, ninst, nextop) & 0x1f; + if (u8) { + SETFLAGS(X_OF | X_CF, SF_SUBSET, NAT_FLAGS_FUSION); // removed PENDING on purpose + GETEB(x1, 1); + u8 = F8 & 0x1f; + emit_ror8c(dyn, ninst, x1, u8, x4, x5); + EBBACK(); + } else { + FAKEED; + F8; + } break; case 2: INST_NAME("RCL Eb, Ib"); @@ -2328,16 +2338,6 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 2: INST_NAME("RCL Ed, Ib"); - // MESSAGE(LOG_DUMP, "Need Optimization\n"); - // READFLAGS(X_CF); - // SETFLAGS(X_OF | X_CF, SF_SET_DF, NAT_FLAGS_NOFUSION); - // GETEDW(x4, x1, 0); - // u8 = (F8) & (rex.w ? 0x3f : 0x1f); - // MOV32w(x2, u8); - // CALL_(rex.w ? (const_rcl64) : (const_rcl32), ed, x4, x1, x2); - // WBACK; - // if (!wback && !rex.w) ZEROUP(ed); - u8 = geted_ib(dyn, addr, ninst, nextop) & (0x1f + (rex.w * 0x20)); if (u8) { READFLAGS(X_CF); @@ -2718,7 +2718,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni *ok = 0; break; case 0xD0: - case 0xD2: // TODO: Jump if CL is 0 + case 0xD2: nextop = F8; switch ((nextop >> 3) & 7) { case 0: @@ -2727,37 +2727,48 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni GETEB(x1, 0); SETFLAGS(X_OF | X_CF, SF_SUBSET, NAT_FLAGS_FUSION); // removed PENDING on purpose emit_rol8c(dyn, ninst, ed, 1, x4, x5, x6); + EBBACK(); + break; } else { INST_NAME("ROL Eb, CL"); GETEB(x1, 0); - ANDI(x2, xRCX, 0x1f); if (BOX64DRENV(dynarec_safeflags) > 1) { READFLAGS(X_OF | X_CF); } SETFLAGS(X_OF | X_CF, SF_SUBSET, NAT_FLAGS_FUSION); // removed PENDING on purpose - emit_rol8(dyn, ninst, ed, x2, x4, x5, x6); + UFLAG_IF { + ANDI(x2, xRCX, 0x1f); + BEQ_NEXT(x2, xZR); + } + ANDI(x2, xRCX, 7); + emit_rol8(dyn, ninst, ed, x2, x4, x5); + EBBACK(); + break; } - EBBACK(); - break; case 1: if (opcode == 0xD0) { INST_NAME("ROR Eb, 1"); + SETFLAGS(X_OF | X_CF, SF_SUBSET, NAT_FLAGS_FUSION); // removed PENDING on purpose GETEB(x1, 0); - MOV32w(x2, 1); - SETFLAGS(X_OF | X_CF, SF_SET_DF, NAT_FLAGS_NOFUSION); + emit_ror8c(dyn, ninst, ed, 1, x4, x5); + EBBACK(); + break; } else { INST_NAME("ROR Eb, CL"); GETEB(x1, 0); - ANDI(x2, xRCX, 0x1f); if (BOX64DRENV(dynarec_safeflags) > 1) { READFLAGS(X_OF | X_CF); } - SETFLAGS(X_OF | X_CF, SF_SET_DF, NAT_FLAGS_NOFUSION); + SETFLAGS(X_OF | X_CF, SF_SUBSET, NAT_FLAGS_FUSION); // removed PENDING on purpose + UFLAG_IF { + ANDI(x2, xRCX, 0x1f); + BEQ_NEXT(x2, xZR); + } + ANDI(x2, xRCX, 7); + emit_ror8(dyn, ninst, ed, x2, x4, x5); + EBBACK(); + break; } - MESSAGE(LOG_DUMP, "Need Optimization\n"); - CALL_(const_ror8, ed, x3, x1, x2); - EBBACK(); - break; case 2: if (opcode == 0xD0) { INST_NAME("RCL Eb, 1"); diff --git a/src/dynarec/la64/dynarec_la64_emit_shift.c b/src/dynarec/la64/dynarec_la64_emit_shift.c index 88efb5981..816e5f2c0 100644 --- a/src/dynarec/la64/dynarec_la64_emit_shift.c +++ b/src/dynarec/la64/dynarec_la64_emit_shift.c @@ -126,12 +126,14 @@ void emit_shl16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int } SLLI_D(s1, s1, c); - BSTRPICK_D(s1, s1, 15, 0); IFX (X_PEND) { ST_H(s1, xEmu, offsetof(x64emu_t, res)); } - if (dyn->insts[ninst].nat_flags_fusion) NAT_FLAGS_OPS(s1, xZR, s3, xZR); + if (dyn->insts[ninst].nat_flags_fusion) { + BSTRPICK_D(s1, s1, 15, 0); + NAT_FLAGS_OPS(s1, xZR, s3, xZR); + } return; } @@ -596,7 +598,6 @@ void emit_shr16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, void emit_shr16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5) { if (!c) return; - // c != 0 IFX (X_PEND) { MOV64x(s3, c); ST_H(s3, xEmu, offsetof(x64emu_t, op2)); @@ -873,7 +874,6 @@ void emit_sar16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, void emit_sar16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5) { if (!c) return; - // c != 0 IFX (X_PEND) { MOV64x(s3, c); ST_H(s3, xEmu, offsetof(x64emu_t, op2)); @@ -893,11 +893,13 @@ void emit_sar16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int } IFXA ((X_AF | X_OF), BOX64DRENV(dynarec_safeflags)) X64_SET_EFLAGS(xZR, (X_AF | X_OF)); SRLI_D(s1, s1, c); - BSTRPICK_D(s1, s1, 15, 0); IFX (X_PEND) { ST_H(s1, xEmu, offsetof(x64emu_t, res)); } - if (dyn->insts[ninst].nat_flags_fusion) NAT_FLAGS_OPS(s1, xZR, s3, xZR); + if (dyn->insts[ninst].nat_flags_fusion) { + BSTRPICK_D(s1, s1, 15, 0); + NAT_FLAGS_OPS(s1, xZR, s3, xZR); + } return; } @@ -1123,33 +1125,11 @@ void emit_ror32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, if (dyn->insts[ninst].nat_flags_fusion) NAT_FLAGS_OPS(s1, xZR, s3, xZR); } -// emit ROL8 instruction, from s1, s2, store result in s1 using s3 s4 and s5 as scratch -void emit_rol8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5) +// emit ROL8 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch +void emit_rol8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4) { - int64_t j64; - BEQ_NEXT(s2, xZR); - - ANDI(s5, s2, 0b111); - if (cpuext.lbt) { - IFX (X_CF | X_OF) X64_ROTL_B(s1, s5); - IFXA (X_OF, BOX64DRENV(dynarec_safeflags)) { - SRLI_W(s3, s1, 6); - SRLI_D(s4, s3, 1); - XOR(s3, s3, s4); - SLLI_D(s3, s3, F_OF); - X64_SET_EFLAGS(s3, X_OF); - } - - ADDI_D(s3, xZR, 8); - SUB_D(s3, s3, s5); - ROTR_B(s1, s1, s3); - - IFX (X_PEND) { - ST_B(s1, xEmu, offsetof(x64emu_t, res)); - } - if (dyn->insts[ninst].nat_flags_fusion) NAT_FLAGS_OPS(s1, xZR, s3, xZR); - return; - } + IFXORNAT (X_ALL) SET_DFNONE(); + RESTORE_EFLAGS(s3); IFX (X_OF) { SRLI_W(s3, s1, 6); @@ -1157,15 +1137,20 @@ void emit_rol8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, i XOR(s3, s3, s4); BSTRINS_D(xFlags, s3, F_OF, F_OF); } - - SLL_D(s3, s1, s5); - NEG_D(s4, s5); - ADDI_D(s4, s4, 8); - SRL_D(s1, s1, s4); + ADDI_D(s4, xZR, 8); + SUB_D(s4, s4, s2); + SLLI_D(s3, s1, 8); OR(s1, s3, s1); + SRL_D(s1, s1, s4); + IFX (X_CF) { + BSTRINS_D(xFlags, s1, F_CF, F_CF); + } - IFX (X_CF) BSTRINS_D(xFlags, s1, F_CF, F_CF); - if (dyn->insts[ninst].nat_flags_fusion) NAT_FLAGS_OPS(s1, xZR, s3, xZR); + IFXA (X_ALL, cpuext.lbt) SPILL_EFLAGS(); + if (dyn->insts[ninst].nat_flags_fusion) { + ANDI(s1, s1, 0xFF); + NAT_FLAGS_OPS(s1, xZR, s3, xZR); + } } // emit ROL8 instruction, from s1, c, store result in s1 using s3 s4 and s5 as scratch @@ -1208,39 +1193,44 @@ void emit_rol8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int IFX (X_CF) { BSTRINS_D(xFlags, s1, F_CF, F_CF); } - if (dyn->insts[ninst].nat_flags_fusion) NAT_FLAGS_OPS(s1, xZR, s3, xZR); + if (dyn->insts[ninst].nat_flags_fusion) { + ANDI(s1, s1, 0xFF); + NAT_FLAGS_OPS(s1, xZR, s3, xZR); + } } // emit ROL16 instruction, from s1, c, store result in s1 using s3 s4 and s5 as scratch void emit_rol16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5) { - int64_t j64; if (!c) return; IFXORNAT (X_ALL) SET_DFNONE(); + RESTORE_EFLAGS(s3); + + IFXA (X_OF, c == 1) { + SRLI_D(s3, s1, 14); + SRLI_D(s4, s3, 1); + XOR(s3, s4, s3); + BSTRINS_D(xFlags, s3, F_OF, F_OF); + } + if (c & 15) { + int rc = 16 - (c & 15); if (cpuext.lbt) - ROTRI_H(s1, s1, 16 - (c & 15)); + ROTRI_H(s1, s1, rc); else { - SRLI_D(s3, s1, 16 - (c & 15)); - SLLI_D(s1, s1, c & 15); - OR(s1, s1, s3); - BSTRPICK_D(s1, s1, 15, 0); + SLLI_D(s3, s1, 16); + OR(s1, s3, s1); + SRLI_D(s1, s1, rc); } } - IFX (X_CF | X_OF) { - ANDI(s4, s1, 1 << F_CF); - IFXA (X_OF, c == 1) { - ANDI(s4, s1, 1 << F_CF); - SRLI_D(s3, s1, 15); - XOR(s3, s3, s4); - BSTRINS_D(xFlags, s3, F_OF, F_OF); - } - IFX (X_CF) BSTRINS_D(xFlags, s1, F_CF, F_CF); - } + IFX (X_CF) BSTRINS_D(xFlags, s1, F_CF, F_CF); IFXA (X_ALL, cpuext.lbt) SPILL_EFLAGS(); - if (dyn->insts[ninst].nat_flags_fusion) NAT_FLAGS_OPS(s1, xZR, s3, xZR); + if (dyn->insts[ninst].nat_flags_fusion) { + if (!cpuext.lbt) BSTRPICK_D(s1, s1, 15, 0); + NAT_FLAGS_OPS(s1, xZR, s3, xZR); + } } // emit ROL32 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch @@ -1620,7 +1610,10 @@ void emit_rcl8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int SRLI_D(s1, s1, 9 - c); IFXA (X_ALL, cpuext.lbt) SPILL_EFLAGS(); - if (dyn->insts[ninst].nat_flags_fusion) NAT_FLAGS_OPS(s1, xZR, s3, xZR); + if (dyn->insts[ninst].nat_flags_fusion) { + ANDI(s1, s1, 0xFF); + NAT_FLAGS_OPS(s1, xZR, s3, xZR); + } } // emit RCL16 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch @@ -1720,7 +1713,10 @@ void emit_rcr8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int } IFXA (X_ALL, cpuext.lbt) SPILL_EFLAGS(); - if (dyn->insts[ninst].nat_flags_fusion) NAT_FLAGS_OPS(s1, xZR, s3, xZR); + if (dyn->insts[ninst].nat_flags_fusion) { + ANDI(s1, s1, 0xFF); + NAT_FLAGS_OPS(s1, xZR, s3, xZR); + } } // emit RCR16 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch @@ -1786,6 +1782,64 @@ void emit_rcr32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, if (dyn->insts[ninst].nat_flags_fusion) NAT_FLAGS_OPS(s1, xZR, s3, xZR); } +// emit ROR8 instruction, from s1, s2, store result in s1 using s3 and s4 as scratch +void emit_ror8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4) +{ + IFXORNAT (X_ALL) SET_DFNONE(); + RESTORE_EFLAGS(s3); + + IFX (X_OF) { + SRLI_D(s3, s1, 7); + XOR(s3, s1, s3); + BSTRINS_D(xFlags, s3, F_OF, F_OF); + } + + SLLI_D(s3, s1, 8); + OR(s1, s1, s3); + SRL_D(s1, s1, s2); + + IFX (X_CF) { + SRLI_D(s3, s1, 7); + BSTRINS_D(xFlags, s3, F_CF, F_CF); + } + + IFXA (X_ALL, cpuext.lbt) SPILL_EFLAGS(); + if (dyn->insts[ninst].nat_flags_fusion) { + ANDI(s1, s1, 0xFF); + NAT_FLAGS_OPS(s1, xZR, s3, xZR); + } +} + +// emit ROR8 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch +void emit_ror8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4) +{ + if (!c) return; + IFXORNAT (X_ALL) SET_DFNONE(); + RESTORE_EFLAGS(s3); + + IFX (X_OF) { + SRLI_D(s3, s1, 7); + XOR(s3, s1, s3); + BSTRINS_D(xFlags, s3, F_OF, F_OF); + } + + if (c & 7) { + SLLI_D(s3, s1, 8); + OR(s1, s3, s1); + SRLI_D(s1, s1, c & 7); + } + IFX (X_CF) { + SRLI_D(s3, s1, 7); + BSTRINS_D(xFlags, s3, F_CF, F_CF); + } + + IFXA (X_ALL, cpuext.lbt) SPILL_EFLAGS(); + if (dyn->insts[ninst].nat_flags_fusion) { + ANDI(s1, s1, 0xFF); + NAT_FLAGS_OPS(s1, xZR, s3, xZR); + } +} + // emit ROR16 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch void emit_ror16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4) { diff --git a/src/dynarec/la64/dynarec_la64_helper.h b/src/dynarec/la64/dynarec_la64_helper.h index 41de63111..a54e7049e 100644 --- a/src/dynarec/la64/dynarec_la64_helper.h +++ b/src/dynarec/la64/dynarec_la64_helper.h @@ -1161,97 +1161,99 @@ #define call_c STEPNAME(call_c) #define call_n STEPNAME(call_n) #define grab_segdata STEPNAME(grab_segdata) +#define emit_adc16 STEPNAME(emit_adc16) +#define emit_adc32 STEPNAME(emit_adc32) +#define emit_adc8 STEPNAME(emit_adc8) +#define emit_adc8c STEPNAME(emit_adc8c) +#define emit_add16 STEPNAME(emit_add16) +#define emit_add32 STEPNAME(emit_add32) +#define emit_add32c STEPNAME(emit_add32c) +#define emit_add8 STEPNAME(emit_add8) +#define emit_add8c STEPNAME(emit_add8c) +#define emit_and16 STEPNAME(emit_and16) +#define emit_and32 STEPNAME(emit_and32) +#define emit_and32c STEPNAME(emit_and32c) +#define emit_and8 STEPNAME(emit_and8) +#define emit_and8c STEPNAME(emit_and8c) #define emit_cmp16 STEPNAME(emit_cmp16) #define emit_cmp16_0 STEPNAME(emit_cmp16_0) #define emit_cmp32 STEPNAME(emit_cmp32) #define emit_cmp32_0 STEPNAME(emit_cmp32_0) #define emit_cmp8 STEPNAME(emit_cmp8) #define emit_cmp8_0 STEPNAME(emit_cmp8_0) -#define emit_test8 STEPNAME(emit_test8) -#define emit_test8c STEPNAME(emit_test8c) -#define emit_test16 STEPNAME(emit_test16) -#define emit_test32 STEPNAME(emit_test32) -#define emit_test32c STEPNAME(emit_test32c) -#define emit_add32 STEPNAME(emit_add32) -#define emit_add32c STEPNAME(emit_add32c) -#define emit_add8 STEPNAME(emit_add8) -#define emit_add8c STEPNAME(emit_add8c) -#define emit_add16 STEPNAME(emit_add16) -#define emit_adc32 STEPNAME(emit_adc32) -#define emit_adc8 STEPNAME(emit_adc8) -#define emit_adc8c STEPNAME(emit_adc8c) -#define emit_adc16 STEPNAME(emit_adc16) -#define emit_sub16 STEPNAME(emit_sub16) -#define emit_sub32 STEPNAME(emit_sub32) -#define emit_sub32c STEPNAME(emit_sub32c) -#define emit_sub8 STEPNAME(emit_sub8) -#define emit_sub8c STEPNAME(emit_sub8c) -#define emit_sbb8 STEPNAME(emit_sbb8) -#define emit_sbb8c STEPNAME(emit_sbb8c) -#define emit_sbb16 STEPNAME(emit_sbb16) -#define emit_sbb32 STEPNAME(emit_sbb32) -#define emit_neg8 STEPNAME(emit_neg8) -#define emit_neg16 STEPNAME(emit_neg16) -#define emit_neg32 STEPNAME(emit_neg32) -#define emit_inc8 STEPNAME(emit_inc8) -#define emit_inc16 STEPNAME(emit_inc16) -#define emit_inc32 STEPNAME(emit_inc32) -#define emit_dec8 STEPNAME(emit_dec8) #define emit_dec16 STEPNAME(emit_dec16) #define emit_dec32 STEPNAME(emit_dec32) +#define emit_dec8 STEPNAME(emit_dec8) +#define emit_inc16 STEPNAME(emit_inc16) +#define emit_inc32 STEPNAME(emit_inc32) +#define emit_inc8 STEPNAME(emit_inc8) +#define emit_neg16 STEPNAME(emit_neg16) +#define emit_neg32 STEPNAME(emit_neg32) +#define emit_neg8 STEPNAME(emit_neg8) +#define emit_or16 STEPNAME(emit_or16) #define emit_or32 STEPNAME(emit_or32) #define emit_or32c STEPNAME(emit_or32c) #define emit_or8 STEPNAME(emit_or8) #define emit_or8c STEPNAME(emit_or8c) -#define emit_or16 STEPNAME(emit_or16) -#define emit_xor8 STEPNAME(emit_xor8) -#define emit_xor8c STEPNAME(emit_xor8c) -#define emit_xor16 STEPNAME(emit_xor16) -#define emit_xor32 STEPNAME(emit_xor32) -#define emit_xor32c STEPNAME(emit_xor32c) -#define emit_and8 STEPNAME(emit_and8) -#define emit_and8c STEPNAME(emit_and8c) -#define emit_and16 STEPNAME(emit_and16) -#define emit_and32 STEPNAME(emit_and32) -#define emit_and32c STEPNAME(emit_and32c) +#define emit_rcl16c STEPNAME(emit_rcl16c) +#define emit_rcl32c STEPNAME(emit_rcl32c) +#define emit_rcl8c STEPNAME(emit_rcl8c) +#define emit_rcr16c STEPNAME(emit_rcr16c) +#define emit_rcr32c STEPNAME(emit_rcr32c) +#define emit_rcr8c STEPNAME(emit_rcr8c) +#define emit_rol16 STEPNAME(emit_rol16) +#define emit_rol16c STEPNAME(emit_rol16c) +#define emit_rol32 STEPNAME(emit_rol32) +#define emit_rol32c STEPNAME(emit_rol32c) +#define emit_rol8 STEPNAME(emit_rol8) +#define emit_rol8c STEPNAME(emit_rol8c) +#define emit_ror16c STEPNAME(emit_ror16c) +#define emit_ror32 STEPNAME(emit_ror32) +#define emit_ror32c STEPNAME(emit_ror32c) +#define emit_ror8 STEPNAME(emit_ror8) +#define emit_ror8c STEPNAME(emit_ror8c) +#define emit_sar16 STEPNAME(emit_sar16) +#define emit_sar16c STEPNAME(emit_sar16c) +#define emit_sar32 STEPNAME(emit_sar32) +#define emit_sar32c STEPNAME(emit_sar32c) +#define emit_sar8 STEPNAME(emit_sar8) +#define emit_sbb16 STEPNAME(emit_sbb16) +#define emit_sbb32 STEPNAME(emit_sbb32) +#define emit_sbb8 STEPNAME(emit_sbb8) +#define emit_sbb8c STEPNAME(emit_sbb8c) #define emit_shl16 STEPNAME(emit_shl16) #define emit_shl16c STEPNAME(emit_shl16c) #define emit_shl32 STEPNAME(emit_shl32) #define emit_shl32c STEPNAME(emit_shl32c) #define emit_shl8 STEPNAME(emit_shl8) -#define emit_shr8 STEPNAME(emit_shr8) -#define emit_sar8 STEPNAME(emit_sar8) +#define emit_shld16 STEPNAME(emit_shld16) +#define emit_shld16c STEPNAME(emit_shld16c) +#define emit_shld32 STEPNAME(emit_shld32) +#define emit_shld32c STEPNAME(emit_shld32c) #define emit_shr16 STEPNAME(emit_shr16) #define emit_shr16c STEPNAME(emit_shr16c) #define emit_shr32 STEPNAME(emit_shr32) #define emit_shr32c STEPNAME(emit_shr32c) -#define emit_sar16 STEPNAME(emit_sar16) -#define emit_sar16c STEPNAME(emit_sar16c) -#define emit_sar32 STEPNAME(emit_sar32) -#define emit_sar32c STEPNAME(emit_sar32c) -#define emit_shld32c STEPNAME(emit_shld32c) -#define emit_shrd32c STEPNAME(emit_shrd32c) -#define emit_shld32 STEPNAME(emit_shld32) -#define emit_shrd32 STEPNAME(emit_shrd32) -#define emit_ror32 STEPNAME(emit_ror32) -#define emit_ror32c STEPNAME(emit_ror32c) -#define emit_rol8 STEPNAME(emit_rol8) -#define emit_rol8c STEPNAME(emit_rol8c) -#define emit_rol16 STEPNAME(emit_rol16) -#define emit_rol16c STEPNAME(emit_rol16c) -#define emit_rol32 STEPNAME(emit_rol32) -#define emit_rol32c STEPNAME(emit_rol32c) -#define emit_rcl8c STEPNAME(emit_rcl8c) -#define emit_rcl16c STEPNAME(emit_rcl16c) -#define emit_rcl32c STEPNAME(emit_rcl32c) -#define emit_rcr8c STEPNAME(emit_rcr8c) -#define emit_rcr16c STEPNAME(emit_rcr16c) -#define emit_ror16c STEPNAME(emit_ror16c) -#define emit_shld16c STEPNAME(emit_shld16c) -#define emit_shrd16c STEPNAME(emit_shrd16c) +#define emit_shr8 STEPNAME(emit_shr8) #define emit_shrd16 STEPNAME(emit_shrd16) -#define emit_shld16 STEPNAME(emit_shld16) -#define emit_rcr32c STEPNAME(emit_rcr32c) +#define emit_shrd16c STEPNAME(emit_shrd16c) +#define emit_shrd32 STEPNAME(emit_shrd32) +#define emit_shrd32c STEPNAME(emit_shrd32c) +#define emit_sub16 STEPNAME(emit_sub16) +#define emit_sub32 STEPNAME(emit_sub32) +#define emit_sub32c STEPNAME(emit_sub32c) +#define emit_sub8 STEPNAME(emit_sub8) +#define emit_sub8c STEPNAME(emit_sub8c) +#define emit_test16 STEPNAME(emit_test16) +#define emit_test32 STEPNAME(emit_test32) +#define emit_test32c STEPNAME(emit_test32c) +#define emit_test8 STEPNAME(emit_test8) +#define emit_test8c STEPNAME(emit_test8c) +#define emit_xor16 STEPNAME(emit_xor16) +#define emit_xor32 STEPNAME(emit_xor32) +#define emit_xor32c STEPNAME(emit_xor32c) +#define emit_xor8 STEPNAME(emit_xor8) +#define emit_xor8c STEPNAME(emit_xor8c) #define emit_pf STEPNAME(emit_pf) @@ -1322,96 +1324,98 @@ void iret_to_epilog(dynarec_la64_t* dyn, uintptr_t ip, int ninst, int is64bits); void call_c(dynarec_la64_t* dyn, int ninst, la64_consts_t fnc, int reg, int ret, int saveflags, int save_reg, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6); void call_n(dynarec_la64_t* dyn, int ninst, void* fnc, int w); void grab_segdata(dynarec_la64_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg); -void emit_cmp8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); -void emit_cmp16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); -void emit_cmp32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5, int s6); -void emit_cmp8_0(dynarec_la64_t* dyn, int ninst, int s1, int s3, int s4); -void emit_cmp16_0(dynarec_la64_t* dyn, int ninst, int s1, int s3, int s4); -void emit_cmp32_0(dynarec_la64_t* dyn, int ninst, rex_t rex, uint8_t nextop, int s1, int s3, int s4, int s5); -void emit_test8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_test8c(dynarec_la64_t* dyn, int ninst, int s1, uint8_t c, int s3, int s4, int s5); -void emit_test16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_test32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); -void emit_test32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4, int s5); +void emit_adc16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_adc32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5, int s6); +void emit_adc8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_adc8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s3, int s4, int s5, int s6); +void emit_add16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); void emit_add32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); void emit_add32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s2, int s3, int s4, int s5); void emit_add8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); void emit_add8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s2, int s3, int s4); -void emit_add16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_adc32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5, int s6); -void emit_adc8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_adc8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s3, int s4, int s5, int s6); -void emit_adc16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_sub16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_sub32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); -void emit_sub32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s2, int s3, int s4, int s5); -void emit_sub8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_sub8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s2, int s3, int s4, int s5); -void emit_sbb8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_sbb8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s3, int s4, int s5, int s6); -void emit_sbb16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_sbb32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); -void emit_neg8(dynarec_la64_t* dyn, int ninst, int s1, int s3, int s4); -void emit_neg16(dynarec_la64_t* dyn, int ninst, int s1, int s3, int s4); -void emit_neg32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3); -void emit_inc8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); -void emit_inc16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); -void emit_inc32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); -void emit_dec8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_and16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_and32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); +void emit_and32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4); +void emit_and8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_and8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); +void emit_cmp16_0(dynarec_la64_t* dyn, int ninst, int s1, int s3, int s4); +void emit_cmp16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); +void emit_cmp32_0(dynarec_la64_t* dyn, int ninst, rex_t rex, uint8_t nextop, int s1, int s3, int s4, int s5); +void emit_cmp32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5, int s6); +void emit_cmp8_0(dynarec_la64_t* dyn, int ninst, int s1, int s3, int s4); +void emit_cmp8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); void emit_dec16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); void emit_dec32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); +void emit_dec8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_inc16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_inc32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); +void emit_inc8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_neg16(dynarec_la64_t* dyn, int ninst, int s1, int s3, int s4); +void emit_neg32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3); +void emit_neg8(dynarec_la64_t* dyn, int ninst, int s1, int s3, int s4); +void emit_or16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); void emit_or32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); void emit_or32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4); void emit_or8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); void emit_or8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s2, int s3, int s4); -void emit_or16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); -void emit_xor8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); -void emit_xor8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); -void emit_xor16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_xor32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4); -void emit_xor32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); -void emit_and8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); -void emit_and8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); -void emit_and16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); -void emit_and32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); -void emit_and32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4); +void emit_rcl16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); +void emit_rcl32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4, int s5); +void emit_rcl8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); +void emit_rcr16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); +void emit_rcr32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4, int s5); +void emit_rcr8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); +void emit_rol16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5); +void emit_rol32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); +void emit_rol32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4); +void emit_rol8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_rol8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5); +void emit_ror16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); +void emit_ror32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); +void emit_ror32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4); +void emit_ror8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_ror8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); +void emit_sar16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_sar16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5); +void emit_sar32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); +void emit_sar32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4); +void emit_sar8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_sbb16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_sbb32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); +void emit_sbb8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_sbb8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s3, int s4, int s5, int s6); void emit_shl16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); void emit_shl16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5); void emit_shl32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); void emit_shl32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4, int s5); void emit_shl8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_shr8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_sar8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_shld16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); +void emit_shld16c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4, int s5); +void emit_shld32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s5, int s3, int s4, int s6); +void emit_shld32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4); void emit_shr16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); void emit_shr16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5); void emit_shr32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); void emit_shr32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4); -void emit_sar16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_sar16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5); -void emit_sar32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4); -void emit_sar32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); -void emit_shld32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4); -void emit_shrd32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4); -void emit_shld32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s5, int s3, int s4, int s6); -void emit_shrd32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s5, int s3, int s4, int s6); -void emit_ror32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); -void emit_ror32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4); -void emit_rol8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); -void emit_rol8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5); -void emit_rol16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4, int s5); -void emit_rol32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); -void emit_rol32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4); -void emit_rcl8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); -void emit_rcl16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); -void emit_rcr8c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); -void emit_rcr16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); -void emit_ror16c(dynarec_la64_t* dyn, int ninst, int s1, uint32_t c, int s3, int s4); -void emit_shrd16c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4, int s5); -void emit_shld16c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4, int s5); -void emit_shld16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); +void emit_shr8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); void emit_shrd16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); -void emit_rcl32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4, int s5); -void emit_rcr32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, uint32_t c, int s3, int s4, int s5); +void emit_shrd16c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4, int s5); +void emit_shrd32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s5, int s3, int s4, int s6); +void emit_shrd32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, uint32_t c, int s3, int s4); +void emit_sub16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_sub32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); +void emit_sub32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s2, int s3, int s4, int s5); +void emit_sub8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_sub8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s2, int s3, int s4, int s5); +void emit_test16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_test32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); +void emit_test32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4, int s5); +void emit_test8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_test8c(dynarec_la64_t* dyn, int ninst, int s1, uint8_t c, int s3, int s4, int s5); +void emit_xor16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); +void emit_xor32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4); +void emit_xor32c(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4); +void emit_xor8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_xor8c(dynarec_la64_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); void emit_pf(dynarec_la64_t* dyn, int ninst, int s1, int s3, int s4);