diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-08-29 15:12:10 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-08-29 15:12:10 +0200 |
| commit | e10a78d67112b10806825732f4122d8ade9e6b4e (patch) | |
| tree | b58ec5ed67bb55a046c26b06524392518663dfdb /src | |
| parent | 04b9195cd2220b7d7d8d194556df73b7572ac949 (diff) | |
| download | box64-e10a78d67112b10806825732f4122d8ade9e6b4e.tar.gz box64-e10a78d67112b10806825732f4122d8ade9e6b4e.zip | |
[DYNAREC] Fixed BTS/BTR/BTC with imm8==0 (helps EWJ SE Win95, probably other too)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_0f.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/dynarec/dynarec_arm64_0f.c b/src/dynarec/dynarec_arm64_0f.c index 5ff95e40..68a68ad3 100755 --- a/src/dynarec/dynarec_arm64_0f.c +++ b/src/dynarec/dynarec_arm64_0f.c @@ -1337,11 +1337,14 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin ed = x1; } u8 = F8; - LSRxw(x4, ed, u8&(rex.w?0x3f:0x1f)); + u8&=(rex.w?0x3f:0x1f); + if(u8) { + LSRxw(x4, ed, u8); + } BFIw(xFlags, x4, F_CF, 1); TBNZ_MARK3(x4, 0); // bit already set, jump to next instruction MOV32w(x4, 1); - EORxw_REG_LSL(ed, ed, x4, u8&(rex.w?0x3f:0x1f)); + EORxw_REG_LSL(ed, ed, x4, u8); if(wback) { STRxw_U12(ed, wback, fixedaddress); } @@ -1360,11 +1363,14 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin ed = x1; } u8 = F8; - LSRxw(x4, ed, u8&(rex.w?0x3f:0x1f)); + u8&=(rex.w?0x3f:0x1f); + if(u8) { + LSRxw(x4, ed, u8); + } BFIw(xFlags, x4, F_CF, 1); TBZ_MARK3(x4, 0); // bit already clear, jump to next instruction //MOVW(x14, 1); // already 0x01 - EORxw_REG_LSL(ed, ed, x4, u8&(rex.w?0x3f:0x1f)); + EORxw_REG_LSL(ed, ed, x4, u8); if(wback) { STRxw_U12(ed, wback, fixedaddress); } @@ -1383,10 +1389,13 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin ed = x1; } u8 = F8; - LSRxw(x4, ed, u8&(rex.w?0x3f:0x1f)); + u8&=(rex.w?0x3f:0x1f); + if(u8) { + LSRxw(x4, ed, u8); + } BFIw(xFlags, x4, F_CF, 1); MOV32w(x4, 1); - EORxw_REG_LSL(ed, ed, x4, u8&(rex.w?0x3f:0x1f)); + EORxw_REG_LSL(ed, ed, x4, u8); if(wback) { STRxw_U12(ed, wback, fixedaddress); } |