about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runavx660f38.c53
-rw-r--r--src/emu/x64runavx660f3a.c55
2 files changed, 108 insertions, 0 deletions
diff --git a/src/emu/x64runavx660f38.c b/src/emu/x64runavx660f38.c
index c2ef2965..53a8e345 100644
--- a/src/emu/x64runavx660f38.c
+++ b/src/emu/x64runavx660f38.c
@@ -351,6 +351,32 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             }
             break;
 
+        case 0x58:  /* VPBROADCASTD Gx, Ex */
+            nextop = F8;
+            GETEX(0);
+            GETGX;
+            GETGY;
+            for(int i=0; i<4; ++i)
+                GX->ud[i] = EX->ud[0];
+            if(vex.l)
+                for(int i=0; i<4; ++i)
+                    GY->ud[i] = EX->ud[0];
+            else
+                GY->u128 = 0;
+            break;
+        case 0x59:  /* VPBROADCASTQ Gx, Ex */
+            nextop = F8;
+            GETEX(0);
+            GETGX;
+            GETGY;
+            for(int i=0; i<2; ++i)
+                GX->q[i] = EX->q[0];
+            if(vex.l)
+                for(int i=0; i<2; ++i)
+                    GY->q[i] = EX->q[0];
+            else
+                GY->u128 = 0;
+            break;
         case 0x5A:  /* VBROADCASTI128 Gx, Ex */
             nextop = F8;
             GETEX(0);
@@ -360,6 +386,33 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GY->u128 = EX->u128;
             break;
 
+        case 0x78:  /* VPBROADCASTB Gx, Ex */
+            nextop = F8;
+            GETEX(0);
+            GETGX;
+            GETGY;
+            for(int i=0; i<16; ++i)
+                GX->ub[i] = EX->ub[0];
+            if(vex.l)
+                for(int i=0; i<16; ++i)
+                    GY->ub[i] = EX->ub[0];
+            else
+                GY->u128 = 0;
+            break;
+        case 0x79:  /* VPBROADCASTW Gx, Ex */
+            nextop = F8;
+            GETEX(0);
+            GETGX;
+            GETGY;
+            for(int i=0; i<8; ++i)
+                GX->uw[i] = EX->uw[0];
+            if(vex.l)
+                for(int i=0; i<8; ++i)
+                    GY->uw[i] = EX->uw[0];
+            else
+                GY->u128 = 0;
+            break;
+
         case 0x92:  /* VGATHERDPD/VGATHERDPS Gx, VSIB, Vx */
             nextop = F8;
             if(((nextop&7)!=4) || MODREG) {
diff --git a/src/emu/x64runavx660f3a.c b/src/emu/x64runavx660f3a.c
index 61217ec3..16d10af0 100644
--- a/src/emu/x64runavx660f3a.c
+++ b/src/emu/x64runavx660f3a.c
@@ -90,6 +90,24 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
 
     switch(opcode) {
 
+        case 0x02:      /* VBLENDD Gx, Vx, Ex, u8 */
+            nextop = F8;
+            GETEX(1);
+            GETGX;
+            GETVX;
+            GETGY;
+            tmp8u = F8;
+            for(int i=0; i<4; ++i)
+                GX->ud[i] = (tmp8u&(1<<i))?EX->ud[i]:VX->ud[i];
+            if(vex.l) {
+                GETEY;
+                GETVY;
+                for(int i=0; i<4; ++i)
+                    GY->ud[i] = (tmp8u&(1<<(i+4)))?EY->ud[i]:VY->ud[i];
+            } else
+                GY->u128 = 0;
+            break;
+
         case 0x0C:      /* VBLENDPS Gx, Vx, Ex, u8 */
             nextop = F8;
             GETEX(1);
@@ -124,6 +142,23 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             } else
                 GY->u128 = 0;
             break;
+        case 0x0E:      /* VBLENDW Gx, Vx, Ex, u8 */
+            nextop = F8;
+            GETEX(1);
+            GETGX;
+            GETVX;
+            GETGY;
+            tmp8u = F8;
+            for(int i=0; i<8; ++i)
+                GX->uw[i] = (tmp8u&(1<<i))?EX->uw[i]:VX->uw[i];
+            if(vex.l) {
+                GETEY;
+                GETVY;
+                for(int i=0; i<8; ++i)
+                    GY->uw[i] = (tmp8u&(1<<i))?EY->uw[i]:VY->uw[i];
+            } else
+                GY->u128 = 0;
+            break;
         case 0x0F:      /* VPALIGNR GX, VX, EX, u8 */
             nextop = F8;
             GETEX(1);
@@ -413,6 +448,26 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             } else
                 GY->u128 = 0;
             break;
+        case 0x4C:      /* VBLENDPVB Gx, Vx, Ex, XMM/u8 */
+            nextop = F8;
+            GETEX(1);
+            GETGX;
+            GETVX;
+            GETGY;
+            tmp8u = F8;
+            tmp8u>>=4;
+            if(rex.is32bits)
+                tmp8u&=7;
+            for(int i=0; i<16; ++i)
+                GX->ub[i] = (emu->xmm[tmp8u].ub[i]&0x80)?EX->ub[i]:VX->ub[i];
+            if(vex.l) {
+                GETEY;
+                GETVY;
+                for(int i=0; i<16; ++i)
+                    GY->ub[i] = (emu->ymm[tmp8u].ub[i]&0x80)?EY->ub[i]:VY->ub[i];
+            } else
+                GY->u128 = 0;
+            break;
 
         case 0xDF:      // VAESKEYGENASSIST Gx, Ex, u8
             nextop = F8;