diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-07 23:10:40 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-07 23:10:40 +0200 |
| commit | 401071c40a5c9c71c92fea6dfaf7ec321445f6c7 (patch) | |
| tree | f39ef60495b67b9b10f72949fba4316e638fd60c /src | |
| parent | 928eb2a32b9430c786cdfe7313112f6f6ea9dd25 (diff) | |
| download | box64-401071c40a5c9c71c92fea6dfaf7ec321445f6c7.tar.gz box64-401071c40a5c9c71c92fea6dfaf7ec321445f6c7.zip | |
[DYNAREC] Better handling of SHL/SHR/SAR Eb, 0 (for obfuscated code)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_00.c | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index 66f508d9..e9f6f8af 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -1368,49 +1368,61 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin 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); + if(u8) { + SETFLAGS(X_ALL, SF_PENDING); + UFLAG_IF{ + MOV32w(x4, u8); UFLAG_OP2(x4); + }; + UFLAG_OP1(ed); + LSLw(ed, ed, u8); + EBBACK; + UFLAG_RES(ed); + UFLAG_DF(x3, d_shl8); + } else { + NOP; + } 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; + SETFLAGS(X_ALL, SF_PENDING); + 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); + } else { + NOP; } - 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; + SETFLAGS(X_ALL, SF_PENDING); + 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); + } else { + NOP; } - UFLAG_RES(ed); - UFLAG_DF(x3, d_sar8); break; } break; |