diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-05-21 10:05:36 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-05-21 10:05:36 +0200 |
| commit | 4be307820bab87e8bcd219b95ac0f5cb9b3acc3e (patch) | |
| tree | 585bde0dee77a5af8a1ffa2ab91176ac0ef82c3d /src | |
| parent | 15227bbc0651b7e16ef082435932eb085c3a9ea4 (diff) | |
| download | box64-4be307820bab87e8bcd219b95ac0f5cb9b3acc3e.tar.gz box64-4be307820bab87e8bcd219b95ac0f5cb9b3acc3e.zip | |
Added 64 80 opcodes ([DYNAREC] too)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/dynarec_arm64_64.c | 82 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_helper.h | 31 | ||||
| -rw-r--r-- | src/emu/x64run64.c | 16 |
3 files changed, 114 insertions, 15 deletions
diff --git a/src/dynarec/dynarec_arm64_64.c b/src/dynarec/dynarec_arm64_64.c index d6245467..077411ce 100644 --- a/src/dynarec/dynarec_arm64_64.c +++ b/src/dynarec/dynarec_arm64_64.c @@ -31,11 +31,13 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin uint8_t nextop; uint8_t u8; uint8_t gd, ed, eb1, eb2; - uint8_t wback; + uint8_t wback, wb1, wb2; int64_t i64, j64; int64_t fixedaddress; MAYUSE(eb1); MAYUSE(eb2); + MAYUSE(wb1); + MAYUSE(wb2); MAYUSE(j64); while((opcode==0xF2) || (opcode==0xF3)) { @@ -71,6 +73,84 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin emit_xor32(dyn, ninst, rex, gd, ed, x3, x4); break; + case 0x80: + nextop = F8; + grab_segdata(dyn, addr, ninst, x1, _FS); + switch((nextop>>3)&7) { + case 0: //ADD + INST_NAME("ADD Eb, Ib"); + SETFLAGS(X_ALL, SF_SET); + GETEBO(x1, 1); + u8 = F8; + emit_add8c(dyn, ninst, x1, u8, x2, x4); + EBBACK; + break; + case 1: //OR + INST_NAME("OR Eb, Ib"); + SETFLAGS(X_ALL, SF_SET); + GETEBO(x1, 1); + u8 = F8; + emit_or8c(dyn, ninst, x1, u8, x2, x4); + EBBACK; + break; + case 2: //ADC + INST_NAME("ADC Eb, Ib"); + READFLAGS(X_CF); + SETFLAGS(X_ALL, SF_SET); + GETEBO(x1, 1); + u8 = F8; + emit_adc8c(dyn, ninst, x1, u8, x2, x4, x5); + EBBACK; + break; + case 3: //SBB + INST_NAME("SBB Eb, Ib"); + READFLAGS(X_CF); + SETFLAGS(X_ALL, SF_SET); + GETEBO(x1, 1); + u8 = F8; + emit_sbb8c(dyn, ninst, x1, u8, x2, x4, x5); + EBBACK; + break; + case 4: //AND + INST_NAME("AND Eb, Ib"); + SETFLAGS(X_ALL, SF_SET); + GETEBO(x1, 1); + u8 = F8; + emit_and8c(dyn, ninst, x1, u8, x2, x4); + EBBACK; + break; + case 5: //SUB + INST_NAME("SUB Eb, Ib"); + SETFLAGS(X_ALL, SF_SET); + GETEBO(x1, 1); + u8 = F8; + emit_sub8c(dyn, ninst, x1, u8, x2, x4, x5); + EBBACK; + break; + case 6: //XOR + INST_NAME("XOR Eb, Ib"); + SETFLAGS(X_ALL, SF_SET); + GETEBO(x1, 1); + u8 = F8; + emit_xor8c(dyn, ninst, x1, u8, x2, x4); + EBBACK; + break; + case 7: //CMP + INST_NAME("CMP Eb, Ib"); + SETFLAGS(X_ALL, SF_SET); + GETEBO(x1, 1); + u8 = F8; + if(u8) { + MOV32w(x2, u8); + emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5); + } else { + emit_cmp8_0(dyn, ninst, x1, x3, x4); + } + break; + default: + DEFAULT; + } + break; case 0x81: case 0x83: nextop = F8; diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h index dfa6f4ce..338a1cad 100755 --- a/src/dynarec/dynarec_arm64_helper.h +++ b/src/dynarec/dynarec_arm64_helper.h @@ -166,19 +166,24 @@ ed = i; \ } //GETEBO will use i for ed, i is also Offset, and can use r3 for wback. -#define GETEBO(i) if((nextop&0xC0)==0xC0) { \ - wback = (nextop&7); \ - wb2 = (wback>>2); \ - wback = xEAX+(wback&3); \ - UBFXx(i, wback, wb2, 8);\ - wb1 = 0; \ - ed = i; \ - } else { \ - addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0, 0); \ - ADD_REG_LSL_IMM5(wback, wback, i, 0); \ - LDRB_IMM9(i, wback, fixedaddress); \ - wb1 = 1; \ - ed = i; \ +#define GETEBO(i, D) if(MODREG) { \ + if(rex.rex) { \ + wback = xRAX+(nextop&7)+(rex.b<<3); \ + wb2 = 0; \ + } else { \ + wback = (nextop&7); \ + wb2 = (wback>>2)*8; \ + wback = xRAX+(wback&3); \ + } \ + UBFXx(i, wback, wb2, 8); \ + wb1 = 0; \ + ed = i; \ + } else { \ + addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, 0, 0, rex, 0, D); \ + ADDx_REG(wback, wback, i); \ + LDRB_U12(i, wback, fixedaddress); \ + wb1 = 1; \ + ed = i; \ } //GETSEB sign extend EB, will use i for ed, and can use r3 for wback. #define GETSEB(i, D) if(MODREG) { \ diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c index ae4dbe63..3b6bb4f2 100644 --- a/src/emu/x64run64.c +++ b/src/emu/x64run64.c @@ -217,7 +217,21 @@ int Run64(x64emu_t *emu, rex_t rex) } break; - + case 0x80: /* GRP Eb,Ib */ + nextop = F8; + GETEB_OFFS(1, tlsdata); + tmp8u = F8; + switch((nextop>>3)&7) { + case 0: EB->byte[0] = add8(emu, EB->byte[0], tmp8u); break; + case 1: EB->byte[0] = or8(emu, EB->byte[0], tmp8u); break; + case 2: EB->byte[0] = adc8(emu, EB->byte[0], tmp8u); break; + case 3: EB->byte[0] = sbb8(emu, EB->byte[0], tmp8u); break; + case 4: EB->byte[0] = and8(emu, EB->byte[0], tmp8u); break; + case 5: EB->byte[0] = sub8(emu, EB->byte[0], tmp8u); break; + case 6: EB->byte[0] = xor8(emu, EB->byte[0], tmp8u); break; + case 7: cmp8(emu, EB->byte[0], tmp8u); break; + } + break; case 0x81: /* GRP Ed,Id */ case 0x83: /* GRP Ed,Ib */ nextop = F8; |