about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-09 18:02:39 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-09 18:02:39 +0100
commitb23fcc83c1a5e5be3a60772835e40b7b3f664755 (patch)
tree9afcdfe3bdfdc652934e0f353ec4bc2055b587ab /src
parentd625cf68e5b1dc71433ae9db845c1f48f79fd736 (diff)
downloadbox64-b23fcc83c1a5e5be3a60772835e40b7b3f664755.tar.gz
box64-b23fcc83c1a5e5be3a60772835e40b7b3f664755.zip
Added more various opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run660f.c24
-rw-r--r--src/emu/x64runf30f.c42
2 files changed, 65 insertions, 1 deletions
diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index 8fe491ff..3d1939ca 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -39,6 +39,30 @@ int Run660F(x64emu_t *emu, rex_t rex)
 

     switch(opcode) {

 

+    case 0x10:                      /* MOVUPD Gx, Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        memcpy(GX, EX, 16); // unaligned...

+        break;

+    case 0x11:                      /* MOVUPD Ex, Gx */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        memcpy(EX, GX, 16); // unaligned...

+        break;

+    case 0x12:                      /* MOVLPD Gx, Eq */

+        nextop = F8;

+        GETED(0);

+        GETGX;

+        GX->q[0] = ED->q[0];

+        break;

+    case 0x13:                      /* MOVLPD Eq, Gx */

+        nextop = F8;

+        GETED(0);

+        GETGX;

+        ED->q[0] = GX->q[0];

+        break;

     case 0x14:                      /* UNPCKLPD Gx, Ex */

         nextop = F8;

         GETEX(0);

diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c
index d3fd0508..4e8d67c2 100644
--- a/src/emu/x64runf30f.c
+++ b/src/emu/x64runf30f.c
@@ -66,6 +66,18 @@ int RunF30F(x64emu_t *emu, rex_t rex)
             GX->f[0] = ED->sdword[0];

         break;

 

+    case 0x2C:  /* CVTTSS2SI Gd, Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGD;

+        if (rex.w)

+            GD->sq[0] = EX->f[0];

+        else {

+            GD->sdword[0] = EX->f[0];

+            GD->dword[1] = 0;

+        }

+        break;

+

     case 0x58:  /* ADDSS Gx, Ex */

         nextop = F8;

         GETEX(0);

@@ -84,13 +96,41 @@ int RunF30F(x64emu_t *emu, rex_t rex)
         GETGX;

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

         break;

-

+    case 0x5B:  /* CVTTPS2DQ Gx, Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        GX->sd[0] = EX->f[0];

+        GX->sd[1] = EX->f[1];

+        GX->sd[2] = EX->f[2];

+        GX->sd[3] = EX->f[3];

+        break;

+    case 0x5C:  /* SUBSS Gx, Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

+        break;

+    case 0x5D:  /* MINSS Gx, Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        if(isnan(GX->f[0]) || isnan(EX->f[0]) || isless(EX->f[0], GX->f[0]))

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

+        break;

     case 0x5E:  /* DIVSS Gx, Ex */

         nextop = F8;

         GETEX(0);

         GETGX;

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

         break;

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

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        if (isnan(GX->f[0]) || isnan(EX->f[0]) || isgreater(EX->f[0], GX->f[0]))

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

+        break;

 

     case 0x6F:  /* MOVDQU Gx, Ex */

         nextop = F8;