diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-22 14:21:51 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-22 14:21:51 +0100 |
| commit | e6d3812d6c3df3d25ccb7201ec333ed3d4bb5432 (patch) | |
| tree | 60e9de187de731f1fddef6fc5d6cb8d78d706ca8 /src | |
| parent | c02946a913ad8b264f0babca15b4d040e66a01bb (diff) | |
| download | box64-e6d3812d6c3df3d25ccb7201ec333ed3d4bb5432.tar.gz box64-e6d3812d6c3df3d25ccb7201ec333ed3d4bb5432.zip | |
[DYNAREC] Added C0 opcode
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_00.c | 91 |
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) { |