about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-09 18:23:30 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-09 18:23:30 +0100
commitfd3536161452592bf673a0a42ecf58197ad94104 (patch)
treed33e8d08bb68c6d3e33e38bf117cb3d31a964169
parent85dfd5b9783208070155be3d4b0f374aaa6b2190 (diff)
downloadbox64-fd3536161452592bf673a0a42ecf58197ad94104.tar.gz
box64-fd3536161452592bf673a0a42ecf58197ad94104.zip
Added F3 0F C2 opcode
-rw-r--r--src/emu/x64runf30f.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c
index 4e8d67c2..fa90b459 100644
--- a/src/emu/x64runf30f.c
+++ b/src/emu/x64runf30f.c
@@ -31,7 +31,8 @@ int RunF30F(x64emu_t *emu, rex_t rex)
 {

     uint8_t opcode;

     uint8_t nextop;

-    int32_t tmp32s;

+    int8_t tmp8s;

+    uint8_t tmp8u;

     reg64_t *oped, *opgd;

     sse_regs_t *opex, *opgx;

 

@@ -153,6 +154,24 @@ int RunF30F(x64emu_t *emu, rex_t rex)
         memcpy(EX, GX, 16);    // unaligned...

         break;

 

+    case 0xC2:  /* CMPSS Gx, Ex, Ib */

+        nextop = F8;

+        GETEX(1);

+        GETGX;

+        tmp8u = F8;

+        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 3: tmp8s=isnan(GX->f[0]) || isnan(EX->f[0]); break;

+            case 4: tmp8s=(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;

+        }

+        GX->ud[0]=(tmp8s)?0xffffffff:0;

+        break;

 

     default:

         return 1;