about summary refs log tree commit diff stats
path: root/src/dynarec/rv64/dynarec_rv64_66.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dynarec/rv64/dynarec_rv64_66.c')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c
index 36359a20..ddf79b51 100644
--- a/src/dynarec/rv64/dynarec_rv64_66.c
+++ b/src/dynarec/rv64/dynarec_rv64_66.c
@@ -538,6 +538,54 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 ADD(xRDI, xRDI, x3);
             }
             break;
+
+        case 0xAF:
+            switch (rep) {
+                case 1:
+                case 2:
+                    if(rep==1) {INST_NAME("REPNZ SCASW");} else {INST_NAME("REPZ SCASW");}
+                    MAYSETFLAGS();
+                    SETFLAGS(X_ALL, SF_SET_PENDING);
+                    CBZ_NEXT(xRCX);
+                    GETDIR(x3, x1, rex.w?8:2);
+                    if (rex.w) {
+                        MARK;
+                        LD(x2, xRDI, 0);
+                        ADD(xRDI, xRDI, x3);
+                        ADDI(xRCX, xRCX, -1);
+                        if (rep==1) {BEQ_MARK3(xRAX, x2);} else {BNE_MARK3(xRAX, x2);}
+                        BNE_MARK(xRCX, xZR);
+                        MARK3;
+                        emit_cmp32(dyn, ninst, rex, xRAX, x2, x3, x4, x5, x6);
+                    } else {
+                        ZEXTH(x1, xRAX);
+                        MARK;
+                        LHU(x2, xRDI, 0);
+                        ADD(xRDI, xRDI, x3);
+                        ADDI(xRCX, xRCX, -1);
+                        if (rep==1) {BEQ_MARK3(x1, x2);} else {BNE_MARK3(x1, x2);}
+                        BNE_MARK(xRCX, xZR);
+                        MARK3;
+                        emit_cmp16(dyn, ninst, x1, x2, x3, x4, x5, x6);
+                    }
+                    break;
+                default:
+                    INST_NAME("SCASW");
+                    SETFLAGS(X_ALL, SF_SET_PENDING);
+                    GETDIR(x3, x1, rex.w?8:2);
+                    if (rex.w) {
+                        LD(x2, xRDI, 0);
+                        emit_cmp32(dyn, ninst, rex, xRAX, x2, x3, x4, x5, x6);
+                    } else {
+                        ZEXTH(x1, xRAX);
+                        LHU(x2, xRDI, 0);
+                        emit_cmp16(dyn, ninst, x1, x2, x3, x4, x5, x6);
+                    }
+                    ADD(xRDI, xRDI, x3);
+                    break;
+            }
+            break;
+
         case 0xB8:
         case 0xB9:
         case 0xBA: