about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-04-21 11:27:01 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-04-21 11:27:01 +0200
commit965105c08afaf75166a167c4882c807c4a74efc8 (patch)
tree78653072d28ea4008f8bf4358cd2a0b17c2d3004 /src
parent3fef880a7deb2d2d1e04b3254b356c9485745404 (diff)
downloadbox64-965105c08afaf75166a167c4882c807c4a74efc8.tar.gz
box64-965105c08afaf75166a167c4882c807c4a74efc8.zip
[INTERP] Better NAN handling for (V)DIV[P/S][S/D] opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runavxf30f.c2
-rw-r--r--src/emu/x64runf20f.c1
-rw-r--r--src/emu/x64runf30f.c2
3 files changed, 5 insertions, 0 deletions
diff --git a/src/emu/x64runavxf30f.c b/src/emu/x64runavxf30f.c
index 6b630544..5e3878fe 100644
--- a/src/emu/x64runavxf30f.c
+++ b/src/emu/x64runavxf30f.c
@@ -349,11 +349,13 @@ uintptr_t RunAVX_F30F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETGX;
             GETVX;
             GETGY;
+            MARK_NAN_F_2(VX, EX);
             GX->f[0] = VX->f[0] / EX->f[0];
             if(GX!=VX) {
                 GX->ud[1] = VX->ud[1];
                 GX->q[1] = VX->q[1];
             }
+            CHECK_NAN_F(GX);
             GY->u128 = 0;
             break;
         case 0x5F:  /* VMAXSS Gx, Vx, Ex */
diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c
index 65adeb0d..94a8cb46 100644
--- a/src/emu/x64runf20f.c
+++ b/src/emu/x64runf20f.c
@@ -266,6 +266,7 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
         _GETEX(0);

         GETGX;

         MARK_NAN_D_2(GX, EX);

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

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

         CHECK_NAN_D(GX);

         break;

diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c
index 4eb5a539..08b005c6 100644
--- a/src/emu/x64runf30f.c
+++ b/src/emu/x64runf30f.c
@@ -288,8 +288,10 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         nextop = F8;

         GETEX(0);

         GETGX;

+        MARK_NAN_F_2(GX, EX);

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

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

+        CHECK_NAN_F(GX);

         break;

     case 0x5F:  /* MAXSS Gx, Ex */

         nextop = F8;