about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c10
-rwxr-xr-xsrc/dynarec/dynarec_arm64_helper.h12
2 files changed, 20 insertions, 2 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index bb40a9a7..4cd18a25 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -2319,9 +2319,15 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             MOVx_REG(xRAX, x2);
                         } else {
                             GETEDH(x1, 0);  // get edd changed addr, so cannot be called 2 times for same op...
-                            CBZxw_MARK(xRDX);
+                            //Need to see if RDX==0 and RAX not signed
+                            // or RDX==-1 and RAX signed
+                            CBNZx_MARK2(xRDX);
+                            TBZ_MARK(xRAX, 31);
+                            MARK2;
                             MVNx_REG(x2, xRDX);
-                            CBZxw_MARK(x2);
+                            CBNZx_MARK3(x2);
+                            TBNZ_MARK(xRAX, 31);
+                            MARK3;
                             if(ed!=x1) {MOVx_REG(x1, ed);}
                             CALL((void*)idiv64, -1);
                             B_NEXT_nocond;
diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h
index b16c2b8f..5a50c0c0 100755
--- a/src/dynarec/dynarec_arm64_helper.h
+++ b/src/dynarec/dynarec_arm64_helper.h
@@ -345,6 +345,14 @@
 #define CBNZw_MARK(reg)             \
     j64 = GETMARK-(dyn->arm_size);  \
     CBNZw(reg, j64)
+// Test bit N of A and branch to MARK if not set
+#define TBZ_MARK(A, N)              \
+    j64 = GETMARK2-(dyn->arm_size); \
+    TBZ(A, N, j64)
+// Test bit N of A and branch to MARK if set
+#define TBNZ_MARK(A, N)             \
+    j64 = GETMARK2-(dyn->arm_size); \
+    TBNZ(A, N, j64)
 // Branch to MARK2 if cond (use j64)
 #define B_MARK2(cond)               \
     j64 = GETMARK2-(dyn->arm_size); \
@@ -373,6 +381,10 @@
 #define CBNZx_MARK3(reg)            \
     j64 = GETMARK3-(dyn->arm_size); \
     CBNZx(reg, j64)
+// Branch to MARK3 if reg is 0 (use j64)
+#define CBZx_MARK3(reg)             \
+    j64 = GETMARK3-(dyn->arm_size); \
+    CBZx(reg, j64)
 // Test bit N of A and branch to MARK3 if set
 #define TBNZ_MARK3(A, N)            \
     j64 = GETMARK3-(dyn->arm_size); \