about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-04 00:11:32 +0800
committerGitHub <noreply@github.com>2025-04-03 18:11:32 +0200
commit8cd3ba8c9e4840541370905b1306ad57e946e288 (patch)
treeb18eef6492bc5249638ef2fa28cc054dbb4c229b /src
parent8cba915bca8d48a7ac4d9571004975320f71a7ff (diff)
downloadbox64-8cd3ba8c9e4840541370905b1306ad57e946e288.tar.gz
box64-8cd3ba8c9e4840541370905b1306ad57e946e288.zip
[INTERP] Fixed a nan propagation issue on RISC-V (#2498)
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runavx0f.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/emu/x64runavx0f.c b/src/emu/x64runavx0f.c
index dbc24f81..81be8027 100644
--- a/src/emu/x64runavx0f.c
+++ b/src/emu/x64runavx0f.c
@@ -385,17 +385,29 @@ uintptr_t RunAVX_0F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETVX;
             GETGY;
             for(int i=0; i<4; ++i) {
-                nanmask[i] = isnan(VX->f[i]) || isnan(EX->f[i]);
+                if (isnan(VX->f[i]) || isnan(EX->f[i])) {
+                    if (isnan(VX->f[i]))
+                        GX->f[i] = VX->f[i];
+                    else
+                        GX->f[i] = EX->f[i];
+                    continue;
+                }
                 GX->f[i] = VX->f[i] + EX->f[i];
-                if(!nanmask[i] && isnan(GX->f[i])) GX->f[i] = -NAN;
+                if(isnan(GX->f[i])) GX->f[i] = -NAN;
             }
             if(vex.l) {
                 GETEY;
                 GETVY;
                 for(int i=0; i<4; ++i) {
-                    nanmask[i] = isnan(VY->f[i]) || isnan(EY->f[i]);
+                    if (isnan(VY->f[i]) || isnan(EY->f[i])) {
+                        if (isnan(VY->f[i]))
+                            GY->f[i] = VY->f[i];
+                        else
+                            GY->f[i] = EY->f[i];
+                        continue;
+                    }
                     GY->f[i] = VY->f[i] + EY->f[i];
-                    if(!nanmask[i] && isnan(GY->f[i])) GY->f[i] = -NAN;
+                    if(isnan(GY->f[i])) GY->f[i] = -NAN;
                 }
             } else
                 GY->u128 = 0;