diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-06-25 14:50:02 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-06-25 14:50:02 +0200 |
| commit | deb6fe8d7a56bcc829bd6bb984e2f40be2af0ab6 (patch) | |
| tree | ee6cbf91f622ae11450a1d3d8fc4ec862b61ae1e /src | |
| parent | 1e20ed70993a47fc22f45bb378f461773e205fb5 (diff) | |
| download | box64-deb6fe8d7a56bcc829bd6bb984e2f40be2af0ab6.tar.gz box64-deb6fe8d7a56bcc829bd6bb984e2f40be2af0ab6.zip | |
[32BITS][ARM64_DYNAREC] Added 64 8F opcode
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/arm64_emitter.h | 1 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 20 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h index 52e29dbb..60ca1ae1 100755 --- a/src/dynarec/arm64/arm64_emitter.h +++ b/src/dynarec/arm64/arm64_emitter.h @@ -326,6 +326,7 @@ #define STRB_REG(Rt, Rn, Rm) EMIT(STR_REG_gen(0b00, Rm, 0b011, 0, Rn, Rt)) #define STRH_REG(Rt, Rn, Rm) EMIT(STR_REG_gen(0b01, Rm, 0b011, 0, Rn, Rt)) #define STRxw_REG(Rt, Rn, Rm) EMIT(STR_REG_gen(rex.w?0b11:0b10, Rm, 0b011, 0, Rn, Rt)) +#define STRz_REG(Rt, Rn, Rm) EMIT(STR_REG_gen(rex.is32bits?0b10:0b11, Rm, 0b011, 0, Rn, Rt)) // LOAD/STORE PAIR #define MEMPAIR_gen(size, L, op2, imm7, Rt2, Rn, Rt) ((size)<<31 | 0b101<<27 | (op2)<<23 | (L)<<22 | (imm7)<<15 | (Rt2)<<10 | (Rn)<<5 | (Rt)) diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index 7452585c..723b4460 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -591,6 +591,26 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; + case 0x8F: + INST_NAME("POP FS:Ed"); + grab_segdata(dyn, addr, ninst, x4, seg); + nextop = F8; + if(MODREG) { + POP1z(xRAX+(nextop&7)+(rex.b<<3)); + } else { + POP1z(x2); // so this can handle POP [ESP] and maybe some variant too + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0, 0, rex, NULL, 0, 0); + if(ed==xRSP) { + STRz_REG(x2, ed, x4); + } else { + // complicated to just allow a segfault that can be recovered correctly + SUBz_U12(xRSP, xRSP, rex.is32bits?4:8); + STRz_REG(x2, ed, x4); + ADDz_U12(xRSP, xRSP, rex.is32bits?4:8); + } + } + break; + case 0xA1: INST_NAME("MOV EAX,FS:Od"); grab_segdata(dyn, addr, ninst, x4, seg); |