From: Julian Seward Date: Wed, 27 Apr 2005 11:42:44 +0000 (+0000) Subject: Add even more 64-bit integer primops (sigh) X-Git-Tag: svn/VALGRIND_3_0_1^2~188 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=47c7c76a25dfde63024c5b72ada9f388e5de3f95;p=thirdparty%2Fvalgrind.git Add even more 64-bit integer primops (sigh) git-svn-id: svn://svn.valgrind.org/vex/trunk@1146 --- diff --git a/VEX/priv/ir/irdefs.c b/VEX/priv/ir/irdefs.c index 3dbe71b225..747bd63831 100644 --- a/VEX/priv/ir/irdefs.c +++ b/VEX/priv/ir/irdefs.c @@ -142,11 +142,19 @@ void ppIROp ( IROp op ) 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; @@ -1350,8 +1358,9 @@ void typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 ) 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); @@ -1365,7 +1374,16 @@ void typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 ) 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: diff --git a/VEX/priv/ir/iropt.c b/VEX/priv/ir/iropt.c index a6e31cf65c..b78b8f6c49 100644 --- a/VEX/priv/ir/iropt.c +++ b/VEX/priv/ir/iropt.c @@ -898,6 +898,14 @@ static IRExpr* fold_Expr ( IRExpr* e ) 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)); @@ -919,6 +927,11 @@ static IRExpr* fold_Expr ( IRExpr* e ) 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( @@ -942,6 +955,10 @@ static IRExpr* fold_Expr ( IRExpr* e ) 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))); @@ -951,6 +968,18 @@ static IRExpr* fold_Expr ( IRExpr* e ) - (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; @@ -1262,6 +1291,14 @@ static IRExpr* fold_Expr ( IRExpr* e ) } 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 @@ -1331,7 +1368,6 @@ static IRExpr* fold_Expr ( IRExpr* e ) || 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); } diff --git a/VEX/pub/libvex_ir.h b/VEX/pub/libvex_ir.h index 808c63c918..645cacc282 100644 --- a/VEX/pub/libvex_ir.h +++ b/VEX/pub/libvex_ir.h @@ -286,8 +286,10 @@ typedef /* 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 */