From 9f260eb86c9d905a8c8796d89bcccb415dccbe95 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 1 Jun 2024 11:38:32 +0200 Subject: [ARM64_DYNAREC] Fix issue with 66 0F 38 DC-DF when rare case of dest==src --- src/dynarec/arm64/dynarec_arm64_660f.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 79173acf..3ed61e95 100644 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -800,12 +800,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VEORQ(q0, v0, q1); } else { GETG; + GETEX(q1, 0, 0); + if(MODREG && (gd==(nextop&7)+(rex.b<<3))) { + d0 = fpu_get_scratch(dyn, ninst); + VMOVQ(d0, q1); + } else d0 = -1; sse_forget_reg(dyn, ninst, gd); MOV32w(x1, gd); CALL(native_aese, -1); GETGX(q0, 1); - GETEX(q1, 0, 0); - VEORQ(q0, q0, q1); + VEORQ(q0, q0, (d0!=-1)?d0:q1); } break; case 0xDD: @@ -820,12 +824,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VEORQ(q0, v0, q1); } else { GETG; + GETEX(q1, 0, 0); + if(MODREG && (gd==(nextop&7)+(rex.b<<3))) { + d0 = fpu_get_scratch(dyn, ninst); + VMOVQ(d0, q1); + } else d0 = -1; sse_forget_reg(dyn, ninst, gd); MOV32w(x1, gd); CALL(native_aeselast, -1); GETGX(q0, 1); - GETEX(q1, 0, 0); - VEORQ(q0, q0, q1); + VEORQ(q0, q0, (d0!=-1)?d0:q1); } break; case 0xDE: @@ -841,12 +849,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VEORQ(q0, v0, q1); } else { GETG; + GETEX(q1, 0, 0); + if(MODREG && (gd==(nextop&7)+(rex.b<<3))) { + d0 = fpu_get_scratch(dyn, ninst); + VMOVQ(d0, q1); + } else d0 = -1; sse_forget_reg(dyn, ninst, gd); MOV32w(x1, gd); CALL(native_aesd, -1); GETGX(q0, 1); - GETEX(q1, 0, 0); - VEORQ(q0, q0, q1); + VEORQ(q0, q0, (d0!=-1)?d0:q1); } break; case 0xDF: @@ -861,12 +873,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VEORQ(q0, v0, q1); } else { GETG; + GETEX(q1, 0, 0); + if(MODREG && (gd==(nextop&7)+(rex.b<<3))) { + d0 = fpu_get_scratch(dyn, ninst); + VMOVQ(d0, q1); + } else d0 = -1; sse_forget_reg(dyn, ninst, gd); MOV32w(x1, gd); CALL(native_aesdlast, -1); GETGX(q0, 1); - GETEX(q1, 0, 0); - VEORQ(q0, q0, q1); + VEORQ(q0, q0, (d0!=-1)?d0:q1); } break; case 0xF0: -- cgit 1.4.1