about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 5c718b8d..63aee428 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1545,7 +1545,25 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 ADDx_REG(xRDI, xRDI, x3);
             }
             break;
-
+        case 0xAC:
+            if(rep) {
+                INST_NAME("REP LODSB");
+            } else {
+                INST_NAME("LODSB");
+            }
+            GETDIR(x1, 1);
+            if(rep) {
+                CBZx_NEXT(xRCX);
+                MARK;
+            }
+            LDRB_U12(x2, xRSI, 0);
+            ADDx_REG(xRSI, xRSI, x1);
+            if(rep) {
+                SUBx_U12(xRCX, xRCX, 1);
+                CBNZx_MARK(xRCX);
+            }
+            BFIx(xRAX, x2, 0, 8);
+            break;
         case 0xAD:
             if(rep) {
                 INST_NAME("REP LODSD");
@@ -1560,7 +1578,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             LDRxw_U12(xRAX, xRSI, 0);
             ADDx_REG(xRSI, xRSI, x1);
             if(rep) {
-                ADDx_U12(xRCX, xRCX, 1);
+                SUBx_U12(xRCX, xRCX, 1);
                 CBNZx_MARK(xRCX);
             }
             break;