about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-22 17:51:04 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-22 17:51:04 +0100
commitcb0cceb9ae54ed5cd28d45b50625ae81ac030ab2 (patch)
treea76deb89a1eae79c7a497a52a20cce386015d52c /src
parent1405d83a56433080edded7ae59d01aa5eb9324c2 (diff)
downloadbox64-cb0cceb9ae54ed5cd28d45b50625ae81ac030ab2.tar.gz
box64-cb0cceb9ae54ed5cd28d45b50625ae81ac030ab2.zip
[DYNAREC] Small option on REP MOVSD, and go back to LDAXR/STLXR for xchg (IntoTheBreach seems to prefer)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c8
-rwxr-xr-xsrc/dynarec/dynarec_arm64_helper.h4
2 files changed, 8 insertions, 4 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index e5295b82..99a2cab6 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -848,8 +848,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 TSTx_mask(ed, 1, 0, 1+rex.w);    // mask=3 or 7
                 B_MARK(cNE);
                 MARKLOCK;
-                LDXRxw(x1, ed);
-                STXRxw(x3, gd, ed);
+                LDAXRxw(x1, ed);
+                STLXRxw(x3, gd, ed);
                 CBNZx_MARKLOCK(x3);
                 B_MARK2_nocond;
                 MARK;
@@ -977,8 +977,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 STRxw_U12(x1, xRDI, 0);
                 ADDx_REG(xRSI, xRSI, x3);
                 ADDx_REG(xRDI, xRDI, x3);
-                SUBSx_U12(xRCX, xRCX, 1);
-                B_MARK(cNE);
+                SUBx_U12(xRCX, xRCX, 1);
+                CBNZx_MARK(xRCX);
                 // done
             } else {
                 INST_NAME("MOVSD");
diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h
index 7c1d4ca7..d4920dec 100755
--- a/src/dynarec/dynarec_arm64_helper.h
+++ b/src/dynarec/dynarec_arm64_helper.h
@@ -261,6 +261,10 @@
 #define B_MARK_nocond               \
     j32 = GETMARK-(dyn->arm_size);  \
     B(j32)
+// Branch to MARK if reg is not 0 (use j32)
+#define CBNZx_MARK(reg)            \
+    j32 = GETMARK-(dyn->arm_size); \
+    CBNZx(reg, j32)
 // Branch to MARK2 if cond (use j32)
 #define B_MARK2(cond)               \
     j32 = GETMARK2-(dyn->arm_size); \