about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
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: