about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-04-25 16:10:16 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-04-25 16:10:16 +0200
commitc6f0872e50ce05820becffc27815908a6cba96c6 (patch)
tree1d09b5e48ce86a81472e067693db785cbfd8078c /src
parent71dc02e06f7c99d947dcfc1a5b222413615578cf (diff)
downloadbox64-c6f0872e50ce05820becffc27815908a6cba96c6.tar.gz
box64-c6f0872e50ce05820becffc27815908a6cba96c6.zip
[ARM64_DYNAREC] Minor change, (V)PMOVMSKB is only valid on register, not memory
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c38
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f.c48
2 files changed, 47 insertions, 39 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index 5eeba96f..50100d12 100644
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -2972,23 +2972,27 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             break;

         case 0xD7:

             nextop = F8;

-            INST_NAME("PMOVMSKB Gd, Ex");

-            v0 = fpu_get_scratch(dyn, ninst);

-            v1 = fpu_get_scratch(dyn, ninst);

-            q1 = fpu_get_scratch(dyn, ninst);

-            GETEX(q0, 0, 0);

-            GETGD;

-            TABLE64(x2, 0x0706050403020100LL);

-            VDUPQD(v0, x2);

-            VSHRQ_8(q1, q0, 7);

-            USHLQ_8(q1, q1, v0); // shift

-            UADDLV_8(v1, q1);   // accumalte

-            VMOVBto(gd, v1, 0);

-            // and now the high part

-            VMOVeD(q1, 0, q1, 1);

-            UADDLV_8(q1, q1);   // accumalte

-            VMOVBto(x2, q1, 0);

-            BFIw(gd, x2, 8, 8);

+            if(MODREG) {

+                INST_NAME("PMOVMSKB Gd, Ex");

+                v0 = fpu_get_scratch(dyn, ninst);

+                v1 = fpu_get_scratch(dyn, ninst);

+                q1 = fpu_get_scratch(dyn, ninst);

+                GETEX(q0, 0, 0);

+                GETGD;

+                TABLE64(x2, 0x0706050403020100LL);

+                VDUPQD(v0, x2);

+                VSHRQ_8(q1, q0, 7);

+                USHLQ_8(q1, q1, v0); // shift

+                UADDLV_8(v1, q1);   // accumalte

+                VMOVBto(gd, v1, 0);

+                // and now the high part

+                VMOVeD(q1, 0, q1, 1);

+                UADDLV_8(q1, q1);   // accumalte

+                VMOVBto(x2, q1, 0);

+                BFIw(gd, x2, 8, 8);

+            } else {

+                DEFAULT;

+            }

             break;

         case 0xD8:

             INST_NAME("PSUBUSB Gx, Ex");

diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
index 5fa954c0..7f33f8d3 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
@@ -1420,35 +1420,39 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             break;
         case 0xD7:
             nextop = F8;
-            INST_NAME("VPMOVMSKB Gd, Ex");
-            v0 = fpu_get_scratch(dyn, ninst);
-            v1 = fpu_get_scratch(dyn, ninst);
-            q1 = fpu_get_scratch(dyn, ninst);
-            GETEX_Y(q0, 0, 0);
-            GETGD;
-            TABLE64(x2, 0x0706050403020100LL);
-            VDUPQD(v0, x2);
-            VSHRQ_8(q1, q0, 7);
-            USHLQ_8(q1, q1, v0); // shift
-            UADDLV_8(v1, q1);   // accumalte
-            VMOVBto(gd, v1, 0);
-            // and now the high part
-            VMOVeD(q1, 0, q1, 1);
-            UADDLV_8(q1, q1);   // accumalte
-            VMOVBto(x2, q1, 0);
-            BFIw(gd, x2, 8, 8);
-            if(vex.l) {
-                GETEY(q0);
+            if(MODREG) {
+                INST_NAME("VPMOVMSKB Gd, Ex");
+                v0 = fpu_get_scratch(dyn, ninst);
+                v1 = fpu_get_scratch(dyn, ninst);
+                q1 = fpu_get_scratch(dyn, ninst);
+                GETEX_Y(q0, 0, 0);
+                GETGD;
+                TABLE64(x2, 0x0706050403020100LL);
+                VDUPQD(v0, x2);
                 VSHRQ_8(q1, q0, 7);
                 USHLQ_8(q1, q1, v0); // shift
                 UADDLV_8(v1, q1);   // accumalte
-                VMOVBto(x2, v1, 0);
-                BFIw(gd, x2, 16, 8);
+                VMOVBto(gd, v1, 0);
                 // and now the high part
                 VMOVeD(q1, 0, q1, 1);
                 UADDLV_8(q1, q1);   // accumalte
                 VMOVBto(x2, q1, 0);
-                BFIw(gd, x2, 24, 8);
+                BFIw(gd, x2, 8, 8);
+                if(vex.l) {
+                    GETEY(q0);
+                    VSHRQ_8(q1, q0, 7);
+                    USHLQ_8(q1, q1, v0); // shift
+                    UADDLV_8(v1, q1);   // accumalte
+                    VMOVBto(x2, v1, 0);
+                    BFIw(gd, x2, 16, 8);
+                    // and now the high part
+                    VMOVeD(q1, 0, q1, 1);
+                    UADDLV_8(q1, q1);   // accumalte
+                    VMOVBto(x2, q1, 0);
+                    BFIw(gd, x2, 24, 8);
+                }
+            } else {
+                DEFAULT;
             }
             break;
         case 0xD8: