From eb59ff2ebdc4fd088f98a46a3f732291ae84376b Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Tue, 21 May 2024 16:27:13 +0800 Subject: [ARM64_DYNAREC] Fixed PSLLD/PSLLQ opcodes (#1512) --- src/dynarec/arm64/dynarec_arm64_0f.c | 15 +++++++++++---- src/dynarec/arm64/dynarec_arm64_660f.c | 1 - 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); -- cgit 1.4.1