about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-07 15:32:36 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-07 15:32:36 +0100
commit88aaa9608d77ad360f2135da91176ec2340b7b54 (patch)
treecf2e01137368f431cb6ec4f4ebd6a83c500d7bc2
parent032c9ff8b55555df337466cad4c735e9e00771fa (diff)
downloadbox64-88aaa9608d77ad360f2135da91176ec2340b7b54.tar.gz
box64-88aaa9608d77ad360f2135da91176ec2340b7b54.zip
Added some MMX opcodes and fixed 66 0F 7E MOVQ
-rw-r--r--src/emu/x64run0f.c87
-rw-r--r--src/emu/x64run660f.c2
2 files changed, 88 insertions, 1 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index a0b63711..ff5cfdd2 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -190,6 +190,31 @@ int Run0F(x64emu_t *emu, rex_t rex)
             GM->q = (EM->q > 63) ? 0L : (GM->q >> EM->q);

             break;

 

+        case 0xD8:                   /* PSUBUSB Gm,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            for(int i=0; i<8; ++i) {

+                tmp32s = (int32_t)GM->ub[i] - EM->ub[i];

+                GM->ub[i] = (tmp32s < 0) ? 0 : tmp32s;

+            }

+            break;

+        case 0xD9:                   /* PSUBUSW Gm,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            for(int i=0; i<4; ++i) {

+                tmp32s = (int32_t)GM->uw[i] - EM->uw[i];

+                GM->uw[i] = (tmp32s < 0) ? 0 : tmp32s;

+            }

+            break;

+

+        case 0xDB:                   /* PAND Gm,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            GM->q &= EM->q;

+            break;

         case 0xDC:                   /* PADDUSB Gm,Em */

             nextop = F8;

             GETEM(0);

@@ -209,6 +234,39 @@ int Run0F(x64emu_t *emu, rex_t rex)
             }

             break;

 

+        case 0xDF:                   /* PANDN Gm,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            GM->q = ~GM->q;

+            GM->q &= EM->q;

+            break;

+

+        case 0xE8:                   /* PSUBSB Gm,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            for(int i=0; i<8; ++i) {

+                tmp32s = (int32_t)GM->sb[i] - EM->sb[i];

+                GM->sb[i] = (tmp32s>127)?127:((tmp32s<-128)?-128:tmp32s);

+            }

+            break;

+        case 0xE9:                   /* PSUBSW Gm,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            for(int i=0; i<4; ++i) {

+                tmp32s = (int32_t)GM->sw[i] - EM->sw[i];

+                GM->sw[i] = (tmp32s>32767)?32767:((tmp32s<-32768)?-32768:tmp32s);

+            }

+            break;

+

+        case 0xEB:                   /* POR Gm, Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            GM->q |= EM->q;

+            break;

         case 0xEC:                   /* PADDSB Gm, Em */

             nextop = F8;

             GETEM(0);

@@ -228,6 +286,35 @@ int Run0F(x64emu_t *emu, rex_t rex)
             }

             break;

 

+        case 0xF3:                   /* PSLLQ Gm, Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            GM->q = (EM->q > 63) ? 0L : (GM->q << EM->ub[0]);

+            break;

+

+        case 0xF8:                   /* PSUBB Gm,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            for(int i=0; i<8; ++i)

+                GM->sb[i] -= EM->sb[i];

+            break;

+        case 0xF9:                   /* PSUBW Gm,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            for(int i=0; i<4; ++i)

+                GM->sw[i] -= EM->sw[i];

+            break;

+        case 0xFA:                   /* PSUBD Gm,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            for(int i=0; i<2; ++i)

+                GM->sd[i] -= EM->sd[i];

+            break;

+

         case 0xFC:                   /* PADDB Gm, Em */

             nextop = F8;

             GETEM(0);

diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index dc355d9c..3e768eee 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -75,7 +75,7 @@ int Run660F(x64emu_t *emu, rex_t rex)
         GETED(0);

         GETGX;

         if(rex.w)

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

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

         else {

             if(MODREG)

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