about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-23 09:35:21 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-23 09:35:21 +0100
commitb9779c21847ba69df0e837dabf6bc9e965b533db (patch)
tree62d149c7791fd56c50603987e7b4ecaf7c9fc772 /src
parente52c207c751536e7db6b7f553903d225f1783b39 (diff)
downloadbox64-b9779c21847ba69df0e837dabf6bc9e965b533db.tar.gz
box64-b9779c21847ba69df0e837dabf6bc9e965b533db.zip
[DYNAREC] Optimized F2/F3 A5 opcode
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index 776fb3ae..72bb24cf 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -969,16 +969,19 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0xA5:
             if(rep) {
                 INST_NAME("REP MOVSD");
-                TSTw_REG(xRCX, xRCX);
-                B_NEXT(cEQ);    // end of loop
-                GETDIR(x3, rex.w?8:4);
-                MARK;
-                LDRxw_U12(x1, xRSI, 0);
-                STRxw_U12(x1, xRDI, 0);
-                ADDx_REG(xRSI, xRSI, x3);
-                ADDx_REG(xRDI, xRDI, x3);
+                CBZx_NEXT(xRCX);
+                TBNZ_MARK2(xFlags, F_DF);
+                MARK;   // Part with DF==0
+                LDRxw_S9_postindex(x1, xRSI, rex.w?8:4);
+                STRxw_S9_postindex(x1, xRDI, rex.w?8:4);
                 SUBx_U12(xRCX, xRCX, 1);
                 CBNZx_MARK(xRCX);
+                B_NEXT_nocond;
+                MARK2;  // Part with DF==1
+                LDRxw_S9_postindex(x1, xRSI, rex.w?-8:-4);
+                STRxw_S9_postindex(x1, xRDI, rex.w?-8:-4);
+                SUBx_U12(xRCX, xRCX, 1);
+                CBNZx_MARK2(xRCX);
                 // done
             } else {
                 INST_NAME("MOVSD");