Implement UNPCKLPS and UNPCKHPS
and improve  UNPCKLPD.

MERGE TO STABLE


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1958 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_to_ucode.c b/coregrind/vg_to_ucode.c
index d14a7e0..701b6b2 100644
--- a/coregrind/vg_to_ucode.c
+++ b/coregrind/vg_to_ucode.c
@@ -4185,17 +4185,36 @@
       goto decode_success;
    }
 
-   /* 0x14: UNPCKLPD (src)xmmreg-or-mem, (dst)xmmreg */
-   /* 0x15: UNPCKHPD (src)xmmreg-or-mem, (dst)xmmreg */
+   /* 0x14: UNPCKLPD (src)xmmreg-or-mem, (dst)xmmreg.  Reads a+0
+      .. a+7, so we can say size 8 */
+   /* 0x15: UNPCKHPD (src)xmmreg-or-mem, (dst)xmmreg.  Reads a+8
+      .. a+15, but we have no way to express this, so better say size
+      16.  Sigh. */
    if (sz == 2
        && insn[0] == 0x0F 
        && (insn[1] == 0x14 || insn[1] == 0x15)) {
-      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+2, 16, 
+      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+2, 
+                                      insn[1]==0x14 ? 8 : 16, 
                                       "unpck{l,h}pd",
                                       0x66, insn[0], insn[1] );
       goto decode_success;
    }
 
+   /* 0x14: UNPCKLPS (src)xmmreg-or-mem, (dst)xmmreg  Reads a+0
+      .. a+7, so we can say size 8 */
+   /* 0x15: UNPCKHPS (src)xmmreg-or-mem, (dst)xmmreg  Reads a+8
+      .. a+15, but we have no way to express this, so better say size
+      16.  Sigh.  */
+   if (sz == 4
+       && insn[0] == 0x0F
+       && (insn[1] == 0x14 || insn[1] == 0x15)) {
+      eip = dis_SSE2_reg_or_mem ( cb, sorb, eip+2, 
+                                      insn[1]==0x14 ? 8 : 16, 
+                                      "unpck{l,h}ps",
+                                      insn[0], insn[1] );
+      goto decode_success;
+   }
+
    /* 0xFC: PADDB (src)xmmreg-or-mem, (dst)xmmreg */
    /* 0xFD: PADDW (src)xmmreg-or-mem, (dst)xmmreg */
    /* 0xFE: PADDD (src)xmmreg-or-mem, (dst)xmmreg */