about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-05-21 16:27:13 +0800
committerGitHub <noreply@github.com>2024-05-21 10:27:13 +0200
commiteb59ff2ebdc4fd088f98a46a3f732291ae84376b (patch)
tree65e259a3d9ffee74565fd26911564375f08352cf /src
parent7842c9e34d7ee5a2e8dd8e5cb690404e71553a45 (diff)
downloadbox64-eb59ff2ebdc4fd088f98a46a3f732291ae84376b.tar.gz
box64-eb59ff2ebdc4fd088f98a46a3f732291ae84376b.zip
[ARM64_DYNAREC] Fixed PSLLD/PSLLQ opcodes (#1512)
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);