about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <seebastien.chev@gmail.com>2023-09-16 13:57:08 +0200
committerptitSeb <seebastien.chev@gmail.com>2023-09-16 13:57:08 +0200
commitc9549e8ab6b162df263138ce92d2f9536cf3ff8d (patch)
treeb58d8442ad46eb023f276767a4da7aa410a86f5a /src
parent5903f0208689b3996ff8c6439ed5b25fc2f8666e (diff)
downloadbox64-c9549e8ab6b162df263138ce92d2f9536cf3ff8d.tar.gz
box64-c9549e8ab6b162df263138ce92d2f9536cf3ff8d.zip
[ARM64_DYNAREC] Added (F2/F3) AF opcode (for #975)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index f960dc83..302a70c9 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1619,6 +1619,42 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 break;
             }
             break;
+        case 0xAF:
+            switch(rep) {
+            case 1:
+            case 2:
+                if(rep==1) {INST_NAME("REPNZ SCASD");} else {INST_NAME("REPZ SCASD");}
+                MAYSETFLAGS();
+                SETFLAGS(X_ALL, SF_SET_PENDING);
+                CBZx_NEXT(xRCX);
+                TBNZ_MARK2(xFlags, F_DF);
+                MARK;   // Part with DF==0
+                LDRxw_S9_postindex(x2, xRDI, rex.w?8:4);
+                SUBx_U12(xRCX, xRCX, 1);
+                CMPSxw_REG(xRAX, x2);
+                B_MARK3((rep==1)?cEQ:cNE);
+                CBNZx_MARK(xRCX);
+                B_MARK3_nocond;
+                MARK2;  // Part with DF==1
+                LDRxw_S9_postindex(x2, xRDI, rex.w?-8:-4);
+                SUBx_U12(xRCX, xRCX, 1);
+                CMPSxw_REG(xRAX, x2);
+                B_MARK3((rep==1)?cEQ:cNE);
+                CBNZx_MARK2(xRCX);
+                MARK3;  // end
+                emit_cmp32(dyn, ninst, rex, xRAX, x2, x3, x4, x5);
+                break;
+            default:
+                INST_NAME("SCASD");
+                SETFLAGS(X_ALL, SF_SET_PENDING);
+                GETDIR(x3, 1);
+                UBFXw(x1, xRAX, 0, 8);
+                LDRB_U12(x2, xRDI, 0);
+                ADDx_REG(xRDI, xRDI, x3);
+                emit_cmp8(dyn, ninst, x1, x2, x3, x4, x5);
+                break;
+            }
+            break;
 
 
         case 0xB0: