diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-04-30 15:46:08 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-04-30 15:46:08 +0200 |
| commit | 7b2e084170559b6df0bc97391b9bddfcd4a9d5d6 (patch) | |
| tree | fde9e5cbddbb62fb3cff0845ca8a781664355ba8 /src | |
| parent | ab70523b39eacac818efb8f8bacaf4d515eb98de (diff) | |
| download | box64-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.c | 2 | ||||
| -rw-r--r-- | src/emu/x64runavxf30f.c | 2 | ||||
| -rw-r--r-- | src/emu/x64runf20f.c | 2 | ||||
| -rw-r--r-- | 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 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; |