about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorYang Liu <numbksco@gmail.com>2024-05-02 16:14:36 +0800
committerGitHub <noreply@github.com>2024-05-02 10:14:36 +0200
commit1d0614f0f358cc9d7837b82a1b849d06bea9f9e4 (patch)
tree7c8f6585637545d773a06d855c4380e813a2d31e /src/dynarec
parent2405e6c8e84ff6901ee58c98b207195f564eb702 (diff)
downloadbox64-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.c36
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");