about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-04-30 15:46:08 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-04-30 15:46:08 +0200
commit7b2e084170559b6df0bc97391b9bddfcd4a9d5d6 (patch)
treefde9e5cbddbb62fb3cff0845ca8a781664355ba8 /src
parentab70523b39eacac818efb8f8bacaf4d515eb98de (diff)
downloadbox64-7b2e084170559b6df0bc97391b9bddfcd4a9d5d6.tar.gz
box64-7b2e084170559b6df0bc97391b9bddfcd4a9d5d6.zip
[INTERP] Improved NAN handling for some (V)SQRTS[S/D] opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runavxf20f.c2
-rw-r--r--src/emu/x64runavxf30f.c2
-rw-r--r--src/emu/x64runf20f.c2
-rw-r--r--src/emu/x64runf30f.c8
4 files changed, 12 insertions, 2 deletions
diff --git a/src/emu/x64runavxf20f.c b/src/emu/x64runavxf20f.c
index 37dc7437..621bde24 100644
--- a/src/emu/x64runavxf20f.c
+++ b/src/emu/x64runavxf20f.c
@@ -188,6 +188,8 @@ uintptr_t RunAVX_F20F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETGX; GETVX; GETGY;
             if(EX->d[0]<0.0 )
                 GX->d[0] = -NAN;
+            else if(isnan(EX->d[0]))
+                GX->d[0] = EX->d[0];
             else
                 GX->d[0] = sqrt(EX->d[0]);
             GX->q[1] = VX->q[1];
diff --git a/src/emu/x64runavxf30f.c b/src/emu/x64runavxf30f.c
index 1e67ecd4..fb710d7a 100644
--- a/src/emu/x64runavxf30f.c
+++ b/src/emu/x64runavxf30f.c
@@ -210,6 +210,8 @@ uintptr_t RunAVX_F30F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETGX; GETVX; GETGY;
             if(EX->f[0]<0.0 )
                 GX->f[0] = -NAN;
+            else if(isnanf(EX->f[0]))
+                GX->f[0] = EX->f[0];
             else
                 GX->f[0] = sqrt(EX->f[0]);
             if(GX!=VX) {
diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c
index 93bc5e09..094499cf 100644
--- a/src/emu/x64runf20f.c
+++ b/src/emu/x64runf20f.c
@@ -209,6 +209,8 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
         GETGX;

         if(EX->d[0]<0.0 )

             GX->d[0] = -NAN;

+        else if(isnan(EX->d[0]))

+            GX->d[0] = EX->d[0];

         else

             GX->d[0] = sqrt(EX->d[0]);

         break;

diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c
index 6ab023ea..0b6b08ee 100644
--- a/src/emu/x64runf30f.c
+++ b/src/emu/x64runf30f.c
@@ -214,8 +214,12 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         nextop = F8;

         GETEX(0);

         GETGX;

-        NAN_PROPAGATION(GX->f[0], EX->f[0], break);

-        GX->f[0] = sqrtf(EX->f[0]);

+        if (EX->f[0]<0)

+            GX->f[0] = -NAN;

+        else if (isnanf(EX->f[0]))

+            GX->f[0] = EX->f[0];

+        else

+            GX->f[0] = sqrtf(EX->f[0]);

         break;

     case 0x52:  /* RSQRTSS Gx, Ex */

         nextop = F8;