diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-05-21 16:27:13 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-21 10:27:13 +0200 |
| commit | eb59ff2ebdc4fd088f98a46a3f732291ae84376b (patch) | |
| tree | 65e259a3d9ffee74565fd26911564375f08352cf /src | |
| parent | 7842c9e34d7ee5a2e8dd8e5cb690404e71553a45 (diff) | |
| download | box64-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.c | 15 | ||||
| -rw-r--r-- | 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); |