diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-03-21 11:30:50 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-03-21 11:30:50 +0100 |
| commit | 10cbb3c8a90c06fc76cdcffbb0f64bc789d52fdd (patch) | |
| tree | f875e63d15eb2ee845bd79ca14ef28a2e5508d92 /src | |
| parent | 0a3fa1c918ef9cfc332c47214dba4f77f871a945 (diff) | |
| download | box64-10cbb3c8a90c06fc76cdcffbb0f64bc789d52fdd.tar.gz box64-10cbb3c8a90c06fc76cdcffbb0f64bc789d52fdd.zip | |
[ARM64_DYNAREC] Added 67 66 0F 76/EF opcodes (for #1046)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c index 36180f02..03639bf3 100644 --- a/src/dynarec/arm64/dynarec_arm64_67.c +++ b/src/dynarec/arm64/dynarec_arm64_67.c @@ -30,7 +30,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin uint8_t opcode = F8; uint8_t nextop; - uint8_t gd, ed, wback, wb, wb1, wb2, gb1, gb2, eb1, eb2; + uint8_t gd, ed, wback, wb, wb1, wb2, gb1, gb2, eb1, eb2, q0, q1; int64_t fixedaddress; int unscaled; int8_t i8; @@ -748,6 +748,20 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; + case 0x76: + INST_NAME("PCMPEQD Gx,Ex"); + nextop = F8; + GETGX(v0, 1); + if(MODREG) { + q0 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); + } else { + q0 = fpu_get_scratch(dyn, ninst); + addr = geted32(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); + VLD128(q0, ed, fixedaddress); + } + VCMEQQ_32(v0, v0, q0); + break; + case 0x7E: INST_NAME("MOVD Ed,Gx"); nextop = F8; @@ -787,6 +801,27 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; + case 0xEF: + INST_NAME("PXOR Gx,Ex"); + nextop = F8; + GETG; + if(MODREG && ((nextop&7)+(rex.b<<3)==gd)) { + // special case for PXOR Gx, Gx + q0 = sse_get_reg_empty(dyn, ninst, x1, gd); + VEORQ(q0, q0, q0); + } else { + q0 = sse_get_reg(dyn, ninst, x1, gd, 1); + if(MODREG) { + q1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); + } else { + q1 = fpu_get_scratch(dyn, ninst); + addr = geted32(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); + VLD128(q1, ed, fixedaddress); + } + VEORQ(q0, q0, q1); + } + break; + case 0xFE: INST_NAME("PADDD Gx,Ex"); nextop = F8; |