diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-06-12 21:50:31 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-06-12 21:50:31 +0200 |
| commit | 0777a568d7591501eea0371cc7062a93ffcf9b1a (patch) | |
| tree | f21dbb9423d07c43d8fe8c087a23539ef7e3ad69 | |
| parent | f6ce622841efcb4da5e06b1fbb0f869b1dac99b6 (diff) | |
| download | box64-0777a568d7591501eea0371cc7062a93ffcf9b1a.tar.gz box64-0777a568d7591501eea0371cc7062a93ffcf9b1a.zip | |
[DYNAREC] Fixed FIS(TT)(P) opcodes
| -rw-r--r-- | src/dynarec/dynarec_arm64_db.c | 9 | ||||
| -rw-r--r-- | src/dynarec/dynarec_arm64_df.c | 11 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_helper.c | 7 |
3 files changed, 16 insertions, 11 deletions
diff --git a/src/dynarec/dynarec_arm64_db.c b/src/dynarec/dynarec_arm64_db.c index 11d5e45b..0b11c0f4 100644 --- a/src/dynarec/dynarec_arm64_db.c +++ b/src/dynarec/dynarec_arm64_db.c @@ -194,9 +194,10 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SQXTN_S_D(s0, s0); VSTR32_U12(s0, wback, fixedaddress); MRS_fpsr(x5); // get back FPSR to check the IOC bit - TBZ_NEXT(x5, FPSR_IOC); + TBZ_MARK3(x5, FPSR_IOC); MOV32w(x5, 0x80000000); STRw_U12(x5, wback, fixedaddress); + MARK3; #endif x87_do_pop(dyn, ninst); break; @@ -225,9 +226,10 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SQXTN_S_D(s0, s0); VSTR32_U12(s0, wback, fixedaddress); MRS_fpsr(x5); // get back FPSR to check the IOC bit - TBZ_NEXT(x5, FPSR_IOC); + TBZ_MARK3(x5, FPSR_IOC); MOV32w(x5, 0x80000000); STRw_U12(x5, wback, fixedaddress); + MARK3; #endif x87_restoreround(dyn, ninst, u8); break; @@ -256,9 +258,10 @@ uintptr_t dynarec64_DB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SQXTN_S_D(s0, s0); VSTR32_U12(s0, wback, fixedaddress); MRS_fpsr(x5); // get back FPSR to check the IOC bit - TBZ_NEXT(x5, FPSR_IOC); + TBZ_MARK3(x5, FPSR_IOC); MOV32w(x5, 0x80000000); STRw_U12(x5, wback, fixedaddress); + MARK3; #endif x87_restoreround(dyn, ninst, u8); x87_do_pop(dyn, ninst); diff --git a/src/dynarec/dynarec_arm64_df.c b/src/dynarec/dynarec_arm64_df.c index 15d67f86..8c782fab 100644 --- a/src/dynarec/dynarec_arm64_df.c +++ b/src/dynarec/dynarec_arm64_df.c @@ -168,9 +168,10 @@ uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SQXTN_H_S(s0, s0); VSTR16_U12(s0, wback, fixedaddress); MRS_fpsr(x5); // get back FPSR to check the IOC bit - TBZ_NEXT(x5, FPSR_IOC); + TBZ_MARK3(x5, FPSR_IOC); MOV32w(x5, 0x8000); STRH_U12(x5, wback, fixedaddress); + MARK3; #endif x87_do_pop(dyn, ninst); break; @@ -198,9 +199,10 @@ uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SQXTN_H_S(s0, s0); VSTR16_U12(s0, wback, fixedaddress); MRS_fpsr(x5); // get back FPSR to check the IOC bit - TBZ_NEXT(x5, FPSR_IOC); + TBZ_MARK3(x5, FPSR_IOC); MOV32w(x5, 0x8000); STRH_U12(x5, wback, fixedaddress); + MARK3; #endif x87_restoreround(dyn, ninst, u8); break; @@ -228,9 +230,10 @@ uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SQXTN_H_S(s0, s0); VSTR16_U12(s0, wback, fixedaddress); MRS_fpsr(x5); // get back FPSR to check the IOC bit - TBZ_NEXT(x5, FPSR_IOC); + TBZ_MARK3(x5, FPSR_IOC); MOV32w(x5, 0x8000); STRH_U12(x5, wback, fixedaddress); + MARK3; #endif x87_do_pop(dyn, ninst); x87_restoreround(dyn, ninst, u8); @@ -279,8 +282,8 @@ uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin TBZ_MARK3(x5, FPSR_IOC); MOV64x(x5, 0x8000000000000000LL); STRx_U12(x5, wback, fixedaddress); - #endif MARK3; + #endif x87_restoreround(dyn, ninst, u8); break; default: diff --git a/src/dynarec/dynarec_arm64_helper.c b/src/dynarec/dynarec_arm64_helper.c index df87ca2e..b0aedef6 100755 --- a/src/dynarec/dynarec_arm64_helper.c +++ b/src/dynarec/dynarec_arm64_helper.c @@ -909,12 +909,11 @@ int x87_setround(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3) MAYUSE(dyn); MAYUSE(ninst); MAYUSE(s1); MAYUSE(s2); LDRH_U12(s1, xEmu, offsetof(x64emu_t, cw)); - UBFXx(s2, s1, 10, 2); // extract round... - MOV64x(s1, (uintptr_t)round_map); - LDRw_REG_LSL2(s2, s1, s2); + RBITw(s2, s1); // round is on bits 10-11 on x86, + LSRw(s2, s2, 20); // but we want the reverse of that MRS_fpcr(s1); // get fpscr MOVx_REG(s3, s1); - BFIx(s1, s2, 22, 2); // inject new round + BFIx(s1, s2, 22, 2); // inject new round MSR_fpcr(s1); // put new fpscr return s3; } |