From 10cbb3c8a90c06fc76cdcffbb0f64bc789d52fdd Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Fri, 21 Mar 2025 11:30:50 +0100 Subject: [ARM64_DYNAREC] Added 67 66 0F 76/EF opcodes (for #1046) --- src/dynarec/arm64/dynarec_arm64_67.c | 37 +++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'src') 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; -- cgit 1.4.1