about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-22 14:21:51 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-22 14:21:51 +0100
commite6d3812d6c3df3d25ccb7201ec333ed3d4bb5432 (patch)
tree60e9de187de731f1fddef6fc5d6cb8d78d706ca8 /src
parentc02946a913ad8b264f0babca15b4d040e66a01bb (diff)
downloadbox64-e6d3812d6c3df3d25ccb7201ec333ed3d4bb5432.tar.gz
box64-e6d3812d6c3df3d25ccb7201ec333ed3d4bb5432.zip
[DYNAREC] Added C0 opcode
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c91
1 files changed, 90 insertions, 1 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index 2fb108b2..4c8e3e6d 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -1032,7 +1032,96 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 MOV32w(gd, u32);
             }
             break;
-
+        case 0xC0:
+            nextop = F8;
+            switch((nextop>>3)&7) {
+                case 0:
+                    INST_NAME("ROL Eb, Ib");
+                    SETFLAGS(X_OF|X_CF, SF_SUBSET);
+                    GETEB(x1, 1);
+                    u8 = F8;
+                    MOV32w(x2, u8);
+                    CALL_(rol8, ed, x3);
+                    EBBACK;
+                    break;
+                case 1:
+                    INST_NAME("ROR Eb, Ib");
+                    SETFLAGS(X_OF|X_CF, SF_SUBSET);
+                    GETEB(x1, 1);
+                    u8 = F8;
+                    MOV32w(x2, u8);
+                    CALL_(ror8, ed, x3);
+                    EBBACK;
+                    break;
+                case 2:
+                    INST_NAME("RCL Eb, Ib");
+                    READFLAGS(X_CF);
+                    SETFLAGS(X_OF|X_CF, SF_SET);
+                    GETEB(x1, 1);
+                    u8 = F8;
+                    MOV32w(x2, u8);
+                    CALL_(rcl8, ed, x3);
+                    EBBACK;
+                    break;
+                case 3:
+                    INST_NAME("RCR Eb, Ib");
+                    READFLAGS(X_CF);
+                    SETFLAGS(X_OF|X_CF, SF_SET);
+                    GETEB(x1, 1);
+                    u8 = F8;
+                    MOV32w(x2, u8);
+                    CALL_(rcr8, ed, x3);
+                    EBBACK;
+                    break;
+                case 4:
+                case 6:
+                    INST_NAME("SHL Eb, Ib");
+                    SETFLAGS(X_ALL, SF_PENDING);
+                    GETEB(x1, 1);
+                    u8 = (F8)&0x1f;
+                    UFLAG_IF{
+                        MOV32w(x4, u8); UFLAG_OP2(x4);
+                    };
+                    UFLAG_OP1(ed);
+                    LSLw(ed, ed, u8);
+                    EBBACK;
+                    UFLAG_RES(ed);
+                    UFLAG_DF(x3, d_shl8);
+                    break;
+                case 5:
+                    INST_NAME("SHR Eb, Ib");
+                    SETFLAGS(X_ALL, SF_PENDING);
+                    GETEB(x1, 1);
+                    u8 = (F8)&0x1f;
+                    UFLAG_IF{
+                        MOV32w(x4, u8); UFLAG_OP2(x4);
+                    };
+                    UFLAG_OP1(ed);
+                    if(u8) {
+                        LSRw(ed, ed, u8);
+                        EBBACK;
+                    }
+                    UFLAG_RES(ed);
+                    UFLAG_DF(x3, d_shr8);
+                    break;
+                case 7:
+                    INST_NAME("SAR Eb, Ib");
+                    SETFLAGS(X_ALL, SF_PENDING);
+                    GETSEB(x1, 1);
+                    u8 = (F8)&0x1f;
+                    UFLAG_IF{
+                        MOV32w(x4, u8); UFLAG_OP2(x4);
+                    };
+                    UFLAG_OP1(ed);
+                    if(u8) {
+                        ASRw(ed, ed, u8);
+                        EBBACK;
+                    }
+                    UFLAG_RES(ed);
+                    UFLAG_DF(x3, d_sar8);
+                    break;
+            }
+            break;
         case 0xC1:
             nextop = F8;
             switch((nextop>>3)&7) {