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_avx_0f38.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_0f38.c
index 9b7ae7a0..f9e3a9e8 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_0f38.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_0f38.c
@@ -273,22 +273,24 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i
             GETGD;
             GETED(0);
             GETVD;
-            MOV64xw(x1, 0);
-            UXTBw(x2, vd);          // start
-            BFXILw(x3, vd, 8, 8);   // length
+            MOV64xw(x5, 0);
+            UXTBw(x4, vd);          // start
+            UBFXw(x3, vd, 8, 8);   // length
             TSTw_REG(x3, x3);
             B_MARK(cEQ);
-            LSRxw_REG(x1, ed, x2);
-            CMPSw_U12(x3, rex.w?64:32);
+            CMPSw_U12(x4, rex.w?64:32);
             B_MARK(cGE);
-            MOV32w(x2, rex.w?64:32);
-            SUBw_REG(x2, x2, x3);
-            LSLxw_REG(x1, x1, x2);
-            LSRxw_REG(x1, x1, x2);
-            TSTxw_REG(x1, x1);
+            LSRxw_REG(x5, ed, x4);
+            CMPSw_U12(x3, rex.w?64:32);
+            B_MARK(cGT);
+            MOV32w(x4, rex.w?64:32);
+            SUBw_REG(x4, x4, x3);
+            LSLxw_REG(x5, x5, x4);
+            LSRxw_REG(x5, x5, x4);
             MARK;
-            MOVxw_REG(gd, x1);
+            MOVxw_REG(gd, x5);
             IFX(X_ZF) {
+                TSTxw_REG(x5, x5);
                 IFNATIVE(NF_EQ) {} else {
                     CSETw(x3, cEQ);
                     BFIw(xFlags, x3, F_ZF, 1);