diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-20 18:25:32 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-20 18:25:32 +0100 |
| commit | db22d8b1c9a7f20c1c92dd69caead6806717b817 (patch) | |
| tree | 08b161e0df02b3d8bd3311e77471633e0d69af23 /src | |
| parent | e4fa7bc969571ac154e7c8a7027b24e6e8946a0c (diff) | |
| download | box64-db22d8b1c9a7f20c1c92dd69caead6806717b817.tar.gz box64-db22d8b1c9a7f20c1c92dd69caead6806717b817.zip | |
[DYNAREC] Added (66) 20..25 AND opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_00.c | 28 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_66.c | 28 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_emit_logic.c | 137 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_helper.h | 4 |
4 files changed, 125 insertions, 72 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index 7522acfa..c5c6658c 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -275,6 +275,15 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin emit_sbb32(dyn, ninst, rex, xRAX, x2, x3, x4); break; + case 0x20: + INST_NAME("AND Eb, Gb"); + SETFLAGS(X_ALL, SF_SET); + nextop = F8; + GETEB(x1, 0); + GETGB(x2); + emit_and8(dyn, ninst, x1, x2, x4, x5); + EBBACK; + break; case 0x21: INST_NAME("AND Ed, Gd"); SETFLAGS(X_ALL, SF_SET); @@ -284,7 +293,15 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin emit_and32(dyn, ninst, rex, ed, gd, x3, x4); WBACK; break; - + case 0x22: + INST_NAME("AND Gb, Eb"); + SETFLAGS(X_ALL, SF_SET); + nextop = F8; + GETEB(x2, 0); + GETGB(x1); + emit_and8(dyn, ninst, x1, x2, x3, x4); + GBBACK; + break; case 0x23: INST_NAME("AND Gd, Ed"); SETFLAGS(X_ALL, SF_SET); @@ -293,7 +310,14 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GETED(0); emit_and32(dyn, ninst, rex, gd, ed, x3, x4); break; - + case 0x24: + INST_NAME("AND AL, Ib"); + SETFLAGS(X_ALL, SF_PENDING); + u8 = F8; + UXTBw(x1, xRAX); + emit_and8c(dyn, ninst, x1, u8, x3, x4); + BFIx(xRAX, x1, 0, 8); + break; case 0x25: INST_NAME("AND EAX, Id"); SETFLAGS(X_ALL, SF_SET); diff --git a/src/dynarec/dynarec_arm64_66.c b/src/dynarec/dynarec_arm64_66.c index f17e76b8..1f2d568f 100755 --- a/src/dynarec/dynarec_arm64_66.c +++ b/src/dynarec/dynarec_arm64_66.c @@ -174,6 +174,34 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin BFIx(xRAX, x1, 0, 16); break; + case 0x21: + INST_NAME("AND Ew, Gw"); + SETFLAGS(X_ALL, SF_SET); + nextop = F8; + GETGW(x2); + GETEW(x1, 0); + emit_and16(dyn, ninst, x1, x2, x4, x5); + EWBACK; + break; + case 0x23: + INST_NAME("AND Gw, Ew"); + SETFLAGS(X_ALL, SF_SET); + nextop = F8; + GETGW(x1); + GETEW(x2, 0); + emit_and16(dyn, ninst, x1, x2, x3, x4); + GWBACK; + break; + case 0x25: + INST_NAME("AND AX, Iw"); + SETFLAGS(X_ALL, SF_SET); + i32 = F16; + UXTHw(x1, xRAX); + MOV32w(x2, i32); + emit_and16(dyn, ninst, x1, x2, x3, x4); + BFIx(xRAX, x1, 0, 16); + break; + case 0xD1: case 0xD3: nextop = F8; diff --git a/src/dynarec/dynarec_arm64_emit_logic.c b/src/dynarec/dynarec_arm64_emit_logic.c index 92742f77..519b697b 100755 --- a/src/dynarec/dynarec_arm64_emit_logic.c +++ b/src/dynarec/dynarec_arm64_emit_logic.c @@ -362,40 +362,39 @@ void emit_xor8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4 } // emit AND8 instruction, from s1 , s2, store result in s1 using s3 and s4 as scratch, s4 can be same as s2 (and so s2 destroyed) -//void emit_and8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) -//{ -// IFX(X_PEND) { -// STR_IMM9(s1, xEmu, offsetof(x64emu_t, op1)); -// STR_IMM9(s2, xEmu, offsetof(x64emu_t, op2)); -// SET_DF(s3, d_and8); -// } else IFX(X_ALL) { -// SET_DFNONE(s3); -// } -// IFX(X_ALL) { -// ANDS_REG_LSL_IMM5(s1, s1, s2, 0); -// } else { -// AND_REG_LSL_IMM5(s1, s1, s2, 0); -// } -// IFX(X_PEND) { -// STR_IMM9(s1, xEmu, offsetof(x64emu_t, res)); -// } -// IFX(X_CF | X_AF | X_ZF) { -// BIC_IMM8(xFlags, xFlags, (1<<F_CF)|(1<<F_AF)|(1<<F_ZF), 0); -// } -// IFX(X_OF) { -// BIC_IMM8(xFlags, xFlags, 0b10, 0x0b); -// } -// IFX(X_ZF) { -// ORR_IMM8_COND(cEQ, xFlags, xFlags, 1<<F_ZF, 0); -// } -// IFX(X_SF) { -// MOV_REG_LSR_IMM5(s3, s1, 7); -// BFI(xFlags, s3, F_SF, 1); -// } -// IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); -// } -//} +void emit_and8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) +{ + IFX(X_PEND) { + STRB_U12(s1, xEmu, offsetof(x64emu_t, op1)); + STRB_U12(s2, xEmu, offsetof(x64emu_t, op2)); + SET_DF(s3, d_and8); + } else IFX(X_ALL) { + SET_DFNONE(s3); + } + IFX(X_ALL) { + ANDSw_REG(s1, s1, s2); + } else { + ANDw_REG(s1, s1, s2); + } + IFX(X_PEND) { + STRB_U12(s1, xEmu, offsetof(x64emu_t, res)); + } + IFX(X_CF | X_AF | X_OF) { + MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF)); + BICw_REG(xFlags, xFlags, s3); + } + IFX(X_ZF) { + CSETw(s3, cEQ); + BFIw(xFlags, s3, F_ZF, 1); + } + IFX(X_SF) { + LSRw(s3, s1, 7); + BFIw(xFlags, s3, F_SF, 1); + } + IFX(X_PF) { + emit_pf(dyn, ninst, s1, s3, s4); + } +} // emit AND8 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch void emit_and8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4) @@ -595,40 +594,42 @@ void emit_or16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) //} // emit AND16 instruction, from s1 , s2, store result in s1 using s3 and s4 as scratch, s4 can be same as s2 (and so s2 destroyed) -//void emit_and16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) -//{ -// IFX(X_PEND) { -// STR_IMM9(s1, xEmu, offsetof(x64emu_t, op1)); -// STR_IMM9(s2, xEmu, offsetof(x64emu_t, op2)); -// SET_DF(s3, d_and16); -// } else IFX(X_ALL) { -// SET_DFNONE(s3); -// } -// IFX(X_ALL) { -// ANDS_REG_LSL_IMM5(s1, s1, s2, 0); -// } else { -// AND_REG_LSL_IMM5(s1, s1, s2, 0); -// } -// IFX(X_PEND) { -// STR_IMM9(s1, xEmu, offsetof(x64emu_t, res)); -// } -// IFX(X_CF | X_AF | X_ZF) { -// BIC_IMM8(xFlags, xFlags, (1<<F_CF)|(1<<F_AF)|(1<<F_ZF), 0); -// } -// IFX(X_OF) { -// BIC_IMM8(xFlags, xFlags, 0b10, 0x0b); -// } -// IFX(X_ZF) { -// ORR_IMM8_COND(cEQ, xFlags, xFlags, 1<<F_ZF, 0); -// } -// IFX(X_SF) { -// MOV_REG_LSR_IMM5(s3, s1, 15); -// BFI(xFlags, s3, F_SF, 1); -// } -// IFX(X_PF) { -// emit_pf(dyn, ninst, s1, s3, s4); -// } -//} +void emit_and16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4) +{ + IFX(X_PEND) { + STRH_U12(s1, xEmu, offsetof(x64emu_t, op1)); + STRH_U12(s2, xEmu, offsetof(x64emu_t, op2)); + SET_DF(s3, d_and16); + } else IFX(X_ALL) { + SET_DFNONE(s3); + } + IFX(X_ALL) { + ANDSw_REG(s1, s1, s2); + } else { + ANDw_REG(s1, s1, s2); + } + IFX(X_PEND) { + STRH_REG(s1, xEmu, offsetof(x64emu_t, res)); + } + IFX(X_PEND) { + STRB_U12(s1, xEmu, offsetof(x64emu_t, res)); + } + IFX(X_CF | X_AF | X_OF) { + MOV32w(s3, (1<<F_CF)|(1<<F_AF)|(1<<F_OF)); + BICw_REG(xFlags, xFlags, s3); + } + IFX(X_ZF) { + CSETw(s3, cEQ); + BFIw(xFlags, s3, F_ZF, 1); + } + IFX(X_SF) { + LSRw(s3, s1, 15); + BFIw(xFlags, s3, F_SF, 1); + } + IFX(X_PF) { + emit_pf(dyn, ninst, s1, s3, s4); + } +} // emit AND16 instruction, from s1 , constant c, store result in s1 using s3 and s4 as scratch //void emit_and16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4) diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h index ab80c286..ed3bc1c0 100755 --- a/src/dynarec/dynarec_arm64_helper.h +++ b/src/dynarec/dynarec_arm64_helper.h @@ -658,7 +658,7 @@ void emit_or8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4); void emit_or8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); //void emit_xor8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4); void emit_xor8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); -//void emit_and8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_and8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4); void emit_and8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); void emit_add16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4); //void emit_add16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); @@ -668,7 +668,7 @@ void emit_or16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4); //void emit_or16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); //void emit_xor16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4); //void emit_xor16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); -//void emit_and16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4); +void emit_and16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4); //void emit_and16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4); void emit_inc32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s3, int s4); void emit_inc16(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4); |