|
From: <sv...@va...> - 2005-04-23 01:14:57
|
Author: sewardj
Date: 2005-04-23 02:14:51 +0100 (Sat, 23 Apr 2005)
New Revision: 3544
Modified:
trunk/memcheck/mc_translate.c
Log:
Add a few cases arising from testing on amd64.
Modified: trunk/memcheck/mc_translate.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/memcheck/mc_translate.c 2005-04-22 21:10:28 UTC (rev 3543)
+++ trunk/memcheck/mc_translate.c 2005-04-23 01:14:51 UTC (rev 3544)
@@ -507,7 +507,18 @@
case Ity_I64:=20
tmp1 =3D assignNew(mce, Ity_I1, binop(Iop_CmpNE64, vbits, mkU64=
(0)));
break;
+ case Ity_I128: {
+ /* Gah. Chop it in half, OR the halves together, and compare
+ that with zero. */
+ IRAtom* tmp2 =3D assignNew(mce, Ity_I64, unop(Iop_128HIto64, vb=
its));
+ IRAtom* tmp3 =3D assignNew(mce, Ity_I64, unop(Iop_128to64, vbit=
s));
+ IRAtom* tmp4 =3D assignNew(mce, Ity_I64, binop(Iop_Or64, tmp2, =
tmp3));
+ tmp1 =3D assignNew(mce, Ity_I1,=20
+ binop(Iop_CmpNE64, tmp4, mkU64(0)=
));
+ break;
+ }
default:
+ ppIRType(ty);
VG_(tool_panic)("mkPCastTo(1)");
}
tl_assert(tmp1);
@@ -527,6 +538,10 @@
tmp1 =3D assignNew(mce, Ity_I64, unop(Iop_1Sto64, tmp1));
tmp1 =3D assignNew(mce, Ity_V128, binop(Iop_64HLtoV128, tmp1, t=
mp1));
return tmp1;
+ case Ity_I128:
+ tmp1 =3D assignNew(mce, Ity_I64, unop(Iop_1Sto64, tmp1));
+ tmp1 =3D assignNew(mce, Ity_I128, binop(Iop_64HLto128, tmp1, tm=
p1));
+ return tmp1;
default:=20
ppIRType(dst_ty);
VG_(tool_panic)("mkPCastTo(2)");
@@ -1509,6 +1524,10 @@
case Iop_InterleaveHI8x16:
return assignNew(mce, Ity_V128, binop(op, vatom1, vatom2));
=20
+ /* I128-bit data-steering */
+ case Iop_64HLto128:
+ return assignNew(mce, Ity_I128, binop(op, vatom1, vatom2));
+
/* Scalar floating point */
=20
case Iop_RoundF64:
@@ -1550,6 +1569,10 @@
case Iop_DivModS64to32:
return mkLazy2(mce, Ity_I64, vatom1, vatom2);
=20
+ case Iop_DivModU128to64:
+ case Iop_DivModS128to64:
+ return mkLazy2(mce, Ity_I128, vatom1, vatom2);
+
case Iop_16HLto32:
return assignNew(mce, Ity_I32, binop(op, vatom1, vatom2));
case Iop_32HLto64:
@@ -1601,6 +1624,7 @@
return mkLeft32(mce, mkUifU32(mce, vatom1,vatom2));
=20
/* could do better: Add64, Sub64 */
+ case Iop_Mul64:
case Iop_Add64:
case Iop_Sub64:
return mkLeft64(mce, mkUifU64(mce, vatom1,vatom2));
@@ -1614,12 +1638,22 @@
case Iop_Add8:
return mkLeft8(mce, mkUifU8(mce, vatom1,vatom2));
=20
+ case Iop_CmpEQ64:=20
+ if (mce->bogusLiterals)
+ return expensiveCmpEQorNE(mce,Ity_I64, vatom1,vatom2, atom1,=
atom2 );
+ else
+ goto cheap_cmp64;
+ cheap_cmp64:
+ // case Iop_CmpLE64S: case Iop_CmpLE64U:=20
+ // case Iop_CmpLT64U: case Iop_CmpLT64S:
+ // case Iop_CmpNE64:
+ return mkPCastTo(mce, Ity_I1, mkUifU64(mce, vatom1,vatom2));
+
case Iop_CmpEQ32:=20
if (mce->bogusLiterals)
return expensiveCmpEQorNE(mce,Ity_I32, vatom1,vatom2, atom1,=
atom2 );
else
goto cheap_cmp32;
-
cheap_cmp32:
case Iop_CmpLE32S: case Iop_CmpLE32U:=20
case Iop_CmpLT32U: case Iop_CmpLT32S:
@@ -1648,7 +1682,7 @@
complainIfUndefined(mce, atom2);
return assignNew(mce, Ity_I8, binop(op, vatom1, atom2));
=20
- case Iop_Shl64: case Iop_Shr64:=20
+ case Iop_Shl64: case Iop_Shr64: case Iop_Sar64:
/* Same scheme as with 32-bit shifts. */
complainIfUndefined(mce, atom2);
return assignNew(mce, Ity_I64, binop(op, vatom1, atom2));
@@ -1991,6 +2025,10 @@
if (tyH =3D=3D Ity_I64) {
switch (ty) {
case Ity_I32: return assignNew(mce, tyH, unop(Iop_32Uto64, vato=
m));
+ case Ity_I16: return assignNew(mce, tyH, unop(Iop_32Uto64,=20
+ assignNew(mce, Ity_I32, unop(Iop_16Uto32, =
vatom))));
+ case Ity_I8: return assignNew(mce, tyH, unop(Iop_32Uto64,=20
+ assignNew(mce, Ity_I32, unop(Iop_8Uto32, v=
atom))));
default: goto unhandled;
}
} else {
|