diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-05-26 11:03:32 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-05-26 11:03:32 +0200 |
| commit | da7474b1de99c3952f9b1c67275e7a5bf44e7121 (patch) | |
| tree | 6d041d3b70d10f0ffbe6acf76f8ed6bd3407af43 /src/dynarec | |
| parent | 27aa9011ce0b83428dad48d96d66135d7301c236 (diff) | |
| download | box64-da7474b1de99c3952f9b1c67275e7a5bf44e7121.tar.gz box64-da7474b1de99c3952f9b1c67275e7a5bf44e7121.zip | |
Added 67 66 83 opcodes ([ARM64_DYNAREC] too)
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67.c | 83 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 13 |
2 files changed, 96 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c index b7392210..b22c7f92 100644 --- a/src/dynarec/arm64/dynarec_arm64_67.c +++ b/src/dynarec/arm64/dynarec_arm64_67.c @@ -37,6 +37,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin uint8_t u8; int32_t i32; int64_t j64, i64; + int16_t i16; int cacheupd = 0; int lock; int v0, v1, s0; @@ -679,6 +680,88 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; + case 0x81: + case 0x83: + nextop = F8; + switch((nextop>>3)&7) { + case 0: //ADD + if(opcode==0x81) {INST_NAME("ADD Ew, Iw");} else {INST_NAME("ADD Ew, Ib");} + SETFLAGS(X_ALL, SF_SET_PENDING); + GETEW32(x1, (opcode==0x81)?2:1); + if(opcode==0x81) i16 = F16S; else i16 = F8S; + MOVZw(x5, i16); + emit_add16(dyn, ninst, ed, x5, x2, x4); + EWBACK; + break; + case 1: //OR + if(opcode==0x81) {INST_NAME("OR Ew, Iw");} else {INST_NAME("OR Ew, Ib");} + SETFLAGS(X_ALL, SF_SET_PENDING); + GETEW32(x1, (opcode==0x81)?2:1); + if(opcode==0x81) i16 = F16S; else i16 = F8S; + MOVZw(x5, i16); + emit_or16(dyn, ninst, x1, x5, x2, x4); + EWBACK; + break; + case 2: //ADC + if(opcode==0x81) {INST_NAME("ADC Ew, Iw");} else {INST_NAME("ADC Ew, Ib");} + READFLAGS(X_CF); + SETFLAGS(X_ALL, SF_SET_PENDING); + GETEW32(x1, (opcode==0x81)?2:1); + if(opcode==0x81) i16 = F16S; else i16 = F8S; + MOVZw(x5, i16); + emit_adc16(dyn, ninst, x1, x5, x2, x4); + EWBACK; + break; + case 3: //SBB + if(opcode==0x81) {INST_NAME("SBB Ew, Iw");} else {INST_NAME("SBB Ew, Ib");} + READFLAGS(X_CF); + SETFLAGS(X_ALL, SF_SET_PENDING); + GETEW32(x1, (opcode==0x81)?2:1); + if(opcode==0x81) i16 = F16S; else i16 = F8S; + MOVZw(x5, i16); + emit_sbb16(dyn, ninst, x1, x5, x2, x4); + EWBACK; + break; + case 4: //AND + if(opcode==0x81) {INST_NAME("AND Ew, Iw");} else {INST_NAME("AND Ew, Ib");} + SETFLAGS(X_ALL, SF_SET_PENDING); + GETEW32(x1, (opcode==0x81)?2:1); + if(opcode==0x81) i16 = F16S; else i16 = F8S; + MOVZw(x5, i16); + emit_and16(dyn, ninst, x1, x5, x2, x4); + EWBACK; + break; + case 5: //SUB + if(opcode==0x81) {INST_NAME("SUB Ew, Iw");} else {INST_NAME("SUB Ew, Ib");} + SETFLAGS(X_ALL, SF_SET_PENDING); + GETEW32(x1, (opcode==0x81)?2:1); + if(opcode==0x81) i16 = F16S; else i16 = F8S; + MOVZw(x5, i16); + emit_sub16(dyn, ninst, x1, x5, x2, x4); + EWBACK; + break; + case 6: //XOR + if(opcode==0x81) {INST_NAME("XOR Ew, Iw");} else {INST_NAME("XOR Ew, Ib");} + SETFLAGS(X_ALL, SF_SET_PENDING); + GETEW32(x1, (opcode==0x81)?2:1); + if(opcode==0x81) i16 = F16S; else i16 = F8S; + MOVZw(x5, i16); + emit_xor16(dyn, ninst, x1, x5, x2, x4); + EWBACK; + break; + case 7: //CMP + if(opcode==0x81) {INST_NAME("CMP Ew, Iw");} else {INST_NAME("CMP Ew, Ib");} + SETFLAGS(X_ALL, SF_SET_PENDING); + GETEW32(x1, (opcode==0x81)?2:1); + if(opcode==0x81) i16 = F16S; else i16 = F8S; + if(i16) { + MOVZw(x2, i16); + emit_cmp16(dyn, ninst, x1, x2, x3, x4, x5); + } else + emit_cmp16_0(dyn, ninst, x1, x3, x4); + break; + } + break; case 0x89: INST_NAME("MOV Ew, Gw"); nextop = F8; diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index 345ce432..96c56be8 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -280,6 +280,19 @@ ed = i; \ wb1 = 1; \ } +//GETEW will use i for ed, and can use r3 for wback. +#define GETEW32(i, D) if(MODREG) { \ + wback = xRAX+(nextop&7)+(rex.b<<3);\ + UXTHw(i, wback); \ + ed = i; \ + wb1 = 0; \ + } else { \ + SMREAD(); \ + addr = geted32(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, &unscaled, 0xfff<<1, (1<<1)-1, rex, NULL, 0, D); \ + LDH(i, wback, fixedaddress); \ + ed = i; \ + wb1 = 1; \ + } //GETEWO will use i for ed, i is also Offset, and can use r3 for wback. #define GETEWO(i, D) if(MODREG) { \ wback = xRAX+(nextop&7)+(rex.b<<3);\ |