diff options
| author | Yang Liu <numbksco@gmail.com> | 2024-05-02 16:14:36 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-02 10:14:36 +0200 |
| commit | 1d0614f0f358cc9d7837b82a1b849d06bea9f9e4 (patch) | |
| tree | 7c8f6585637545d773a06d855c4380e813a2d31e /src/dynarec | |
| parent | 2405e6c8e84ff6901ee58c98b207195f564eb702 (diff) | |
| download | box64-1d0614f0f358cc9d7837b82a1b849d06bea9f9e4.tar.gz box64-1d0614f0f358cc9d7837b82a1b849d06bea9f9e4.zip | |
[RV64_DYNAREC] Added some missing fastnan handling (#1483)
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f20f.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f20f.c b/src/dynarec/rv64/dynarec_rv64_f20f.c index dfa4adc5..6bd1c280 100644 --- a/src/dynarec/rv64/dynarec_rv64_f20f.c +++ b/src/dynarec/rv64/dynarec_rv64_f20f.c @@ -202,18 +202,38 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0x58: INST_NAME("ADDSD Gx, Ex"); nextop = F8; - // TODO: fastnan handling GETGXSD(v0); GETEXSD(v1, 0); + if(!box64_dynarec_fastnan) { + FEQD(x3, v0, v0); + FEQD(x4, v1, v1); + } FADDD(v0, v0, v1); + if(!box64_dynarec_fastnan) { + AND(x3, x3, x4); + CBZ_NEXT(x3); + FEQD(x3, v0, v0); + CBNZ_NEXT(x3); + FNEGD(v0, v0); + } break; case 0x59: INST_NAME("MULSD Gx, Ex"); nextop = F8; - //TODO: fastnan handling GETGXSD(v0); GETEXSD(v1, 0); + if(!box64_dynarec_fastnan) { + FEQD(x3, v0, v0); + FEQD(x4, v1, v1); + } FMULD(v0, v0, v1); + if(!box64_dynarec_fastnan) { + AND(x3, x3, x4); + CBZ_NEXT(x3); + FEQD(x3, v0, v0); + CBNZ_NEXT(x3); + FNEGD(v0, v0); + } break; case 0x5A: INST_NAME("CVTSD2SS Gx, Ex"); @@ -225,10 +245,20 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0x5C: INST_NAME("SUBSD Gx, Ex"); nextop = F8; - //TODO: fastnan handling GETGXSD(v0); GETEXSD(v1, 0); + if(!box64_dynarec_fastnan) { + FEQD(x3, v0, v0); + FEQD(x4, v1, v1); + } FSUBD(v0, v0, v1); + if(!box64_dynarec_fastnan) { + AND(x3, x3, x4); + CBZ_NEXT(x3); + FEQD(x3, v0, v0); + CBNZ_NEXT(x3); + FNEGD(v0, v0); + } break; case 0x5D: INST_NAME("MINSD Gx, Ex"); |