about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-06-25 10:16:40 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-06-25 10:16:40 +0200
commit70ee5f0c83eafb082eccc14a0157844672a7c68d (patch)
treeb5fa5c5833f93b5926d12ff891b11b06f5f3966a
parent266bb4aa88fa8e7f5fe90de5b4f20e9ccc201786 (diff)
downloadbox64-70ee5f0c83eafb082eccc14a0157844672a7c68d.tar.gz
box64-70ee5f0c83eafb082eccc14a0157844672a7c68d.zip
[ARM64_DYNAREC] Fixed BEXTR opcode
-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);