diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-03 09:44:26 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-03 09:44:26 +0200 |
| commit | 8760064ddb7dedeb2a43fb095d3446328e14c7e2 (patch) | |
| tree | 75f5e1401747f41134dc9e75242b941944cd1f4c | |
| parent | ab0059eeee2ca34b884fed92dc311ea3b393c3de (diff) | |
| download | box64-8760064ddb7dedeb2a43fb095d3446328e14c7e2.tar.gz box64-8760064ddb7dedeb2a43fb095d3446328e14c7e2.zip | |
[DYNAREC] Added 66 03/C6 opcodes
| -rw-r--r-- | src/dynarec/dynarec_arm64_64.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/src/dynarec/dynarec_arm64_64.c b/src/dynarec/dynarec_arm64_64.c index e66a888e..840d2312 100644 --- a/src/dynarec/dynarec_arm64_64.c +++ b/src/dynarec/dynarec_arm64_64.c @@ -27,12 +27,15 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin { uint8_t opcode = F8; uint8_t nextop; + uint8_t u8; int32_t j32; - uint8_t gd, ed; + uint8_t gd, ed, eb1, eb2; uint8_t wback; int64_t i64; int fixedaddress; MAYUSE(j32); + MAYUSE(eb1); + MAYUSE(eb2); while((opcode==0xF2) || (opcode==0xF3)) { rep = opcode-0xF1; @@ -47,6 +50,16 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin switch(opcode) { + case 0x03: + INST_NAME("ADD Gd, FS:Ed"); + SETFLAGS(X_ALL, SF_SET); + grab_segdata(dyn, addr, ninst, x4, _FS); + nextop = F8; + GETGD; + GETEDO(x4, 0); + emit_add32(dyn, ninst, rex, gd, ed, x3, x4); + break; + case 0x33: INST_NAME("XOR Gd, FS:Ed"); SETFLAGS(X_ALL, SF_SET); @@ -162,6 +175,29 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; + case 0xC6: + INST_NAME("MOV FS:Eb, Ib"); + grab_segdata(dyn, addr, ninst, x4, _FS); + nextop=F8; + if(MODREG) { // reg <= u8 + u8 = F8; + if(!rex.rex) { + ed = (nextop&7); + eb1 = xRAX+(ed&3); // Ax, Cx, Dx or Bx + eb2 = (ed&4)>>2; // L or H + } else { + eb1 = xRAX+(nextop&7)+(rex.b<<3); + eb2 = 0; + } + MOV32w(x3, u8); + BFIx(eb1, x3, eb2*8, 8); + } else { // mem <= u8 + addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0, 0, rex, 0, 1); + u8 = F8; + MOV32w(x3, u8); + STRB_REG(x3, ed, x4); + } + break; case 0xC7: INST_NAME("MOV FS:Ed, Id"); grab_segdata(dyn, addr, ninst, x4, _FS); |