about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-08 15:40:17 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-08 15:40:17 +0100
commit50045135967768a5a8cba612d15c76fa7afb9c0b (patch)
tree9bc9b429766a854983f9be59bea9ff4a7e7e217a /src
parent749961af32d25df77d2c63bb1e20c9a3aeb1d527 (diff)
downloadbox64-50045135967768a5a8cba612d15c76fa7afb9c0b.tar.gz
box64-50045135967768a5a8cba612d15c76fa7afb9c0b.zip
More 0F and 66 0F opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run0f.c44
-rw-r--r--src/emu/x64run660f.c116
2 files changed, 159 insertions, 1 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index f8c6d359..08a31db0 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -52,6 +52,50 @@ int Run0F(x64emu_t *emu, rex_t rex)
             GETGX;

             memcpy(EX, GX, 16); // unaligned, so carreful

             break;

+        case 0x12:                      

+            nextop = F8;

+            GETEX(0);

+            GETGX;

+            if((nextop&0xC0)==0xC0)    /* MOVHLPS Gx,Ex */

+                GX->q[0] = EX->q[1];

+            else

+                GX->q[0] = EX->q[0];    /* MOVLPS Gx,Ex */

+            break;

+        case 0x13:                      /* MOVLPS Ex,Gx */

+            nextop = F8;

+            GETEX(0);

+            GETGX;

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

+            break;

+        case 0x14:                      /* UNPCKLPS Gx, Ex */

+            nextop = F8;

+            GETEX(0);

+            GETGX;

+            GX->ud[3] = EX->ud[1];

+            GX->ud[2] = GX->ud[1];

+            GX->ud[1] = EX->ud[0];

+            break;

+        case 0x15:                      /* UNPCKHPS Gx, Ex */

+            nextop = F8;

+            GETEX(0);

+            GETGX;

+            GX->ud[0] = GX->ud[2];

+            GX->ud[1] = EX->ud[2];

+            GX->ud[2] = GX->ud[3];

+            GX->ud[3] = EX->ud[3];

+            break;

+        case 0x16:                      /* MOVHPS Gx,Ex */

+            nextop = F8;               /* MOVLHPS Gx,Ex (Ex==reg) */

+            GETEX(0);

+            GETGX;

+            GX->q[1] = EX->q[0];

+            break;

+        case 0x17:                      /* MOVHPS Ex,Gx */

+            nextop = F8;

+            GETEX(0);

+            GETGX;

+            EX->q[0] = GX->q[1];

+            break;

 

         case 0x1F:                      /* NOP (multi-byte) */

             nextop = F8;

diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index 3e768eee..6dfa4485 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -51,7 +51,121 @@ int Run660F(x64emu_t *emu, rex_t rex)
         GX->ud[2] = GX->ud[1];

         GX->ud[1] = EX->ud[0];

         break;

-

+    case 0x63:  /* PACKSSWB Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        if(GX==EX) {

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

+                GX->sb[i] = (EX->sw[i]<-128)?-128:((EX->sw[i]>127)?127:EX->sw[i]);

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

+        } else {

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

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

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

+                GX->sb[8+i] = (EX->sw[i]<-128)?-128:((EX->sw[i]>127)?127:EX->sw[i]);

+        }

+        break;

+    case 0x64:  /* PCMPGTB Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

+            GX->ub[i] = (GX->sb[i]>EX->sb[i])?0xFF:0x00;

+        break;

+    case 0x65:  /* PCMPGTW Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

+            GX->uw[i] = (GX->sw[i]>EX->sw[i])?0xFFFF:0x0000;

+        break;

+    case 0x66:  /* PCMPGTD Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

+            GX->ud[i] = (GX->sd[i]>EX->sd[i])?0xFFFFFFFF:0x00000000;

+        break;

+    case 0x67:  /* PACKUSWB Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        if(GX==EX) {

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

+                GX->ub[i] = (EX->sw[i]<0)?0:((EX->sw[i]>0xff)?0xff:EX->sw[i]);

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

+        } else {

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

+                GX->ub[i] = (GX->sw[i]<0)?0:((GX->sw[i]>0xff)?0xff:GX->sw[i]);

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

+                GX->ub[8+i] = (EX->sw[i]<0)?0:((EX->sw[i]>0xff)?0xff:EX->sw[i]);

+        }

+        break;

+    case 0x68:  /* PUNPCKHBW Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

+            GX->ub[2 * i] = GX->ub[i + 8];

+        if(GX==EX)

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

+                GX->ub[2 * i + 1] = GX->ub[2 * i];

+        else

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

+                GX->ub[2 * i + 1] = EX->ub[i + 8];

+        break;

+    case 0x69:  /* PUNPCKHWD Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

+            GX->uw[2 * i] = GX->uw[i + 4];

+        if(GX==EX)

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

+                GX->uw[2 * i + 1] = GX->uw[2 * i];

+        else

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

+                GX->uw[2 * i + 1] = EX->uw[i + 4];

+        break;

+    case 0x6A:  /* PUNPCKHDQ Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        // no copy needed if GX==EX

+        GX->ud[0] = GX->ud[2];

+        GX->ud[1] = EX->ud[2];

+        GX->ud[2] = GX->ud[3];

+        GX->ud[3] = EX->ud[3];

+        break;

+    case 0x6B:  /* PACKSSDW Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        if(GX==EX) {

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

+                GX->sw[i] = (EX->sd[i]<-32768)?-32768:((EX->sd[i]>32767)?32767:EX->sd[i]);

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

+        } else {

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

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

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

+                GX->sw[4+i] = (EX->sd[i]<-32768)?-32768:((EX->sd[i]>32767)?32767:EX->sd[i]);

+        }

+        break;

+    case 0x6C:  /* PUNPCKLQDQ Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

+        GX->q[1] = EX->q[0];

+        break;

+    case 0x6D:  /* PUNPCKHQDQ Gx,Ex */

+        nextop = F8;

+        GETEX(0);

+        GETGX;

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

+        GX->q[1] = EX->q[1];

+        break;

     case 0x6E:                      /* MOVD Gx, Ed */

         nextop = F8;

         GETED(0);