|
From: <sv...@va...> - 2005-05-14 02:04:16
|
Author: sewardj
Date: 2005-05-14 03:04:12 +0100 (Sat, 14 May 2005)
New Revision: 1197
Modified:
trunk/priv/guest-x86/toIR.c
Log:
Finally fix the behaviour of MOVQ (xmm -> xmm).
Modified: trunk/priv/guest-x86/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-x86/toIR.c 2005-05-14 02:02:50 UTC (rev 1196)
+++ trunk/priv/guest-x86/toIR.c 2005-05-14 02:04:12 UTC (rev 1197)
@@ -9245,6 +9245,7 @@
modrm =3D getIByte(delta+2);
if (epartIsReg(modrm)) {
/* fall through, awaiting test case */
+ /* dst: lo half copied, hi half zeroed */
} else {
addr =3D disAMode ( &alen, sorb, delta+2, dis_buf );
storeLE( mkexpr(addr),=20
@@ -9274,10 +9275,10 @@
}
=20
/* F3 0F 7E =3D MOVQ -- move 64 bits from E (mem or lo half xmm) to
- G (lo half xmm). If E is mem, upper half of G is zeroed out. */
+ G (lo half xmm). Upper half of G is zeroed out. */
/* F2 0F 10 =3D MOVSD -- move 64 bits from E (mem or lo half xmm) to
G (lo half xmm). If E is mem, upper half of G is zeroed out.
- (original defn) */
+ If E is reg, upper half of G is unchanged. */
if ((insn[0] =3D=3D 0xF2 && insn[1] =3D=3D 0x0F && insn[2] =3D=3D 0x1=
0)
|| (insn[0] =3D=3D 0xF3 && insn[1] =3D=3D 0x0F && insn[2] =3D=3D =
0x7E)) {
vassert(sz =3D=3D 4);
@@ -9285,6 +9286,10 @@
if (epartIsReg(modrm)) {
putXMMRegLane64( gregOfRM(modrm), 0,
getXMMRegLane64( eregOfRM(modrm), 0 ));
+ if (insn[0] =3D=3D 0xF3/*MOVQ*/) {
+ /* zero bits 127:64 */
+ putXMMRegLane64( gregOfRM(modrm), 1, mkU64(0) );
+ }
DIP("movsd %s,%s\n", nameXMMReg(eregOfRM(modrm)),
nameXMMReg(gregOfRM(modrm)));
delta +=3D 3+1;
|