diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-07 08:53:15 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-07 08:53:15 +0200 |
| commit | 2ef6011c7aebe44870795e1faaae9dde462cb7af (patch) | |
| tree | 01f4cb5dc96e50b8055dadb7c30f891ba07a38ca | |
| parent | 6e0b5358fbe20cd14b2728d3d0a688d1c84fd8a6 (diff) | |
| download | box64-2ef6011c7aebe44870795e1faaae9dde462cb7af.tar.gz box64-2ef6011c7aebe44870795e1faaae9dde462cb7af.zip | |
[ARM64_DYNAREC] Added 64 88 opcode
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 69 |
1 files changed, 52 insertions, 17 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index f4ed2483..160bc2db 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -669,6 +669,58 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; } break; + case 0x88: + INST_NAME("MOV Eb, Gb"); + nextop = F8; + gd = ((nextop&0x38)>>3)+(rex.r<<3); + if(rex.rex) { + gb2 = 0; + gb1 = xRAX + gd; + } else { + gb2 = ((gd&4)<<1); + gb1 = xRAX+(gd&3); + } + if(gb2) { + gd = x4; + UBFXw(gd, gb1, gb2, 8); + } else { + gd = gb1; // no need to extract + } + if(MODREG) { + ed = (nextop&7) + (rex.b<<3); + if(rex.rex) { + eb1 = xRAX+ed; + eb2 = 0; + } else { + eb1 = xRAX+(ed&3); // Ax, Cx, Dx or Bx + eb2 = ((ed&4)>>2); // L or H + } + BFIx(eb1, gd, eb2*8, 8); + } else { + grab_segdata(dyn, addr, ninst, x4, seg); + addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + if(rex.is32bits) + STRB_REG_SXTW(gd, x4, wback); + else + STRB_REG(gd, wback, x4); + } + break; + case 0x89: + INST_NAME("MOV Seg:Ed, Gd"); + grab_segdata(dyn, addr, ninst, x4, seg); + nextop=F8; + GETGD; + if(MODREG) { // reg <= reg + MOVxw_REG(xRAX+(nextop&7)+(rex.b<<3), gd); + } else { // mem <= reg + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + if(rex.is32bits) + STRxw_REG_SXTW(gd, x4, ed); + else + STRxw_REG(gd, ed, x4); + SMWRITE2(); + } + break; case 0x8A: INST_NAME("MOV Gb, Eb"); nextop = F8; @@ -707,23 +759,6 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } BFIx(gb1, ed, gb2, 8); break; - case 0x89: - INST_NAME("MOV Seg:Ed, Gd"); - grab_segdata(dyn, addr, ninst, x4, seg); - nextop=F8; - GETGD; - if(MODREG) { // reg <= reg - MOVxw_REG(xRAX+(nextop&7)+(rex.b<<3), gd); - } else { // mem <= reg - addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); - if(rex.is32bits) - STRxw_REG_SXTW(gd, x4, ed); - else - STRxw_REG(gd, ed, x4); - SMWRITE2(); - } - break; - case 0x8B: INST_NAME("MOV Gd, Seg:Ed"); grab_segdata(dyn, addr, ninst, x4, seg); |