about summary refs log tree commit diff stats
path: root/src/emu/x64runavxf30f.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/x64runavxf30f.c')
-rw-r--r--src/emu/x64runavxf30f.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/emu/x64runavxf30f.c b/src/emu/x64runavxf30f.c
index c8fd8b69..541fca9e 100644
--- a/src/emu/x64runavxf30f.c
+++ b/src/emu/x64runavxf30f.c
@@ -353,6 +353,34 @@ uintptr_t RunAVX_F30F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             } else
                 GY->q[0] = GY->q[1] = 0;
             break;
+        case 0x70:  /* VPSHUFHW Gx, Ex, Ib */
+            nextop = F8;
+            GETEX(1);
+            GETGX; GETGY;
+            tmp8u = F8;
+            if(GX==EX) {
+                for (int i=0; i<4; ++i)
+                    eax1.uw[4+i] = EX->uw[4+((tmp8u>>(i*2))&3)];
+                GX->q[1] = eax1.q[1];
+            } else {
+                for (int i=0; i<4; ++i)
+                    GX->uw[4+i] = EX->uw[4+((tmp8u>>(i*2))&3)];
+                GX->q[0] = EX->q[0];
+            }
+            if(vex.l) {
+                GETEY;
+                if(GY==EY) {
+                    for (int i=0; i<4; ++i)
+                        eay1.uw[4+i] = EY->uw[4+((tmp8u>>(i*2))&3)];
+                    GY->q[1] = eay1.q[1];
+                } else {
+                    for (int i=0; i<4; ++i)
+                        GY->uw[4+i] = EY->uw[4+((tmp8u>>(i*2))&3)];
+                    GY->q[0] = EY->q[0];
+                }
+            } else
+                GY->u128 = 0;
+            break;
 
         case 0x7E:  /* MOVQ Gx, Ex */
             nextop = F8;