case Iop_32Sto64: vex_printf("32Sto64"); return;
case Iop_32Uto64: vex_printf("32Uto64"); return;
case Iop_32to8: vex_printf("32to8"); return;
+ case Iop_16Uto64: vex_printf("16Uto64"); return;
+ case Iop_16Sto64: vex_printf("16Sto64"); return;
+ case Iop_8Uto64: vex_printf("8Uto64"); return;
+ case Iop_8Sto64: vex_printf("8Sto64"); return;
+ case Iop_64to16: vex_printf("64to16"); return;
+ case Iop_64to8: vex_printf("64to8"); return;
case Iop_Not1: vex_printf("Not1"); return;
case Iop_32to1: vex_printf("32to1"); return;
+ case Iop_64to1: vex_printf("64to1"); return;
case Iop_1Uto8: vex_printf("1Uto8"); return;
case Iop_1Uto32: vex_printf("1Uto32"); return;
+ case Iop_1Uto64: vex_printf("1Uto64"); return;
case Iop_1Sto8: vex_printf("1Sto8"); return;
case Iop_1Sto16: vex_printf("1Sto16"); return;
case Iop_1Sto32: vex_printf("1Sto32"); return;
case Iop_1Sto8: UNARY(Ity_I8,Ity_I1);
case Iop_1Sto16: UNARY(Ity_I16,Ity_I1);
case Iop_1Uto32: case Iop_1Sto32: UNARY(Ity_I32,Ity_I1);
- case Iop_1Sto64: UNARY(Ity_I64,Ity_I1);
+ case Iop_1Sto64: case Iop_1Uto64: UNARY(Ity_I64,Ity_I1);
case Iop_32to1: UNARY(Ity_I1,Ity_I32);
+ case Iop_64to1: UNARY(Ity_I1,Ity_I64);
case Iop_8Uto32: case Iop_8Sto32:
UNARY(Ity_I32,Ity_I8);
case Iop_32Sto64: case Iop_32Uto64:
UNARY(Ity_I64,Ity_I32);
+ case Iop_8Uto64: case Iop_8Sto64:
+ UNARY(Ity_I64,Ity_I8);
+
+ case Iop_16Uto64: case Iop_16Sto64:
+ UNARY(Ity_I64,Ity_I16);
+ case Iop_64to16:
+ UNARY(Ity_I16, Ity_I64);
+
case Iop_32to8: UNARY(Ity_I8,Ity_I32);
+ case Iop_64to8: UNARY(Ity_I8,Ity_I64);
case Iop_ScaleF64: case Iop_PRemF64: case Iop_PRem1F64:
case Iop_AtanF64: case Iop_Yl2xF64: case Iop_Yl2xp1F64:
e2 = IRExpr_Const(IRConst_U32((UInt)s32));
break;
}
+ case Iop_8Uto64:
+ e2 = IRExpr_Const(IRConst_U64(
+ 0xFFULL & e->Iex.Unop.arg->Iex.Const.con->Ico.U8));
+ break;
+ case Iop_16Uto64:
+ e2 = IRExpr_Const(IRConst_U64(
+ 0xFFFFULL & e->Iex.Unop.arg->Iex.Const.con->Ico.U16));
+ break;
case Iop_8Uto32:
e2 = IRExpr_Const(IRConst_U32(
0xFF & e->Iex.Unop.arg->Iex.Const.con->Ico.U8));
1 == (1 & e->Iex.Unop.arg->Iex.Const.con->Ico.U32)
)));
break;
+ case Iop_64to1:
+ e2 = IRExpr_Const(IRConst_U1(toBool(
+ 1 == (1 & e->Iex.Unop.arg->Iex.Const.con->Ico.U64)
+ )));
+ break;
case Iop_Not64:
e2 = IRExpr_Const(IRConst_U64(
notBool(e->Iex.Unop.arg->Iex.Const.con->Ico.U1)));
break;
+ case Iop_Neg64:
+ e2 = IRExpr_Const(IRConst_U64(
+ - (e->Iex.Unop.arg->Iex.Const.con->Ico.U64)));
+ break;
case Iop_Neg32:
e2 = IRExpr_Const(IRConst_U32(
- (e->Iex.Unop.arg->Iex.Const.con->Ico.U32)));
- (e->Iex.Unop.arg->Iex.Const.con->Ico.U8)));
break;
+ case Iop_64to8: {
+ ULong w64 = e->Iex.Unop.arg->Iex.Const.con->Ico.U64;
+ w64 &= 0xFFULL;
+ e2 = IRExpr_Const(IRConst_U8( (UChar)w64 ));
+ break;
+ }
+ case Iop_64to16: {
+ ULong w64 = e->Iex.Unop.arg->Iex.Const.con->Ico.U64;
+ w64 &= 0xFFFFULL;
+ e2 = IRExpr_Const(IRConst_U16( (UChar)w64 ));
+ break;
+ }
case Iop_64to32: {
ULong w64 = e->Iex.Unop.arg->Iex.Const.con->Ico.U64;
w64 &= 0x00000000FFFFFFFFULL;
} else {
/* other cases (identities, etc) */
+
+ /* Shl64/Shr64(x,0) ==> x */
+ if ((e->Iex.Binop.op == Iop_Shl64 || e->Iex.Binop.op == Iop_Shr64)
+ && e->Iex.Binop.arg2->tag == Iex_Const
+ && e->Iex.Binop.arg2->Iex.Const.con->Ico.U8 == 0) {
+ e2 = e->Iex.Binop.arg1;
+ } else
+
/* Shl32/Shr32(x,0) ==> x */
if ((e->Iex.Binop.op == Iop_Shl32 || e->Iex.Binop.op == Iop_Shr32)
&& e->Iex.Binop.arg2->tag == Iex_Const
|| e->Iex.Binop.op == Iop_Xor16
|| e->Iex.Binop.op == Iop_Xor8)
&& sameIRTemps(e->Iex.Binop.arg1, e->Iex.Binop.arg2)) {
- vassert(0); /* awaiting test case */
e2 = mkZeroForXor(e->Iex.Binop.op);
}
/* 1-bit stuff */
Iop_Not1, /* :: Ity_Bit -> Ity_Bit */
Iop_32to1, /* :: Ity_I32 -> Ity_Bit, just select bit[0] */
- Iop_1Uto8, /* :: Ity_Bit -> Ity_I8, unsigned widen */
+ Iop_64to1, /* :: Ity_I64 -> Ity_Bit, just select bit[0] */
+ Iop_1Uto8, /* :: Ity_Bit -> Ity_I8, unsigned widen */
Iop_1Uto32, /* :: Ity_Bit -> Ity_I32, unsigned widen */
+ Iop_1Uto64, /* :: Ity_Bit -> Ity_I64, unsigned widen */
Iop_1Sto8, /* :: Ity_Bit -> Ity_I8, signed widen */
Iop_1Sto16, /* :: Ity_Bit -> Ity_I16, signed widen */
Iop_1Sto32, /* :: Ity_Bit -> Ity_I32, signed widen */