diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-01-05 14:58:45 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-01-05 14:58:45 +0100 |
| commit | a5f2f3b3f1ecdd8651d1c4687a5ab6c0c3cf6546 (patch) | |
| tree | 9e68c4a17b63a9f5b2f91dc35cf338a4074bff9f /src | |
| parent | 077ba65f7e1ada261999197ea623488675df8cfa (diff) | |
| download | box64-a5f2f3b3f1ecdd8651d1c4687a5ab6c0c3cf6546.tar.gz box64-a5f2f3b3f1ecdd8651d1c4687a5ab6c0c3cf6546.zip | |
[ARM64_DYNAREC] A few more FRINTTS extension use
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_660f.c | 76 |
1 files changed, 44 insertions, 32 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index bb833844..1383294c 100644 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -234,24 +234,30 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VFCVTZSQD(q0, v1); SQXTN_32(q0, q0); } else { - MRS_fpsr(x5); - BFCw(x5, FPSR_IOC, 1); // reset IOC bit - MSR_fpsr(x5); - ORRw_mask(x2, xZR, 1, 0); //0x80000000 - d0 = fpu_get_scratch(dyn); - for (int i=0; i<2; ++i) { + if(arm64_frintts) { + VFRINT32ZD(q0, q0); + VFCVTZSQD(q0, q0); + SQXTN_32(q0, q0); + } else { + MRS_fpsr(x5); BFCw(x5, FPSR_IOC, 1); // reset IOC bit - if (i) { - VMOVeD(d0, 0, v1, i); - FRINTZD(d0, d0); - } else { - FRINTZD(d0, v1); + MSR_fpsr(x5); + ORRw_mask(x2, xZR, 1, 0); //0x80000000 + d0 = fpu_get_scratch(dyn); + for (int i=0; i<2; ++i) { + BFCw(x5, FPSR_IOC, 1); // reset IOC bit + if (i) { + VMOVeD(d0, 0, v1, i); + FRINTZD(d0, d0); + } else { + FRINTZD(d0, v1); + } + FCVTZSwD(x1, d0); + MRS_fpsr(x5); // get back FPSR to check the IOC bit + TBZ(x5, FPSR_IOC, 4+4); + MOVw_REG(x1, x2); + VMOVQSfrom(q0, i, x1); } - FCVTZSwD(x1, d0); - MRS_fpsr(x5); // get back FPSR to check the IOC bit - TBZ(x5, FPSR_IOC, 4+4); - MOVw_REG(x1, x2); - VMOVQSfrom(q0, i, x1); } } break; @@ -268,24 +274,30 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VFCVTZSS(q0, q0); } else { u8 = sse_setround(dyn, ninst, x1, x2, x3); - MRS_fpsr(x5); - BFCw(x5, FPSR_IOC, 1); // reset IOC bit - MSR_fpsr(x5); - ORRw_mask(x2, xZR, 1, 0); //0x80000000 - d0 = fpu_get_scratch(dyn); - for (int i=0; i<2; ++i) { + if(arm64_frintts) { + VFRINT32XD(q0, q0); + VFCVTZSQD(q0, q0); + SQXTN_32(q0, q0); + } else { + MRS_fpsr(x5); BFCw(x5, FPSR_IOC, 1); // reset IOC bit - if (i) { - VMOVeD(d0, 0, v1, i); - FRINTID(d0, d0); - } else { - FRINTID(d0, v1); + MSR_fpsr(x5); + ORRw_mask(x2, xZR, 1, 0); //0x80000000 + d0 = fpu_get_scratch(dyn); + for (int i=0; i<2; ++i) { + BFCw(x5, FPSR_IOC, 1); // reset IOC bit + if (i) { + VMOVeD(d0, 0, v1, i); + FRINTID(d0, d0); + } else { + FRINTID(d0, v1); + } + FCVTZSwD(x1, d0); + MRS_fpsr(x5); // get back FPSR to check the IOC bit + TBZ(x5, FPSR_IOC, 4+4); + MOVw_REG(x1, x2); + VMOVQSfrom(q0, i, x1); } - FCVTZSwD(x1, d0); - MRS_fpsr(x5); // get back FPSR to check the IOC bit - TBZ(x5, FPSR_IOC, 4+4); - MOVw_REG(x1, x2); - VMOVQSfrom(q0, i, x1); } x87_restoreround(dyn, ninst, u8); } |