about summary refs log tree commit diff stats
path: root/src/emu/x64runavx660f.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/x64runavx660f.c')
-rw-r--r--src/emu/x64runavx660f.c62
1 files changed, 38 insertions, 24 deletions
diff --git a/src/emu/x64runavx660f.c b/src/emu/x64runavx660f.c
index 195d950b..0e440eff 100644
--- a/src/emu/x64runavx660f.c
+++ b/src/emu/x64runavx660f.c
@@ -61,7 +61,7 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
 
     switch(opcode) {
 
-        case 0x10:                      /* MOVUPD Gx, Ex */
+        case 0x10:                      /* VMOVUPD Gx, Ex */
             nextop = F8;
             GETEX(0);
             GETGX;
@@ -73,7 +73,7 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             } else
                 GY->u128 = 0;
             break;
-        case 0x11:                      /* MOVUPD Ex, Gx */
+        case 0x11:                      /* VMOVUPD Ex, Gx */
             nextop = F8;
             GETEX(0);
             GETGX;
@@ -82,23 +82,30 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                 GETEY;
                 GETGY;
                 memcpy(EY, GY, 16); // unaligned...
+            } else if(MODREG) {
+                GETEY;
+                EY->u128 = 0;
             }
             break;
         case 0x12:                      /* VMOVLPD Gx, Vx, Eq */
             nextop = F8;
-            GETE8(0);
-            GETGX;
-            GETVX;
-            GETGY;
-            GX->q[0] = ED->q[0];
-            GX->q[1] = VX->q[1];
-            GY->u128 = 0;
+            if(!MODREG) {
+                GETE8(0);
+                GETGX;
+                GETVX;
+                GETGY;
+                GX->q[0] = ED->q[0];
+                GX->q[1] = VX->q[1];
+                GY->u128 = 0;
+            }
             break;
         case 0x13:                      /* VMOVLPD Eq, Gx */
             nextop = F8;
-            GETE8(0);
-            GETGX;
-            ED->q[0] = GX->q[0];
+            if(!MODREG) {
+                GETE8(0);
+                GETGX;
+                ED->q[0] = GX->q[0];
+            }
             break;
         case 0x14:                      /* VUNPCKLPD Gx, Vx, Ex */
             nextop = F8;
@@ -128,19 +135,23 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             break;
         case 0x16:                      /* VMOVHPD Gx, Vx, Ed */
             nextop = F8;
-            GETE8(0);
-            GETGX;
-            GETVX;
-            GX->q[1] = ED->q[0];
-            GX->q[0] = VX->q[0];
-            GETGY;
-            GY->u128 = 0;
+            if(!MODREG) {
+                GETE8(0);
+                GETGX;
+                GETVX;
+                GX->q[1] = ED->q[0];
+                GX->q[0] = VX->q[0];
+                GETGY;
+                GY->u128 = 0;
+            }
             break;
         case 0x17:                      /* VMOVHPD Ed, Gx */
             nextop = F8;
-            GETE8(0);
-            GETGX;
-            ED->q[0] = GX->q[1];
+            if(!MODREG) {
+                GETE8(0);
+                GETGX;
+                ED->q[0] = GX->q[1];
+            }
             break;
 
         case 0x28:                      /* VMOVAPD Gx, Ex */
@@ -833,7 +844,7 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                 GETEY;
                 GY->q[0] = EY->q[0];
                 GY->q[1] = EY->q[1];
-            }   else
+            } else
                 GY->u128 = 0;
             break;
         case 0x70:  /* VPSHUFD Gx,Ex,Ib */
@@ -1196,7 +1207,10 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                 GETEY;
                 EY->q[0] = GY->q[0];
                 EY->q[1] = GY->q[1];
-            } // no upper raz?
+            } else if(MODREG) {
+                GETEY;
+                EY->u128 = 0;
+            }
             break;
 
         case 0xC2:                      /* VCMPPD Gx, Vx, Ex, Ib */