diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-11-12 14:59:35 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-11-12 14:59:35 +0100 |
| commit | 4318172edd1e26c1168f576e28ae23f94fe879e7 (patch) | |
| tree | 41ddc963e7fbaaba66677c031712c18ac4b36515 /src | |
| parent | 9201559b1d71a5e46c6d10cc1053260d86a00ee6 (diff) | |
| parent | 308cc81a275da39c1bb17d5dcdc8963c2267d383 (diff) | |
| download | box64-4318172edd1e26c1168f576e28ae23f94fe879e7.tar.gz box64-4318172edd1e26c1168f576e28ae23f94fe879e7.zip | |
Merge branch 'main' of https://github.com/ptitSeb/box64
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 12 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_emit_shift.c | 75 |
2 files changed, 55 insertions, 32 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 99686b1c..ec2faa63 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -1780,7 +1780,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined GETEB(x1, 1); u8 = (F8)&0x1f; - emit_shl8c(dyn, ninst, ed, u8, x3, x4); + emit_shl8c(dyn, ninst, ed, u8, x4, x5); EBBACK; } break; @@ -1790,7 +1790,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 1); u8 = (F8)&0x1f; - emit_shr8c(dyn, ninst, ed, u8, x3, x4); + emit_shr8c(dyn, ninst, ed, u8, x4, x5); EBBACK; } break; @@ -1800,7 +1800,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SETFLAGS(X_ALL, SF_SET_PENDING); GETSEB(x1, 1); u8 = (F8)&0x1f; - emit_sar8c(dyn, ninst, ed, u8, x3, x4); + emit_sar8c(dyn, ninst, ed, u8, x4, x5); EBBACK; } break; @@ -2116,21 +2116,21 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("SHL Eb, 1"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined GETEB(x1, 0); - emit_shl8c(dyn, ninst, ed, 1, x3, x4); + emit_shl8c(dyn, ninst, ed, 1, x4, x5); EBBACK; break; case 5: INST_NAME("SHR Eb, 1"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined GETEB(x1, 0); - emit_shr8c(dyn, ninst, ed, 1, x3, x4); + emit_shr8c(dyn, ninst, ed, 1, x4, x5); EBBACK; break; case 7: INST_NAME("SAR Eb, 1"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined GETSEB(x1, 0); - emit_sar8c(dyn, ninst, ed, 1, x3, x4); + emit_sar8c(dyn, ninst, ed, 1, x4, x5); EBBACK; break; } diff --git a/src/dynarec/arm64/dynarec_arm64_emit_shift.c b/src/dynarec/arm64/dynarec_arm64_emit_shift.c index e9a1e88c..fc37d54a 100644 --- a/src/dynarec/arm64/dynarec_arm64_emit_shift.c +++ b/src/dynarec/arm64/dynarec_arm64_emit_shift.c @@ -320,35 +320,58 @@ void emit_shl8c(dynarec_arm_t* dyn, int ninst, int s1, uint32_t c, int s3, int s } else IFX(X_ALL) { SET_DFNONE(s4); } - IFX(X_CF|X_OF) { - LSRw(s3, s1, 8-c); - BFIw(xFlags, s3, F_CF, 1); - } - LSLw(s1, s1, c); + if(c<8) { + IFX(X_CF|X_OF) { + LSRw(s3, s1, 8-c); + BFIw(xFlags, s3, F_CF, 1); + } + LSLw(s1, s1, c); - IFX(X_PEND) { - STRB_U12(s1, xEmu, offsetof(x64emu_t, res)); - } - IFX(X_ZF) { - TSTw_mask(s1, 0, 7); - CSETw(s4, cEQ); - BFIw(xFlags, s4, F_ZF, 1); - } - IFX(X_SF) { - LSRw(s4, s1, 7); - BFIw(xFlags, s4, F_SF, 1); - } - IFX(X_OF) { - if(c==1) { - IFX(X_SF) {} else {LSRw(s4, s1, 7);} - EORw_REG(s4, s4, xFlags); // CF is set if OF is asked - BFIw(xFlags, s4, F_OF, 1); - } else { + IFX(X_PEND) { + STRB_U12(s1, xEmu, offsetof(x64emu_t, res)); + } + IFX(X_ZF) { + TSTw_mask(s1, 0, 7); + CSETw(s4, cEQ); + BFIw(xFlags, s4, F_ZF, 1); + } + IFX(X_SF) { + LSRw(s4, s1, 7); + BFIw(xFlags, s4, F_SF, 1); + } + IFX(X_OF) { + if(c==1) { + IFX(X_SF) {} else {LSRw(s4, s1, 7);} + EORw_REG(s4, s4, xFlags); // CF is set if OF is asked + BFIw(xFlags, s4, F_OF, 1); + } else { + BFCw(xFlags, F_OF, 1); + } + } + IFX(X_PF) { + emit_pf(dyn, ninst, s1, s3, s4); + } + } else { + IFX(X_CF) { + LSLw(s3, s1, c-1); + BFXILw(xFlags, s3, 7, 1); // insert F_CF from s3[7:1] + } + MOVw_REG(s1, xZR); + IFX(X_OF) { BFCw(xFlags, F_OF, 1); } - } - IFX(X_PF) { - emit_pf(dyn, ninst, s1, s3, s4); + IFX(X_SF) { + BFCw(xFlags, F_SF, 1); + } + IFX(X_PF | X_ZF) { + MOV32w(s3, 1); + IFX(X_ZF) { + BFIw(xFlags, s3, F_ZF, 1); + } + IFX(X_PF) { + BFIw(xFlags, s3, F_PF, 1); + } + } } } |