From 7b2e084170559b6df0bc97391b9bddfcd4a9d5d6 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Wed, 30 Apr 2025 15:46:08 +0200 Subject: [PATCH] [INTERP] Improved NAN handling for some (V)SQRTS[S/D] opcodes --- src/emu/x64runavxf20f.c | 2 ++ src/emu/x64runavxf30f.c | 2 ++ src/emu/x64runf20f.c | 2 ++ src/emu/x64runf30f.c | 8 ++++++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/emu/x64runavxf20f.c b/src/emu/x64runavxf20f.c index 37dc7437c..621bde24f 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 1e67ecd42..fb710d7a6 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 93bc5e09f..094499cf3 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 6ab023ea8..0b6b08eef 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;