diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-17 17:59:13 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-17 17:59:13 +0200 |
| commit | abdd03cdfac3f030543824756b3b21721c71a8fc (patch) | |
| tree | 256db204690dc47890ead37bdd94150245cc420e | |
| parent | ba3359353f16a7b4bdbc6630ff531c5e963c50c7 (diff) | |
| download | box64-abdd03cdfac3f030543824756b3b21721c71a8fc.tar.gz box64-abdd03cdfac3f030543824756b3b21721c71a8fc.zip | |
[DYNAREC] Added 8F opcode and improved 8C one
| -rwxr-xr-x | src/dynarec/dynarec_arm64_00.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index 7c44ef12..dd3262f7 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -973,12 +973,11 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x8C: INST_NAME("MOV Ed, Seg"); nextop=F8; - MOV32w(x3, offsetof(x64emu_t, segs[(nextop&0x38)>>3])); // probably not usefull, U12 should work if((nextop&0xC0)==0xC0) { // reg <= seg - LDRH_REG(xRAX+(nextop&7)+(rex.b<<3), xEmu, x3); + LDRH_U12(xRAX+(nextop&7)+(rex.b<<3), xEmu, offsetof(x64emu_t, segs[(nextop&0x38)>>3])); } else { // mem <= seg addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, 0, 0); - LDRH_REG(x3, xEmu, x3); + LDRH_U12(x3, xEmu, offsetof(x64emu_t, segs[(nextop&0x38)>>3])); STRH_U12(x3, ed, fixedaddress); } break; @@ -999,6 +998,24 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; + case 0x8F: + INST_NAME("POP Ed"); + nextop = F8; + if((nextop&0xC0)==0xC0) { + POP1(xRAX+(nextop&7)+(rex.b<<3)); + } else { + POP1(x2); // so this can handle POP [ESP] and maybe some variant too + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<3, 7, rex, 0, 0); + if(ed==xRSP) { + STRx_U12(x2, ed, fixedaddress); + } else { + // complicated to just allow a segfault that can be recovered correctly + SUBx_U12(xRSP, xRSP, 8); + STRx_U12(x2, ed, fixedaddress); + ADDx_U12(xRSP, xRSP, 8); + } + } + break; case 0x90: case 0x91: case 0x92: |