about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index 2d51440b..69cc17b8 100644
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -1275,9 +1275,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
         case 0x57:

             INST_NAME("XORPD Gx, Ex");

             nextop = F8;

-            GETEX(q0, 0, 0);

-            GETGX(v0, 1);

-            VEORQ(v0, v0, q0);

+            GETG;

+            if(MODREG && ((nextop&7)+(rex.b<<3)==gd)) {

+                // special case for XORPD 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);

+                GETEX(q1, 0, 0);

+                VEORQ(q0, q0, q1);

+            }

             break;

         case 0x58:

             INST_NAME("ADDPD Gx, Ex");