about summary refs log tree commit diff stats
path: root/src/emu/x64runavxf20f.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/x64runavxf20f.c')
-rw-r--r--src/emu/x64runavxf20f.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/emu/x64runavxf20f.c b/src/emu/x64runavxf20f.c
index 6208f9f9..c0eff9d0 100644
--- a/src/emu/x64runavxf20f.c
+++ b/src/emu/x64runavxf20f.c
@@ -273,6 +273,35 @@ uintptr_t RunAVX_F20F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GY->u128 = 0;
             break;
 
+        case 0x70:  /* VPSHUFLW Gx, Ex, Ib */
+            nextop = F8;
+            GETEX(1);
+            GETGX; GETGY;
+            tmp8u = F8;
+            if(GX==EX) {
+                for (int i=0; i<4; ++i)
+                    eax1.uw[i] = EX->uw[(tmp8u>>(i*2))&3];
+                GX->q[0] = eax1.q[0];
+            } else {
+                for (int i=0; i<4; ++i)
+                    GX->uw[i] = EX->uw[(tmp8u>>(i*2))&3];
+                GX->q[1] = EX->q[1];
+            }
+            if(vex.l) {
+                GETEY;
+                if(GY==EY) {
+                    for (int i=0; i<4; ++i)
+                        eay1.uw[i] = EY->uw[(tmp8u>>(i*2))&3];
+                    GY->q[0] = eay1.q[0];
+                } else {
+                    for (int i=0; i<4; ++i)
+                        GY->uw[i] = EY->uw[(tmp8u>>(i*2))&3];
+                    GY->q[1] = EY->q[1];
+                }
+            } else
+                GY->u128 = 0;
+            break;
+
         case 0x7C:  /* VHADDPS Gx, Vx, Ex */
             nextop = F8;
             GETEX(0);