From cb0cceb9ae54ed5cd28d45b50625ae81ac030ab2 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 22 Mar 2021 17:51:04 +0100 Subject: [DYNAREC] Small option on REP MOVSD, and go back to LDAXR/STLXR for xchg (IntoTheBreach seems to prefer) --- src/dynarec/dynarec_arm64_00.c | 8 ++++---- src/dynarec/dynarec_arm64_helper.h | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'src') 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); \ -- cgit 1.4.1