about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_00.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 6eed0d31..2a5d4faf 100755
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -750,6 +750,34 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             }
             break;
 
+        case 0x6D:
+            if(rex.is32bits) {
+                if(rep) {
+                    // Faking port read
+                    INST_NAME("REP INSD");
+                    CBZx_NEXT(xRCX);
+                    TBNZ_MARK2(xFlags, F_DF);
+                    MARK;   // Part with DF==0
+                    STRH_S9_postindex(xZR, xRDI, 4);
+                    SUBx_U12(xRCX, xRCX, 1);
+                    CBNZx_MARK(xRCX);
+                    B_NEXT_nocond;
+                    MARK2;  // Part with DF==1
+                    STRH_S9_postindex(xZR, xRDI, -4);
+                    SUBx_U12(xRCX, xRCX, 1);
+                    CBNZx_MARK2(xRCX);
+                    // done
+                } else {
+                    INST_NAME("INSD");
+                    GETDIR(x3, 4);
+                    STRH_U12(xZR, xRDI, 0);
+                    ADDx_REG(xRDI, xRDI, x3);
+                }
+            } else {
+                DEFAULT;
+            }
+            break;
+
         #define GO(GETFLAGS, NO, YES, F)                                \
             READFLAGS(F);                                               \
             i8 = F8S;                                                   \