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 | |
| parent | 27aa9011ce0b83428dad48d96d66135d7301c236 (diff) | |
| download | box64-da7474b1de99c3952f9b1c67275e7a5bf44e7121.tar.gz box64-da7474b1de99c3952f9b1c67275e7a5bf44e7121.zip | |
Added 67 66 83 opcodes ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67.c | 83 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 13 | ||||
| -rw-r--r-- | src/emu/x64run6766.c | 23 |
3 files changed, 119 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);\ diff --git a/src/emu/x64run6766.c b/src/emu/x64run6766.c index 33c2daf8..080abf91 100644 --- a/src/emu/x64run6766.c +++ b/src/emu/x64run6766.c @@ -72,6 +72,29 @@ uintptr_t Run6766(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr) return Run67660F(emu, rex, addr); #endif + case 0x81: /* GRP3 Ew,Iw */ + case 0x83: /* GRP3 Ew,Ib */ + nextop = F8; + GETEW32((opcode==0x81)?2:1); + GETGW; + if(opcode==0x81) + tmp16u = F16; + else { + tmp16s = F8S; + tmp16u = (uint16_t)tmp16s; + } + switch((nextop>>3)&7) { + case 0: EW->word[0] = add16(emu, EW->word[0], tmp16u); break; + case 1: EW->word[0] = or16(emu, EW->word[0], tmp16u); break; + case 2: EW->word[0] = adc16(emu, EW->word[0], tmp16u); break; + case 3: EW->word[0] = sbb16(emu, EW->word[0], tmp16u); break; + case 4: EW->word[0] = and16(emu, EW->word[0], tmp16u); break; + case 5: EW->word[0] = sub16(emu, EW->word[0], tmp16u); break; + case 6: EW->word[0] = xor16(emu, EW->word[0], tmp16u); break; + case 7: cmp16(emu, EW->word[0], tmp16u); break; + } + break; + case 0x89: /* MOV Ew,Gw */ nextop = F8; GETEW32(0); |