about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-30 20:24:34 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-30 20:24:34 +0200
commita02283264a50176fbb1f5f2220cbe0591f846bc2 (patch)
tree6e640c8a118c9a88e928bb388c924b3544582072 /src
parent7a7e9ee9af6af2224b4d519fb17d3f50fd2077f5 (diff)
downloadbox64-a02283264a50176fbb1f5f2220cbe0591f846bc2.tar.gz
box64-a02283264a50176fbb1f5f2220cbe0591f846bc2.zip
[ARM64_DYNAREC] Fixed AVX.0F 12/13 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_0f.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_0f.c
index 9f0e1424..e7ccee1e 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_0f.c
@@ -116,27 +116,37 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
             break;
         case 0x12:
             nextop = F8;
+            GETVX(v2, 0);
             if(MODREG) {
-                INST_NAME("VMOVHLPS Gx,Ex");
-                GETGX(v0, 1);
+                INST_NAME("VMOVHLPS Gx, Vx, Ex");
                 v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
+                GETGX_empty(v0);
+                if((v0!=v2) && (v0!=v1))
+                    VMOVQ(v0, v2);
                 VMOVeD(v0, 0, v1, 1);
+                if((v0!=v2) && (v0==v1))
+                    VMOVeD(v0, 1, v2, 1);
             } else {
-                INST_NAME("VMOVLPS Gx,Ex");
-                GETGX(v0, 1);
+                INST_NAME("VMOVLPS Gx, Vx, Ex");
+                GETGX_empty(v0);
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
+                if(v0!=v2)
+                    VMOVQ(v0, v2);
                 VLD1_64(v0, 0, ed);
             }
             YMM0(gd);
             break;
         case 0x13:
             nextop = F8;
-            INST_NAME("VMOVLPS Ex,Gx");
+            INST_NAME("VMOVLPS Ex, Vx, Gx");
             GETGX(v0, 0);
+            GETVX(v2, 0);
+            if(v1!=v2)
+                VMOVQ(v0, v2);
             if(MODREG) {
                 v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 1);
-                VMOVeD(v1, 0, v0, 0);
+                if(v0!=v1) VMOVeD(v1, 0, v0, 0);
             } else {
                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
                 VST1_64(v0, 0, ed);  // better to use VST1 than VSTR_64, to avoid NEON->VFPU transfert I assume