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 */