diff options
| -rwxr-xr-x | src/dynarec/dynarec_arm64_00.c | 10 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_helper.h | 12 |
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); \ |