case Ity_I64:
tmp1 = 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 = assignNew(mce, Ity_I64, unop(Iop_128HIto64, vbits));
+ IRAtom* tmp3 = assignNew(mce, Ity_I64, unop(Iop_128to64, vbits));
+ IRAtom* tmp4 = assignNew(mce, Ity_I64, binop(Iop_Or64, tmp2, tmp3));
+ tmp1 = assignNew(mce, Ity_I1,
+ binop(Iop_CmpNE64, tmp4, mkU64(0)));
+ break;
+ }
default:
+ ppIRType(ty);
VG_(tool_panic)("mkPCastTo(1)");
}
tl_assert(tmp1);
tmp1 = assignNew(mce, Ity_I64, unop(Iop_1Sto64, tmp1));
tmp1 = assignNew(mce, Ity_V128, binop(Iop_64HLtoV128, tmp1, tmp1));
return tmp1;
+ case Ity_I128:
+ tmp1 = assignNew(mce, Ity_I64, unop(Iop_1Sto64, tmp1));
+ tmp1 = assignNew(mce, Ity_I128, binop(Iop_64HLto128, tmp1, tmp1));
+ return tmp1;
default:
ppIRType(dst_ty);
VG_(tool_panic)("mkPCastTo(2)");
case Iop_InterleaveHI8x16:
return assignNew(mce, Ity_V128, binop(op, vatom1, vatom2));
+ /* I128-bit data-steering */
+ case Iop_64HLto128:
+ return assignNew(mce, Ity_I128, binop(op, vatom1, vatom2));
+
/* Scalar floating point */
case Iop_RoundF64:
case Iop_DivModS64to32:
return mkLazy2(mce, Ity_I64, vatom1, vatom2);
+ 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:
return mkLeft32(mce, mkUifU32(mce, vatom1,vatom2));
/* could do better: Add64, Sub64 */
+ case Iop_Mul64:
case Iop_Add64:
case Iop_Sub64:
return mkLeft64(mce, mkUifU64(mce, vatom1,vatom2));
case Iop_Add8:
return mkLeft8(mce, mkUifU8(mce, vatom1,vatom2));
+ case Iop_CmpEQ64:
+ if (mce->bogusLiterals)
+ return expensiveCmpEQorNE(mce,Ity_I64, vatom1,vatom2, atom1,atom2 );
+ else
+ goto cheap_cmp64;
+ cheap_cmp64:
+ // case Iop_CmpLE64S: case Iop_CmpLE64U:
+ // case Iop_CmpLT64U: case Iop_CmpLT64S:
+ // case Iop_CmpNE64:
+ return mkPCastTo(mce, Ity_I1, mkUifU64(mce, vatom1,vatom2));
+
case Iop_CmpEQ32:
if (mce->bogusLiterals)
return expensiveCmpEQorNE(mce,Ity_I32, vatom1,vatom2, atom1,atom2 );
else
goto cheap_cmp32;
-
cheap_cmp32:
case Iop_CmpLE32S: case Iop_CmpLE32U:
case Iop_CmpLT32U: case Iop_CmpLT32S:
complainIfUndefined(mce, atom2);
return assignNew(mce, Ity_I8, binop(op, vatom1, atom2));
- case Iop_Shl64: case Iop_Shr64:
+ 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));
if (tyH == Ity_I64) {
switch (ty) {
case Ity_I32: return assignNew(mce, tyH, unop(Iop_32Uto64, vatom));
+ case Ity_I16: return assignNew(mce, tyH, unop(Iop_32Uto64,
+ assignNew(mce, Ity_I32, unop(Iop_16Uto32, vatom))));
+ case Ity_I8: return assignNew(mce, tyH, unop(Iop_32Uto64,
+ assignNew(mce, Ity_I32, unop(Iop_8Uto32, vatom))));
default: goto unhandled;
}
} else {