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_0f.c15
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c1
2 files changed, 11 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 1172789a..581d4821 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -2656,9 +2656,11 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             GETGM(d0);

             GETEM(d1, 0);

             v0 = fpu_get_scratch(dyn);

-            VMOVeD(v0, 0, d1, 0);

-            VMOVeD(v0, 1, d1, 0);

-            SQXTN_32(v0, v0); // 2*q1 in 32bits now

+            v1 = fpu_get_scratch(dyn);

+            UQXTN_32(v0, d1);

+            MOVI_32(v1, 32);

+            UMIN_32(v0, v0, v1); // limit to 0 .. +32 values

+            VDUPQ_32(v0, v0, 0);

             SSHL_32(d0, d0, v0);

             break;

         case 0xF3:

@@ -2666,7 +2668,12 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             nextop = F8;

             GETGM(d0);

             GETEM(d1, 0);

-            USHL_R_64(d0, d0, d1);

+            v0 = fpu_get_scratch(dyn);

+            v1 = fpu_get_scratch(dyn);

+            UQXTN_32(v0, d1);

+            MOVI_32(v1, 64);

+            UMIN_32(v0, v0, v1); // limit to 0 .. +64 values

+            USHL_R_64(d0, d0, v0);

             break;

         case 0xF4:

             INST_NAME("PMULUDQ Gm,Em");

diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index fe4ef9fb..ade88377 100644
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -3074,7 +3074,6 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             GETGX(q0, 1);

             GETEX(q1, 0, 0);

             v0 = fpu_get_scratch(dyn);

-            v0 = fpu_get_scratch(dyn);

             v1 = fpu_get_scratch(dyn);

             UQXTN_32(v0, q1);

             MOVI_32(v1, 64);