diff options
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); |