diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-01-23 15:08:00 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-23 08:08:00 +0100 |
| commit | 8438b6174759b6c21d2239939bba4f1b37c4fcd1 (patch) | |
| tree | bc34c762b8a7f932542b65d9b1d12dff2fb3bf4c /src | |
| parent | f4a9f8dd79456cbb16d2048c36b48074c831c0bf (diff) | |
| download | box64-8438b6174759b6c21d2239939bba4f1b37c4fcd1.tar.gz box64-8438b6174759b6c21d2239939bba4f1b37c4fcd1.zip | |
[RV64_DYNAREC] Added fastnan handling to more 0F opcodes (fixes CI) (#2284)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 45 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f_vector.c | 3 |
2 files changed, 42 insertions, 6 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index b6fc356d..73093af9 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -1066,8 +1066,19 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni // GX->f[i] *= EX->f[i]; FLW(s0, wback, fixedaddress + i * 4); FLW(s1, gback, gdoffset + i * 4); - FMULS(s1, s1, s0); - FSW(s1, gback, gdoffset + i * 4); + if (!BOX64ENV(dynarec_fastnan)) { + FEQS(x3, s0, s0); + FEQS(x4, s1, s1); + } + FMULS(s0, s0, s1); + if (!BOX64ENV(dynarec_fastnan)) { + AND(x3, x3, x4); + BEQZ(x3, 16); + FEQS(x3, s0, s0); + BNEZ(x3, 8); + FNEGS(s0, s0); + } + FSW(s0, gback, gdoffset + i * 4); } break; case 0x5A: @@ -1107,8 +1118,19 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni // GX->f[i] -= EX->f[i]; FLW(s0, wback, fixedaddress + i * 4); FLW(s1, gback, gdoffset + i * 4); - FSUBS(s1, s1, s0); - FSW(s1, gback, gdoffset + i * 4); + if (!BOX64ENV(dynarec_fastnan)) { + FEQS(x3, s0, s0); + FEQS(x4, s1, s1); + } + FSUBS(s0, s1, s0); + if (!BOX64ENV(dynarec_fastnan)) { + AND(x3, x3, x4); + BEQZ(x3, 16); + FEQS(x3, s0, s0); + BNEZ(x3, 8); + FNEGS(s0, s0); + } + FSW(s0, gback, gdoffset + i * 4); } break; case 0x5D: @@ -1146,8 +1168,19 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni // GX->f[i] /= EX->f[i]; FLW(s0, wback, fixedaddress + i * 4); FLW(s1, gback, gdoffset + i * 4); - FDIVS(s1, s1, s0); - FSW(s1, gback, gdoffset + i * 4); + if (!BOX64ENV(dynarec_fastnan)) { + FEQS(x3, s0, s0); + FEQS(x4, s1, s1); + } + FDIVS(s0, s1, s0); + if (!BOX64ENV(dynarec_fastnan)) { + AND(x3, x3, x4); + BEQZ(x3, 16); + FEQS(x3, s0, s0); + BNEZ(x3, 8); + FNEGS(s0, s0); + } + FSW(s0, gback, gdoffset + i * 4); } break; case 0x5F: diff --git a/src/dynarec/rv64/dynarec_rv64_0f_vector.c b/src/dynarec/rv64/dynarec_rv64_0f_vector.c index 342ab55f..40a5d8df 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f_vector.c +++ b/src/dynarec/rv64/dynarec_rv64_0f_vector.c @@ -395,6 +395,7 @@ uintptr_t dynarec64_0F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, VFADD_VV(v0, v0, q0, VECTOR_UNMASKED); break; case 0x59: + if (!BOX64ENV(dynarec_fastnan)) return 0; INST_NAME("MULPS Gx, Ex"); nextop = F8; SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); @@ -432,6 +433,7 @@ uintptr_t dynarec64_0F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, VFCVT_F_X_V(v0, q0, VECTOR_UNMASKED); break; case 0x5C: + if (!BOX64ENV(dynarec_fastnan)) return 0; INST_NAME("SUBPS Gx, Ex"); nextop = F8; SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); @@ -458,6 +460,7 @@ uintptr_t dynarec64_0F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, } break; case 0x5E: + if (!BOX64ENV(dynarec_fastnan)) return 0; INST_NAME("DIVPS Gx, Ex"); nextop = F8; SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1); |