|
From: <sv...@va...> - 2005-04-27 11:43:06
|
Author: sewardj
Date: 2005-04-27 12:42:44 +0100 (Wed, 27 Apr 2005)
New Revision: 1146
Modified:
trunk/priv/ir/irdefs.c
trunk/priv/ir/iropt.c
trunk/pub/libvex_ir.h
Log:
Add even more 64-bit integer primops (sigh)
Modified: trunk/priv/ir/irdefs.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/ir/irdefs.c 2005-04-26 23:39:45 UTC (rev 1145)
+++ trunk/priv/ir/irdefs.c 2005-04-27 11:42:44 UTC (rev 1146)
@@ -142,11 +142,19 @@
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;
=20
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 @@
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);
=20
case Iop_8Uto32: case Iop_8Sto32:
UNARY(Ity_I32,Ity_I8);
@@ -1365,7 +1374,16 @@
case Iop_32Sto64: case Iop_32Uto64:
UNARY(Ity_I64,Ity_I32);
=20
+ 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);
=20
case Iop_ScaleF64: case Iop_PRemF64: case Iop_PRem1F64:
case Iop_AtanF64: case Iop_Yl2xF64: case Iop_Yl2xp1F64:=20
Modified: trunk/priv/ir/iropt.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/ir/iropt.c 2005-04-26 23:39:45 UTC (rev 1145)
+++ trunk/priv/ir/iropt.c 2005-04-27 11:42:44 UTC (rev 1146)
@@ -898,6 +898,14 @@
e2 =3D IRExpr_Const(IRConst_U32((UInt)s32));
break;
}
+ case Iop_8Uto64:
+ e2 =3D IRExpr_Const(IRConst_U64(
+ 0xFFULL & e->Iex.Unop.arg->Iex.Const.con->Ico.U8));
+ break;
+ case Iop_16Uto64:
+ e2 =3D IRExpr_Const(IRConst_U64(
+ 0xFFFFULL & e->Iex.Unop.arg->Iex.Const.con->Ico.U16)=
);
+ break;
case Iop_8Uto32:
e2 =3D IRExpr_Const(IRConst_U32(
0xFF & e->Iex.Unop.arg->Iex.Const.con->Ico.U8));
@@ -919,6 +927,11 @@
1 =3D=3D (1 & e->Iex.Unop.arg->Iex.Const.con->Ico.U3=
2)
)));
break;
+ case Iop_64to1:
+ e2 =3D IRExpr_Const(IRConst_U1(toBool(
+ 1 =3D=3D (1 & e->Iex.Unop.arg->Iex.Const.con->Ico.U6=
4)
+ )));
+ break;
=20
case Iop_Not64:
e2 =3D IRExpr_Const(IRConst_U64(
@@ -942,6 +955,10 @@
notBool(e->Iex.Unop.arg->Iex.Const.con->Ico.U1)));
break;
=20
+ case Iop_Neg64:
+ e2 =3D IRExpr_Const(IRConst_U64(
+ - (e->Iex.Unop.arg->Iex.Const.con->Ico.U64)));
+ break;
case Iop_Neg32:
e2 =3D IRExpr_Const(IRConst_U32(
- (e->Iex.Unop.arg->Iex.Const.con->Ico.U32)));
@@ -951,6 +968,18 @@
- (e->Iex.Unop.arg->Iex.Const.con->Ico.U8)));
break;
=20
+ case Iop_64to8: {
+ ULong w64 =3D e->Iex.Unop.arg->Iex.Const.con->Ico.U64;
+ w64 &=3D 0xFFULL;
+ e2 =3D IRExpr_Const(IRConst_U8( (UChar)w64 ));
+ break;
+ }
+ case Iop_64to16: {
+ ULong w64 =3D e->Iex.Unop.arg->Iex.Const.con->Ico.U64;
+ w64 &=3D 0xFFFFULL;
+ e2 =3D IRExpr_Const(IRConst_U16( (UChar)w64 ));
+ break;
+ }
case Iop_64to32: {
ULong w64 =3D e->Iex.Unop.arg->Iex.Const.con->Ico.U64;
w64 &=3D 0x00000000FFFFFFFFULL;
@@ -1262,6 +1291,14 @@
} else {
=20
/* other cases (identities, etc) */
+
+ /* Shl64/Shr64(x,0) =3D=3D> x */
+ if ((e->Iex.Binop.op =3D=3D Iop_Shl64 || e->Iex.Binop.op =3D=3D=
Iop_Shr64)
+ && e->Iex.Binop.arg2->tag =3D=3D Iex_Const
+ && e->Iex.Binop.arg2->Iex.Const.con->Ico.U8 =3D=3D 0) {
+ e2 =3D e->Iex.Binop.arg1;
+ } else
+
/* Shl32/Shr32(x,0) =3D=3D> x */
if ((e->Iex.Binop.op =3D=3D Iop_Shl32 || e->Iex.Binop.op =3D=3D=
Iop_Shr32)
&& e->Iex.Binop.arg2->tag =3D=3D Iex_Const
@@ -1331,7 +1368,6 @@
|| e->Iex.Binop.op =3D=3D Iop_Xor16
|| e->Iex.Binop.op =3D=3D Iop_Xor8)
&& sameIRTemps(e->Iex.Binop.arg1, e->Iex.Binop.arg2)) {
- vassert(0); /* awaiting test case */
e2 =3D mkZeroForXor(e->Iex.Binop.op);
}
=20
Modified: trunk/pub/libvex_ir.h
=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/pub/libvex_ir.h 2005-04-26 23:39:45 UTC (rev 1145)
+++ trunk/pub/libvex_ir.h 2005-04-27 11:42:44 UTC (rev 1146)
@@ -286,8 +286,10 @@
/* 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 */
|