about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-23 17:26:59 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-23 17:26:59 +0100
commitb1d5e27564f0cce7d38b3ab8167657ede4833ca8 (patch)
tree8d7391c44be73f46b86e3bcbb22b8df00325fdff
parent732f2f106b6600c3e37f870fd2b915c3e97ad1af (diff)
downloadbox64-b1d5e27564f0cce7d38b3ab8167657ede4833ca8.tar.gz
box64-b1d5e27564f0cce7d38b3ab8167657ede4833ca8.zip
[DYNAREC] Added (F2/F3) A4 opcode
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index 4ceabefc..2e44b5bf 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -966,6 +966,32 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             SET_DFNONE(x1);
             break;
 
+        case 0xA4:
+            if(rep) {
+                INST_NAME("REP MOVSB");
+                CBZx_NEXT(xRCX);
+                TBNZ_MARK2(xFlags, F_DF);
+                MARK;   // Part with DF==0
+                LDRB_S9_postindex(x1, xRSI, 1);
+                STRB_S9_postindex(x1, xRDI, 1);
+                SUBx_U12(xRCX, xRCX, 1);
+                CBNZx_MARK(xRCX);
+                B_NEXT_nocond;
+                MARK2;  // Part with DF==1
+                LDRB_S9_postindex(x1, xRSI, -1);
+                STRB_S9_postindex(x1, xRDI, -1);
+                SUBx_U12(xRCX, xRCX, 1);
+                CBNZx_MARK2(xRCX);
+                // done
+            } else {
+                INST_NAME("MOVSB");
+                GETDIR(x3, 1);
+                LDRB_U12(x1, xRSI, 0);
+                STRB_U12(x1, xRDI, 0);
+                ADDx_REG(xRSI, xRSI, x3);
+                ADDx_REG(xRDI, xRDI, x3);
+            }
+            break;
         case 0xA5:
             if(rep) {
                 INST_NAME("REP MOVSD");