about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-11-07 15:06:55 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-11-07 15:06:55 +0100
commitf5c9439f9110fcb4fde3c7db9f68be7c107b17f6 (patch)
treef0094dbbd242c7bc4526d61c2a1d48717f00324e /src/emu
parentf73e4193f032713529e26c4537e5fac44147c040 (diff)
downloadbox64-f5c9439f9110fcb4fde3c7db9f68be7c107b17f6.tar.gz
box64-f5c9439f9110fcb4fde3c7db9f68be7c107b17f6.zip
Improved CMPSS/CMPSD opcodes, improved test17 ([DYNAREC] too, and improved MINSS/MAXSS/MINSD/MAXSD too)
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/x64runf20f.c6
-rw-r--r--src/emu/x64runf30f.c6
2 files changed, 6 insertions, 6 deletions
diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c
index 7bf3c99e..eff4ca5f 100644
--- a/src/emu/x64runf20f.c
+++ b/src/emu/x64runf20f.c
@@ -218,10 +218,10 @@ int RunF20F(x64emu_t *emu, rex_t rex)
         tmp8s = 0;

         switch(tmp8u&7) {

             case 0: tmp8s=(GX->d[0] == EX->d[0]); break;

-            case 1: tmp8s=isless(GX->d[0], EX->d[0]); break;

-            case 2: tmp8s=islessequal(GX->d[0], EX->d[0]); break;

+            case 1: tmp8s=isless(GX->d[0], EX->d[0]) && !(isnan(GX->d[0]) || isnan(EX->d[0])); break;

+            case 2: tmp8s=islessequal(GX->d[0], EX->d[0]) && !(isnan(GX->d[0]) || isnan(EX->d[0])); break;

             case 3: tmp8s=isnan(GX->d[0]) || isnan(EX->d[0]); break;

-            case 4: tmp8s=(GX->d[0] != EX->d[0]); break;

+            case 4: tmp8s=isnan(GX->d[0]) || isnan(EX->d[0]) || (GX->d[0] != EX->d[0]); break;

             case 5: tmp8s=isnan(GX->d[0]) || isnan(EX->d[0]) || isgreaterequal(GX->d[0], EX->d[0]); break;

             case 6: tmp8s=isnan(GX->d[0]) || isnan(EX->d[0]) || isgreater(GX->d[0], EX->d[0]); break;

             case 7: tmp8s=!isnan(GX->d[0]) && !isnan(EX->d[0]); break;

diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c
index 1960238e..7cc7add5 100644
--- a/src/emu/x64runf30f.c
+++ b/src/emu/x64runf30f.c
@@ -318,10 +318,10 @@ int RunF30F(x64emu_t *emu, rex_t rex)
         tmp8s = 0;

         switch(tmp8u&7) {

             case 0: tmp8s=(GX->f[0] == EX->f[0]); break;

-            case 1: tmp8s=isless(GX->f[0], EX->f[0]); break;

-            case 2: tmp8s=islessequal(GX->f[0], EX->f[0]); break;

+            case 1: tmp8s=isless(GX->f[0], EX->f[0]) && !(isnan(GX->f[0]) || isnan(EX->f[0])); break;

+            case 2: tmp8s=islessequal(GX->f[0], EX->f[0]) && !(isnan(GX->f[0]) || isnan(EX->f[0])); break;

             case 3: tmp8s=isnan(GX->f[0]) || isnan(EX->f[0]); break;

-            case 4: tmp8s=(GX->f[0] != EX->f[0]); break;

+            case 4: tmp8s=isnan(GX->f[0]) || isnan(EX->f[0]) || (GX->f[0] != EX->f[0]); break;

             case 5: tmp8s=isnan(GX->f[0]) || isnan(EX->f[0]) || isgreaterequal(GX->f[0], EX->f[0]); break;

             case 6: tmp8s=isnan(GX->f[0]) || isnan(EX->f[0]) || isgreater(GX->f[0], EX->f[0]); break;

             case 7: tmp8s=!isnan(GX->f[0]) && !isnan(EX->f[0]); break;