diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-24 14:58:28 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-24 14:58:28 +0100 |
| commit | 78750b96e5d2544e594c03475aba112b90458e9c (patch) | |
| tree | 534f0dc64c703b4f03835d4972acad2b5c1e855d /src | |
| parent | ce51207e44646add90c703cd172f2e88d5876402 (diff) | |
| download | box64-78750b96e5d2544e594c03475aba112b90458e9c.tar.gz box64-78750b96e5d2544e594c03475aba112b90458e9c.zip | |
[DYNAREC] Added 64 83 opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/dynarec_arm64_64.c | 79 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_helper.h | 2 |
2 files changed, 80 insertions, 1 deletions
diff --git a/src/dynarec/dynarec_arm64_64.c b/src/dynarec/dynarec_arm64_64.c index 6a0735ff..e66a888e 100644 --- a/src/dynarec/dynarec_arm64_64.c +++ b/src/dynarec/dynarec_arm64_64.c @@ -57,6 +57,85 @@ 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 0x81: + case 0x83: + nextop = F8; + grab_segdata(dyn, addr, ninst, x6, _FS); + switch((nextop>>3)&7) { + case 0: //ADD + if(opcode==0x81) {INST_NAME("ADD Ed, Id");} else {INST_NAME("ADD Ed, Ib");} + SETFLAGS(X_ALL, SF_SET); + GETEDO(x6, (opcode==0x81)?4:1); + if(opcode==0x81) i64 = F32S; else i64 = F8S; + emit_add32c(dyn, ninst, rex, ed, i64, x3, x4, x5); + WBACKO(x6); + break; + case 1: //OR + if(opcode==0x81) {INST_NAME("OR Ed, Id");} else {INST_NAME("OR Ed, Ib");} + SETFLAGS(X_ALL, SF_SET); + GETEDO(x6, (opcode==0x81)?4:1); + if(opcode==0x81) i64 = F32S; else i64 = F8S; + emit_or32c(dyn, ninst, rex, ed, i64, x3, x4); + WBACKO(x6); + break; + case 2: //ADC + if(opcode==0x81) {INST_NAME("ADC Ed, Id");} else {INST_NAME("ADC Ed, Ib");} + READFLAGS(X_CF); + SETFLAGS(X_ALL, SF_SET); + GETEDO(x6, (opcode==0x81)?4:1); + if(opcode==0x81) i64 = F32S; else i64 = F8S; + MOV64xw(x5, i64); + emit_adc32(dyn, ninst, rex, ed, x5, x3, x4); + WBACKO(x6); + break; + case 3: //SBB + if(opcode==0x81) {INST_NAME("SBB Ed, Id");} else {INST_NAME("SBB Ed, Ib");} + READFLAGS(X_CF); + SETFLAGS(X_ALL, SF_SET); + GETEDO(x6, (opcode==0x81)?4:1); + if(opcode==0x81) i64 = F32S; else i64 = F8S; + MOV64xw(x5, i64); + emit_sbb32(dyn, ninst, rex, ed, x5, x3, x4); + WBACKO(x6); + break; + case 4: //AND + if(opcode==0x81) {INST_NAME("AND Ed, Id");} else {INST_NAME("AND Ed, Ib");} + SETFLAGS(X_ALL, SF_SET); + GETEDO(x6, (opcode==0x81)?4:1); + if(opcode==0x81) i64 = F32S; else i64 = F8S; + emit_and32c(dyn, ninst, rex, ed, i64, x3, x4); + WBACKO(x6); + break; + case 5: //SUB + if(opcode==0x81) {INST_NAME("SUB Ed, Id");} else {INST_NAME("SUB Ed, Ib");} + SETFLAGS(X_ALL, SF_SET); + GETEDO(x6, (opcode==0x81)?4:1); + if(opcode==0x81) i64 = F32S; else i64 = F8S; + emit_sub32c(dyn, ninst, rex, ed, i64, x3, x4, x5); + WBACKO(x6); + break; + case 6: //XOR + if(opcode==0x81) {INST_NAME("XOR Ed, Id");} else {INST_NAME("XOR Ed, Ib");} + SETFLAGS(X_ALL, SF_SET); + GETEDO(x6, (opcode==0x81)?4:1); + if(opcode==0x81) i64 = F32S; else i64 = F8S; + emit_xor32c(dyn, ninst, rex, ed, i64, x3, x4); + WBACKO(x6); + break; + case 7: //CMP + if(opcode==0x81) {INST_NAME("CMP Ed, Id");} else {INST_NAME("CMP Ed, Ib");} + SETFLAGS(X_ALL, SF_SET); + GETEDO(x6, (opcode==0x81)?4:1); + if(opcode==0x81) i64 = F32S; else i64 = F8S; + if(i64) { + MOV64xw(x2, i64); + emit_cmp32(dyn, ninst, rex, ed, x2, x3, x4, x5); + } else + emit_cmp32_0(dyn, ninst, rex, ed, x3, x4); + break; + } + break; + case 0x89: INST_NAME("MOV FS:Ed, Gd"); grab_segdata(dyn, addr, ninst, x4, _FS); diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h index ed940272..f61f9d23 100755 --- a/src/dynarec/dynarec_arm64_helper.h +++ b/src/dynarec/dynarec_arm64_helper.h @@ -92,7 +92,7 @@ LDRxw_REG(x1, wback, O); \ ed = x1; \ } -#define WBACKO(O) if(wback) {STR_REG_LSL_IMM5(ed, wback, O, 0);} +#define WBACKO(O) if(wback) {STRxw_REG(ed, wback, O);} //FAKEELike GETED, but doesn't get anything #define FAKEED if(!MODREG) { \ addr = fakeed(dyn, addr, ninst, nextop); \ |