about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-02-13 13:10:24 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-02-13 13:10:24 +0100
commit59e1da5f74c0bd72374ff97f2a222d4c220012fb (patch)
tree7c2da54dd368574814ae3a6086f1f47c9c11f185 /src
parent639466d45aa2d322e3bc770b7562f3385814e935 (diff)
downloadbox64-59e1da5f74c0bd72374ff97f2a222d4c220012fb.tar.gz
box64-59e1da5f74c0bd72374ff97f2a222d4c220012fb.zip
[ARM64_DYNAREC] The check on REP MOVSB overlapping memory is done with saflags=1 now
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c4
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c28
2 files changed, 28 insertions, 4 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 0b01123c..1bb39f19 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1676,7 +1676,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 IF_UNALIGNED(ip) {
                     // special optim for large RCX value on forward case only
                     // but because it's unaligned path, check if a byte per byt is needed, and do 4-bytes per 4-bytes only instead
-                    if(BOX64DRENV(dynarec_safeflags)>1) {
+                    if(BOX64DRENV(dynarec_safeflags)) {
                         SUBx_REG(x2, xRDI, xRSI);
                         CMPSx_U12(x2, 4);
                         B_MARK(cCC);
@@ -1693,7 +1693,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     CBNZx_MARK3(xRCX);
                     CBZx_MARKLOCK(xRCX);
                 } else {
-                    if(BOX64DRENV(dynarec_safeflags)>1) {
+                    if(BOX64DRENV(dynarec_safeflags)) {
                         SUBx_REG(x2, xRDI, xRSI);
                         CMPSx_U12(x2, 8);
                         B_MARK(cCC);
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index 0b110ce4..74b19c31 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -778,7 +778,31 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 INST_NAME("REP MOVSB");

                 CBZx_NEXT(xRCX);

                 TBNZ_MARK2(xFlags, F_DF);

-                IF_ALIGNED (ip) {

+                IF_UNALIGNED(ip) {

+                    // special optim for large RCX value on forward case only

+                    // but because it's unaligned path, check if a byte per byt is needed, and do 4-bytes per 4-bytes only instead

+                    if(BOX64DRENV(dynarec_safeflags)) {

+                        SUBx_REG(x2, xRDI, xRSI);

+                        CMPSx_U12(x2, 4);

+                        B_MARK(cCC);

+                    }

+                    ORRw_REG(x1, xRSI, xRDI);

+                    ANDw_mask(x1, x1, 0, 1);    //mask = 3

+                    CBNZw_MARK(x1);

+                    MARK3;

+                    CMPSx_U12(xRCX, 4);

+                    B_MARK(cCC);

+                    LDRw_S9_postindex(x1, xRSI, 4);

+                    STRw_S9_postindex(x1, xRDI, 4);

+                    SUBx_U12(xRCX, xRCX, 4);

+                    CBNZx_MARK3(xRCX);

+                    CBZx_MARKLOCK(xRCX);

+                } else {

+                    if(BOX64DRENV(dynarec_safeflags)) {

+                        SUBx_REG(x2, xRDI, xRSI);

+                        CMPSx_U12(x2, 8);

+                        B_MARK(cCC);

+                    }

                     // special optim for large RCX value on forward case only

                     MARK3;

                     CMPSx_U12(xRCX, 8);

@@ -794,7 +818,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 STRB_S9_postindex(x1, xRDI, 1);

                 SUBx_U12(xRCX, xRCX, 1);

                 CBNZx_MARK(xRCX);

-                B_NEXT_nocond;

+                B_MARKLOCK_nocond;

                 MARK2;  // Part with DF==1

                 LDRB_S9_postindex(x1, xRSI, -1);

                 STRB_S9_postindex(x1, xRDI, -1);