Author: sewardj
Date: 2005-07-01 00:31:27 +0100 (Fri, 01 Jul 2005)
New Revision: 1239
Log:
Enhance IR so as to distinguish between little- and big-endian loads and
stores, so that PPC can be properly handled. Until now it's been hardwir=
ed
to assume little-endian.
As a result, IRStmt_STle is renamed IRStmt_Store and IRExpr_LDle is
renamed IRExpr_Load.
Modified:
trunk/priv/guest-amd64/toIR.c
trunk/priv/guest-arm/toIR.c
trunk/priv/guest-ppc32/toIR.c
trunk/priv/guest-x86/toIR.c
trunk/priv/host-amd64/isel.c
trunk/priv/host-arm/isel.c
trunk/priv/host-ppc32/isel.c
trunk/priv/host-x86/isel.c
trunk/priv/ir/irdefs.c
trunk/priv/ir/irmatch.c
trunk/priv/ir/iropt.c
trunk/pub/libvex_ir.h
Modified: trunk/priv/guest-amd64/toIR.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/guest-amd64/toIR.c 2005-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/guest-amd64/toIR.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -221,12 +221,12 @@
=20
static void storeLE ( IRExpr* addr, IRExpr* data )
{
- stmt( IRStmt_STle(addr,data) );
+ stmt( IRStmt_Store(Iend_LE,addr,data) );
}
=20
static IRExpr* loadLE ( IRType ty, IRExpr* data )
{
- return IRExpr_LDle(ty,data);
+ return IRExpr_Load(Iend_LE,ty,data);
}
=20
static IROp mkSizedOp ( IRType ty, IROp op8 )
@@ -5420,7 +5420,7 @@
case 0: /* FLD double-real */
DIP("fldl %s\n", dis_buf);
fp_push();
- put_ST(0, IRExpr_LDle(Ity_F64, mkexpr(addr)));
+ put_ST(0, loadLE(Ity_F64, mkexpr(addr)));
break;
=20
case 2: /* FST double-real */
Modified: trunk/priv/guest-arm/toIR.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/guest-arm/toIR.c 2005-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/guest-arm/toIR.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -484,7 +484,7 @@
=20
static void storeLE ( IRExpr* addr, IRExpr* data )
{
- stmt( IRStmt_STle(addr,data) );
+ stmt( IRStmt_Store(Iend_LE,addr,data) );
}
=20
static IRExpr* unop ( IROp op, IRExpr* a )
@@ -534,7 +534,7 @@
=20
static IRExpr* loadLE ( IRType ty, IRExpr* data )
{
- return IRExpr_LDle(ty,data);
+ return IRExpr_Load(Iend_LE,ty,data);
}
=20
#if 0
Modified: trunk/priv/guest-ppc32/toIR.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/guest-ppc32/toIR.c 2005-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/guest-ppc32/toIR.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -653,15 +653,17 @@
return IRExpr_Get( vectorGuestRegOffset(archreg), Ity_V128 );
}
=20
+#if 0
/* Ditto, but write to a reg instead. */
+/* apparently unused, jrs 2005-06-30 */
static void putVReg ( UInt archreg, IRExpr* e )
{
vassert(archreg < 32);
vassert(typeOfIRExpr(irbb->tyenv, e) =3D=3D Ity_V128);
stmt( IRStmt_Put(vectorGuestRegOffset(archreg), e) );
}
+#endif
=20
-
static void assign ( IRTemp dst, IRExpr* e )
{
stmt( IRStmt_Tmp(dst, e) );
@@ -669,7 +671,7 @@
=20
static void storeBE ( IRExpr* addr, IRExpr* data )
{
- stmt( IRStmt_STle(addr,data) );
+ stmt( IRStmt_Store(Iend_BE,addr,data) );
}
=20
static IRExpr* unop ( IROp op, IRExpr* a )
@@ -712,7 +714,7 @@
=20
static IRExpr* loadBE ( IRType ty, IRExpr* data )
{
- return IRExpr_LDle(ty,data);
+ return IRExpr_Load(Iend_BE,ty,data);
}
=20
// ROTL(src32, rot_amt5)
Modified: trunk/priv/guest-x86/toIR.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/guest-x86/toIR.c 2005-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/guest-x86/toIR.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -777,7 +777,7 @@
=20
static void storeLE ( IRExpr* addr, IRExpr* data )
{
- stmt( IRStmt_STle(addr,data) );
+ stmt( IRStmt_Store(Iend_LE,addr,data) );
}
=20
static IRExpr* unop ( IROp op, IRExpr* a )
@@ -834,7 +834,7 @@
=20
static IRExpr* loadLE ( IRType ty, IRExpr* data )
{
- return IRExpr_LDle(ty,data);
+ return IRExpr_Load(Iend_LE,ty,data);
}
=20
static IROp mkSizedOp ( IRType ty, IROp op8 )
@@ -4551,7 +4551,7 @@
case 0: /* FLD double-real */
DIP("fldl %s\n", dis_buf);
fp_push();
- put_ST(0, IRExpr_LDle(Ity_F64, mkexpr(addr)));
+ put_ST(0, loadLE(Ity_F64, mkexpr(addr)));
break;
=20
case 2: /* FST double-real */
Modified: trunk/priv/host-amd64/isel.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/host-amd64/isel.c 2005-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/host-amd64/isel.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -797,9 +797,13 @@
}
=20
/* --------- LOAD --------- */
- case Iex_LDle: {
+ case Iex_Load: {
HReg dst =3D newVRegI(env);
- AMD64AMode* amode =3D iselIntExpr_AMode ( env, e->Iex.LDle.addr );
+ AMD64AMode* amode =3D iselIntExpr_AMode ( env, e->Iex.Load.addr );
+
+ if (e->Iex.Load.end !=3D Iend_LE)
+ goto irreducible;
+
if (ty =3D=3D Ity_I64) {
addInstr(env, AMD64Instr_Alu64R(Aalu_MOV,
AMD64RMI_Mem(amode), dst) );
@@ -1777,8 +1781,8 @@
}
=20
/* special case: 64-bit load from memory */
- if (e->tag =3D=3D Iex_LDle && ty =3D=3D Ity_I64) {
- AMD64AMode* am =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ if (e->tag =3D=3D Iex_Load && ty =3D=3D Ity_I64 && e->Iex.Load.end =3D=
=3D Iend_LE) {
+ AMD64AMode* am =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
return AMD64RMI_Mem(am);
}
=20
@@ -2629,11 +2633,11 @@
return lookupIRTemp(env, e->Iex.Tmp.tmp);
}
=20
- if (e->tag =3D=3D Iex_LDle) {
+ if (e->tag =3D=3D Iex_Load && e->Iex.Load.end =3D=3D Iend_LE) {
AMD64AMode* am;
HReg res =3D newVRegV(env);
- vassert(e->Iex.LDle.ty =3D=3D Ity_F32);
- am =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty =3D=3D Ity_F32);
+ am =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, AMD64Instr_SseLdSt(True/*load*/, 4, res, am));
return res;
}
@@ -2753,11 +2757,11 @@
return res;
}
=20
- if (e->tag =3D=3D Iex_LDle) {
+ if (e->tag =3D=3D Iex_Load && e->Iex.Load.end =3D=3D Iend_LE) {
AMD64AMode* am;
HReg res =3D newVRegV(env);
- vassert(e->Iex.LDle.ty =3D=3D Ity_F64);
- am =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty =3D=3D Ity_F64);
+ am =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, AMD64Instr_SseLdSt( True/*load*/, 8, res, am ));
return res;
}
@@ -3071,9 +3075,9 @@
return dst;
}
=20
- if (e->tag =3D=3D Iex_LDle) {
+ if (e->tag =3D=3D Iex_Load && e->Iex.Load.end =3D=3D Iend_LE) {
HReg dst =3D newVRegV(env);
- AMD64AMode* am =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ AMD64AMode* am =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, AMD64Instr_SseLdSt( True/*load*/, 16, dst, am ));
return dst;
}
@@ -3488,38 +3492,42 @@
switch (stmt->tag) {
=20
/* --------- STORE --------- */
- case Ist_STle: {
+ case Ist_Store: {
AMD64AMode* am;
- IRType tya =3D typeOfIRExpr(env->type_env, stmt->Ist.STle.addr);
- IRType tyd =3D typeOfIRExpr(env->type_env, stmt->Ist.STle.data);
- vassert(tya =3D=3D Ity_I64);
- am =3D iselIntExpr_AMode(env, stmt->Ist.STle.addr);
+ IRType tya =3D typeOfIRExpr(env->type_env, stmt->Ist.Store.addr=
);
+ IRType tyd =3D typeOfIRExpr(env->type_env, stmt->Ist.Store.data=
);
+ IREndness end =3D stmt->Ist.Store.end;
+
+ if (tya !=3D Ity_I64 || end !=3D Iend_LE)=20
+ goto stmt_fail;
+
+ am =3D iselIntExpr_AMode(env, stmt->Ist.Store.addr);
if (tyd =3D=3D Ity_I64) {
- AMD64RI* ri =3D iselIntExpr_RI(env, stmt->Ist.STle.data);
+ AMD64RI* ri =3D iselIntExpr_RI(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_Alu64M(Aalu_MOV,ri,am));
return;
}
if (tyd =3D=3D Ity_I8 || tyd =3D=3D Ity_I16 || tyd =3D=3D Ity_I32)=
{
- HReg r =3D iselIntExpr_R(env, stmt->Ist.STle.data);
+ HReg r =3D iselIntExpr_R(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_Store(
toUChar(tyd=3D=3DIty_I8 ? 1 : (tyd=3D=3DIty_I1=
6 ? 2 : 4)),
r,am));
return;
}
if (tyd =3D=3D Ity_F64) {
- HReg r =3D iselDblExpr(env, stmt->Ist.STle.data);
+ HReg r =3D iselDblExpr(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_SseLdSt(False/*store*/, 8, r, am));
return;
}
if (tyd =3D=3D Ity_F32) {
- HReg r =3D iselFltExpr(env, stmt->Ist.STle.data);
+ HReg r =3D iselFltExpr(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_SseLdSt(False/*store*/, 4, r, am));
return;
}
//.. if (tyd =3D=3D Ity_I64) {
//.. HReg vHi, vLo, rA;
-//.. iselInt64Expr(&vHi, &vLo, env, stmt->Ist.STle.data);
-//.. rA =3D iselIntExpr_R(env, stmt->Ist.STle.addr);
+//.. iselInt64Expr(&vHi, &vLo, env, stmt->Ist.Store.data);
+//.. rA =3D iselIntExpr_R(env, stmt->Ist.Store.addr);
//.. addInstr(env, X86Instr_Alu32M(
//.. Xalu_MOV, X86RI_Reg(vLo), X86AMode_IR(0, =
rA)));
//.. addInstr(env, X86Instr_Alu32M(
@@ -3527,7 +3535,7 @@
//.. return;
//.. }
if (tyd =3D=3D Ity_V128) {
- HReg r =3D iselVecExpr(env, stmt->Ist.STle.data);
+ HReg r =3D iselVecExpr(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_SseLdSt(False/*store*/, 16, r, am));
return;
}
@@ -3720,6 +3728,7 @@
=20
default: break;
}
+ stmt_fail:
ppIRStmt(stmt);
vpanic("iselStmt(amd64)");
}
Modified: trunk/priv/host-arm/isel.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/host-arm/isel.c 2005-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/host-arm/isel.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -738,25 +738,29 @@
=20
/* --------- STORE --------- */
/* little-endian write to memory */
- case Ist_STle: {
+ case Ist_Store: {
HReg reg;
- IRType tya =3D typeOfIRExpr(env->type_env, stmt->Ist.STle.addr);
- IRType tyd =3D typeOfIRExpr(env->type_env, stmt->Ist.STle.data);
- vassert(tya =3D=3D Ity_I32);
- reg =3D iselIntExpr_R(env, stmt->Ist.STle.data);
+ IRType tya =3D typeOfIRExpr(env->type_env, stmt->Ist.Store.addr);
+ IRType tyd =3D typeOfIRExpr(env->type_env, stmt->Ist.Store.data);
+ IREndness end =3D stmt->Ist.Store.end;
=20
+ if (tya !=3D Ity_I32 || end !=3D Iend_LE)=20
+ goto stmt_fail;
+
+ reg =3D iselIntExpr_R(env, stmt->Ist.Store.data);
+
if (tyd =3D=3D Ity_I8) {
- ARMAMode2* am2 =3D iselIntExpr_AMode2(env, stmt->Ist.STle.addr);
+ ARMAMode2* am2 =3D iselIntExpr_AMode2(env, stmt->Ist.Store.addr);
addInstr(env, ARMInstr_StoreB(reg,am2));
return;
}
if (tyd =3D=3D Ity_I16) {
- ARMAMode3* am3 =3D iselIntExpr_AMode3(env, stmt->Ist.STle.addr);
+ ARMAMode3* am3 =3D iselIntExpr_AMode3(env, stmt->Ist.Store.addr);
addInstr(env, ARMInstr_StoreH(reg,am3));
return;
}
if (tyd =3D=3D Ity_I32) {
- ARMAMode2* am2 =3D iselIntExpr_AMode2(env, stmt->Ist.STle.addr);
+ ARMAMode2* am2 =3D iselIntExpr_AMode2(env, stmt->Ist.Store.addr);
addInstr(env, ARMInstr_StoreW(reg,am2));
return;
} =20
@@ -880,6 +884,7 @@
=20
default: break;
}
+ stmt_fail:
ppIRStmt(stmt);
vpanic("iselStmt");
}
Modified: trunk/priv/host-ppc32/isel.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/host-ppc32/isel.c 2005-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/host-ppc32/isel.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -909,11 +909,14 @@
return lookupIRTemp(env, e->Iex.Tmp.tmp);
=20
/* --------- LOAD --------- */
- case Iex_LDle: {
- HReg r_dst =3D newVRegI(env);
- PPC32AMode* am_addr =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ case Iex_Load: {
+ HReg r_dst =3D newVRegI(env);
+ PPC32AMode* am_addr =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
+ if (e->Iex.Load.end !=3D Iend_BE)
+ goto irreducible;
if (ty =3D=3D Ity_I8 || ty =3D=3D Ity_I16 || ty =3D=3D Ity_I32) {
- addInstr(env, PPC32Instr_Load( sizeofIRType(ty), False, r_dst, =
am_addr ));
+ addInstr(env, PPC32Instr_Load(=20
+ sizeofIRType(ty), False, r_dst, am_addr ));
return r_dst;
}
break;
@@ -1216,12 +1219,13 @@
return r_dst;
}
=20
- /* 16Uto32(LDle(expr32)) */
+ /* 16Uto32(LDbe:I16(expr32)) */
{
- DECLARE_PATTERN(p_LDle16_then_16Uto32);
- DEFINE_PATTERN(p_LDle16_then_16Uto32,
- unop(Iop_16Uto32,IRExpr_LDle(Ity_I16,bind(0))) );
- if (matchIRExpr(&mi,p_LDle16_then_16Uto32,e)) {
+ DECLARE_PATTERN(p_LDbe16_then_16Uto32);
+ DEFINE_PATTERN(p_LDbe16_then_16Uto32,
+ unop(Iop_16Uto32,
+ IRExpr_Load(Iend_BE,Ity_I16,bind(0))) );
+ if (matchIRExpr(&mi,p_LDbe16_then_16Uto32,e)) {
HReg r_dst =3D newVRegI(env);
PPC32AMode* amode =3D iselIntExpr_AMode ( env, mi.bindee[0] =
);
addInstr(env, PPC32Instr_Load(2,False,r_dst,amode));
@@ -2489,11 +2493,11 @@
return lookupIRTemp(env, e->Iex.Tmp.tmp);
}
=20
- if (e->tag =3D=3D Iex_LDle) {
+ if (e->tag =3D=3D Iex_Load && e->Iex.Load.end =3D=3D Iend_BE) {
PPC32AMode* am_addr;
HReg r_dst =3D newVRegF(env);
- vassert(e->Iex.LDle.ty =3D=3D Ity_F32);
- am_addr =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty =3D=3D Ity_F32);
+ am_addr =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, PPC32Instr_FpLdSt(True/*load*/, 4, r_dst, am_addr));
return r_dst;
}
@@ -2612,11 +2616,11 @@
return mk_LoadRRtoFPR( env, r_srcHi, r_srcLo );
}
=20
- if (e->tag =3D=3D Iex_LDle) {
+ if (e->tag =3D=3D Iex_Load && e->Iex.Load.end =3D=3D Iend_BE) {
HReg r_dst =3D newVRegF(env);
PPC32AMode* am_addr;
- vassert(e->Iex.LDle.ty =3D=3D Ity_F64);
- am_addr =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty =3D=3D Ity_F64);
+ am_addr =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, PPC32Instr_FpLdSt(True/*load*/, 8, r_dst, am_addr));
return r_dst;
}
@@ -2795,7 +2799,7 @@
static HReg iselVecExpr_wrk ( ISelEnv* env, IRExpr* e )
{
//.. Bool arg1isEReg =3D False;
- PPC32AvOp op =3D Pav_INVALID;
+ // unused: PPC32AvOp op =3D Pav_INVALID;
IRType ty =3D typeOfIRExpr(env->type_env,e);
vassert(e);
vassert(ty =3D=3D Ity_V128);
@@ -3251,7 +3255,7 @@
//.. return dst;
//.. }
=20
- vec_fail:
+ // unused: vec_fail:
vex_printf("iselVecExpr(ppc32) (subarch =3D %s): can't reduce\n",
LibVEX_ppVexSubArch(env->subarch));
ppIRExpr(e);
@@ -3274,32 +3278,35 @@
switch (stmt->tag) {
=20
/* --------- STORE --------- */
- case Ist_STle: {
+ case Ist_Store: {
PPC32AMode* am_addr;
- IRType tya =3D typeOfIRExpr(env->type_env, stmt->Ist.STle.addr);
- IRType tyd =3D typeOfIRExpr(env->type_env, stmt->Ist.STle.data);
- vassert(tya =3D=3D Ity_I32);
+ IRType tya =3D typeOfIRExpr(env->type_env, stmt->Ist.Store.addr=
);
+ IRType tyd =3D typeOfIRExpr(env->type_env, stmt->Ist.Store.data=
);
+ IREndness end =3D stmt->Ist.Store.end;
=20
- am_addr =3D iselIntExpr_AMode(env, stmt->Ist.STle.addr);
+ if (tya !=3D Ity_I32 || end !=3D Iend_BE)=20
+ goto stmt_fail;
+
+ am_addr =3D iselIntExpr_AMode(env, stmt->Ist.Store.addr);
if (tyd =3D=3D Ity_I8 || tyd =3D=3D Ity_I16 || tyd =3D=3D Ity_I32)=
{
- HReg r_src =3D iselIntExpr_R(env, stmt->Ist.STle.data);
+ HReg r_src =3D iselIntExpr_R(env, stmt->Ist.Store.data);
addInstr(env, PPC32Instr_Store(sizeofIRType(tyd), am_addr, r_sr=
c));
return;
}
if (tyd =3D=3D Ity_F64) {
- HReg fr_src =3D iselDblExpr(env, stmt->Ist.STle.data);
+ HReg fr_src =3D iselDblExpr(env, stmt->Ist.Store.data);
addInstr(env, PPC32Instr_FpLdSt(False/*store*/, 8, fr_src, am_a=
ddr));
return;
}
if (tyd =3D=3D Ity_F32) {
- HReg fr_src =3D iselFltExpr(env, stmt->Ist.STle.data);
+ HReg fr_src =3D iselFltExpr(env, stmt->Ist.Store.data);
addInstr(env, PPC32Instr_FpLdSt(False/*store*/, 4, fr_src, am_a=
ddr));
return;
}
//.. if (tyd =3D=3D Ity_I64) {
//.. HReg vHi, vLo, rA;
-//.. iselInt64Expr(&vHi, &vLo, env, stmt->Ist.STle.data);
-//.. rA =3D iselIntExpr_R(env, stmt->Ist.STle.addr);
+//.. iselInt64Expr(&vHi, &vLo, env, stmt->Ist.Store.data);
+//.. rA =3D iselIntExpr_R(env, stmt->Ist.Store.addr);
//.. addInstr(env, X86Instr_Alu32M(
//.. Xalu_MOV, X86RI_Reg(vLo), X86AMode_IR(0, =
rA)));
//.. addInstr(env, X86Instr_Alu32M(
@@ -3307,7 +3314,7 @@
//.. return;
//.. }
if (tyd =3D=3D Ity_V128) {
- HReg v_src =3D iselVecExpr(env, stmt->Ist.STle.data);
+ HReg v_src =3D iselVecExpr(env, stmt->Ist.Store.data);
addInstr(env, PPC32Instr_AvLdSt(False/*store*/, 16, v_src, am_a=
ddr));
return;
}
@@ -3496,6 +3503,7 @@
=20
default: break;
}
+ stmt_fail:
ppIRStmt(stmt);
vpanic("iselStmt(ppc32)");
}
Modified: trunk/priv/host-x86/isel.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/host-x86/isel.c 2005-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/host-x86/isel.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -726,9 +726,13 @@
}
=20
/* --------- LOAD --------- */
- case Iex_LDle: {
+ case Iex_Load: {
HReg dst =3D newVRegI(env);
- X86AMode* amode =3D iselIntExpr_AMode ( env, e->Iex.LDle.addr );
+ X86AMode* amode =3D iselIntExpr_AMode ( env, e->Iex.Load.addr );
+
+ if (e->Iex.Load.end !=3D Iend_LE)
+ goto irreducible;
+
if (ty =3D=3D Ity_I32) {
addInstr(env, X86Instr_Alu32R(Xalu_MOV,
X86RMI_Mem(amode), dst) );
@@ -1000,7 +1004,8 @@
{
DECLARE_PATTERN(p_LDle16_then_16Uto32);
DEFINE_PATTERN(p_LDle16_then_16Uto32,
- unop(Iop_16Uto32,IRExpr_LDle(Ity_I16,bind(0))) );
+ unop(Iop_16Uto32,
+ IRExpr_Load(Iend_LE,Ity_I16,bind(0))) );
if (matchIRExpr(&mi,p_LDle16_then_16Uto32,e)) {
HReg dst =3D newVRegI(env);
X86AMode* amode =3D iselIntExpr_AMode ( env, mi.bindee[0] );
@@ -1351,8 +1356,8 @@
}
=20
/* special case: 32-bit load from memory */
- if (e->tag =3D=3D Iex_LDle && ty =3D=3D Ity_I32) {
- X86AMode* am =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ if (e->tag =3D=3D Iex_Load && ty =3D=3D Ity_I32 && e->Iex.Load.end =3D=
=3D Iend_LE) {
+ X86AMode* am =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
return X86RMI_Mem(am);
}
=20
@@ -1782,13 +1787,13 @@
}
=20
/* 64-bit load */
- if (e->tag =3D=3D Iex_LDle) {
+ if (e->tag =3D=3D Iex_Load && e->Iex.Load.end =3D=3D Iend_LE) {
HReg tLo, tHi;
X86AMode *am0, *am4;
- vassert(e->Iex.LDle.ty =3D=3D Ity_I64);
+ vassert(e->Iex.Load.ty =3D=3D Ity_I64);
tLo =3D newVRegI(env);
tHi =3D newVRegI(env);
- am0 =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ am0 =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
am4 =3D advance4(am0);
addInstr(env, X86Instr_Alu32R( Xalu_MOV, X86RMI_Mem(am0), tLo ));
addInstr(env, X86Instr_Alu32R( Xalu_MOV, X86RMI_Mem(am4), tHi ));
@@ -2433,11 +2438,11 @@
return lookupIRTemp(env, e->Iex.Tmp.tmp);
}
=20
- if (e->tag =3D=3D Iex_LDle) {
+ if (e->tag =3D=3D Iex_Load && e->Iex.Load.end =3D=3D Iend_LE) {
X86AMode* am;
HReg res =3D newVRegF(env);
- vassert(e->Iex.LDle.ty =3D=3D Ity_F32);
- am =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty =3D=3D Ity_F32);
+ am =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, X86Instr_FpLdSt(True/*load*/, 4, res, am));
return res;
}
@@ -2557,11 +2562,11 @@
return freg;
}
=20
- if (e->tag =3D=3D Iex_LDle) {
+ if (e->tag =3D=3D Iex_Load && e->Iex.Load.end =3D=3D Iend_LE) {
X86AMode* am;
HReg res =3D newVRegF(env);
- vassert(e->Iex.LDle.ty =3D=3D Ity_F64);
- am =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty =3D=3D Ity_F64);
+ am =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, X86Instr_FpLdSt(True/*load*/, 8, res, am));
return res;
}
@@ -2792,9 +2797,9 @@
return dst;
}
=20
- if (e->tag =3D=3D Iex_LDle) {
+ if (e->tag =3D=3D Iex_Load && e->Iex.Load.end =3D=3D Iend_LE) {
HReg dst =3D newVRegV(env);
- X86AMode* am =3D iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ X86AMode* am =3D iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, X86Instr_SseLdSt( True/*load*/, dst, am ));
return dst;
}
@@ -2812,7 +2817,8 @@
/* 64UtoV128(LDle:I64(addr)) */
DECLARE_PATTERN(p_zwiden_load64);
DEFINE_PATTERN(p_zwiden_load64,
- unop(Iop_64UtoV128, IRExpr_LDle(Ity_I64,bind(0))));
+ unop(Iop_64UtoV128,=20
+ IRExpr_Load(Iend_LE,Ity_I64,bind(0))));
if (matchIRExpr(&mi, p_zwiden_load64, e)) {
X86AMode* am =3D iselIntExpr_AMode(env, mi.bindee[0]);
HReg dst =3D newVRegV(env);
@@ -3272,37 +3278,41 @@
switch (stmt->tag) {
=20
/* --------- STORE --------- */
- case Ist_STle: {
+ case Ist_Store: {
X86AMode* am;
- IRType tya =3D typeOfIRExpr(env->type_env, stmt->Ist.STle.addr);
- IRType tyd =3D typeOfIRExpr(env->type_env, stmt->Ist.STle.data);
- vassert(tya =3D=3D Ity_I32);
- am =3D iselIntExpr_AMode(env, stmt->Ist.STle.addr);
+ IRType tya =3D typeOfIRExpr(env->type_env, stmt->Ist.Store.addr=
);
+ IRType tyd =3D typeOfIRExpr(env->type_env, stmt->Ist.Store.data=
);
+ IREndness end =3D stmt->Ist.Store.end;
+
+ if (tya !=3D Ity_I32 || end !=3D Iend_LE)=20
+ goto stmt_fail;
+
+ am =3D iselIntExpr_AMode(env, stmt->Ist.Store.addr);
if (tyd =3D=3D Ity_I32) {
- X86RI* ri =3D iselIntExpr_RI(env, stmt->Ist.STle.data);
+ X86RI* ri =3D iselIntExpr_RI(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_Alu32M(Xalu_MOV,ri,am));
return;
}
if (tyd =3D=3D Ity_I8 || tyd =3D=3D Ity_I16) {
- HReg r =3D iselIntExpr_R(env, stmt->Ist.STle.data);
+ HReg r =3D iselIntExpr_R(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_Store( toUChar(tyd=3D=3DIty_I8 ? 1 : 2),
r,am ));
return;
}
if (tyd =3D=3D Ity_F64) {
- HReg r =3D iselDblExpr(env, stmt->Ist.STle.data);
+ HReg r =3D iselDblExpr(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_FpLdSt(False/*store*/, 8, r, am));
return;
}
if (tyd =3D=3D Ity_F32) {
- HReg r =3D iselFltExpr(env, stmt->Ist.STle.data);
+ HReg r =3D iselFltExpr(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_FpLdSt(False/*store*/, 4, r, am));
return;
}
if (tyd =3D=3D Ity_I64) {
HReg vHi, vLo, rA;
- iselInt64Expr(&vHi, &vLo, env, stmt->Ist.STle.data);
- rA =3D iselIntExpr_R(env, stmt->Ist.STle.addr);
+ iselInt64Expr(&vHi, &vLo, env, stmt->Ist.Store.data);
+ rA =3D iselIntExpr_R(env, stmt->Ist.Store.addr);
addInstr(env, X86Instr_Alu32M(
Xalu_MOV, X86RI_Reg(vLo), X86AMode_IR(0, rA)))=
;
addInstr(env, X86Instr_Alu32M(
@@ -3310,7 +3320,7 @@
return;
}
if (tyd =3D=3D Ity_V128) {
- HReg r =3D iselVecExpr(env, stmt->Ist.STle.data);
+ HReg r =3D iselVecExpr(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_SseLdSt(False/*store*/, r, am));
return;
}
@@ -3520,6 +3530,7 @@
=20
default: break;
}
+ stmt_fail:
ppIRStmt(stmt);
vpanic("iselStmt");
}
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-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/ir/irdefs.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -501,11 +501,11 @@
ppIRExpr(e->Iex.Unop.arg);
vex_printf( ")" );
break;
- case Iex_LDle:
- vex_printf( "LDle:" );
- ppIRType(e->Iex.LDle.ty);
+ case Iex_Load:
+ vex_printf( "LD%s:", e->Iex.Load.end=3D=3DIend_LE ? "le" : "be" );
+ ppIRType(e->Iex.Load.ty);
vex_printf( "(" );
- ppIRExpr(e->Iex.LDle.addr);
+ ppIRExpr(e->Iex.Load.addr);
vex_printf( ")" );
break;
case Iex_Const:
@@ -635,11 +635,11 @@
vex_printf( " =3D " );
ppIRExpr(s->Ist.Tmp.data);
break;
- case Ist_STle:
- vex_printf( "STle(");
- ppIRExpr(s->Ist.STle.addr);
+ case Ist_Store:
+ vex_printf( "ST%s(", s->Ist.Store.end=3D=3DIend_LE ? "le" : "be=
" );
+ ppIRExpr(s->Ist.Store.addr);
vex_printf( ") =3D ");
- ppIRExpr(s->Ist.STle.data);
+ ppIRExpr(s->Ist.Store.data);
break;
case Ist_Dirty:
ppIRDirty(s->Ist.Dirty.details);
@@ -837,11 +837,13 @@
e->Iex.Unop.arg =3D arg;
return e;
}
-IRExpr* IRExpr_LDle ( IRType ty, IRExpr* addr ) {
+IRExpr* IRExpr_Load ( IREndness end, IRType ty, IRExpr* addr ) {
IRExpr* e =3D LibVEX_Alloc(sizeof(IRExpr));
- e->tag =3D Iex_LDle;
- e->Iex.LDle.ty =3D ty;
- e->Iex.LDle.addr =3D addr;
+ e->tag =3D Iex_Load;
+ e->Iex.Load.end =3D end;
+ e->Iex.Load.ty =3D ty;
+ e->Iex.Load.addr =3D addr;
+ vassert(end =3D=3D Iend_LE || end =3D=3D Iend_BE);
return e;
}
IRExpr* IRExpr_Const ( IRConst* con ) {
@@ -984,11 +986,13 @@
s->Ist.Tmp.data =3D data;
return s;
}
-IRStmt* IRStmt_STle ( IRExpr* addr, IRExpr* data ) {
- IRStmt* s =3D LibVEX_Alloc(sizeof(IRStmt));
- s->tag =3D Ist_STle;
- s->Ist.STle.addr =3D addr;
- s->Ist.STle.data =3D data;
+IRStmt* IRStmt_Store ( IREndness end, IRExpr* addr, IRExpr* data ) {
+ IRStmt* s =3D LibVEX_Alloc(sizeof(IRStmt));
+ s->tag =3D Ist_Store;
+ s->Ist.Store.end =3D end;
+ s->Ist.Store.addr =3D addr;
+ s->Ist.Store.data =3D data;
+ vassert(end =3D=3D Iend_LE || end =3D=3D Iend_BE);
return s;
}
IRStmt* IRStmt_Dirty ( IRDirty* d )
@@ -1123,9 +1127,10 @@
case Iex_Unop:=20
return IRExpr_Unop(e->Iex.Unop.op,
dopyIRExpr(e->Iex.Unop.arg));
- case Iex_LDle:=20
- return IRExpr_LDle(e->Iex.LDle.ty,
- dopyIRExpr(e->Iex.LDle.addr));
+ case Iex_Load:=20
+ return IRExpr_Load(e->Iex.Load.end,
+ e->Iex.Load.ty,
+ dopyIRExpr(e->Iex.Load.addr));
case Iex_Const:=20
return IRExpr_Const(dopyIRConst(e->Iex.Const.con));
case Iex_CCall:
@@ -1181,9 +1186,10 @@
case Ist_Tmp:
return IRStmt_Tmp(s->Ist.Tmp.tmp,
dopyIRExpr(s->Ist.Tmp.data));
- case Ist_STle:=20
- return IRStmt_STle(dopyIRExpr(s->Ist.STle.addr),
- dopyIRExpr(s->Ist.STle.data));
+ case Ist_Store:=20
+ return IRStmt_Store(s->Ist.Store.end,
+ dopyIRExpr(s->Ist.Store.addr),
+ dopyIRExpr(s->Ist.Store.data));
case Ist_Dirty:=20
return IRStmt_Dirty(dopyIRDirty(s->Ist.Dirty.details));
case Ist_MFence:
@@ -1596,8 +1602,8 @@
IRType t_dst, t_arg1, t_arg2;
start:
switch (e->tag) {
- case Iex_LDle:
- return e->Iex.LDle.ty;
+ case Iex_Load:
+ return e->Iex.Load.ty;
case Iex_Get:
return e->Iex.Get.ty;
case Iex_GetI:
@@ -1684,7 +1690,7 @@
isIRAtom(e->Iex.Binop.arg1)=20
&& isIRAtom(e->Iex.Binop.arg2));
case Iex_Unop: return isIRAtom(e->Iex.Unop.arg);
- case Iex_LDle: return isIRAtom(e->Iex.LDle.addr);
+ case Iex_Load: return isIRAtom(e->Iex.Load.addr);
case Iex_Const: return True;
case Iex_CCall: for (i =3D 0; e->Iex.CCall.args[i]; i++)
if (!isIRAtom(e->Iex.CCall.args[i]))=20
@@ -1698,9 +1704,9 @@
}
/*notreached*/
vassert(0);
- case Ist_STle:
- return toBool( isIRAtom(st->Ist.STle.addr)=20
- && isIRAtom(st->Ist.STle.data) );
+ case Ist_Store:
+ return toBool( isIRAtom(st->Ist.Store.addr)=20
+ && isIRAtom(st->Ist.Store.data) );
case Ist_Dirty:
di =3D st->Ist.Dirty.details;
if (!isIRAtom(di->guard))=20
@@ -1825,8 +1831,8 @@
case Iex_Unop:
useBeforeDef_Expr(bb,stmt,expr->Iex.Unop.arg,def_counts);
break;
- case Iex_LDle:
- useBeforeDef_Expr(bb,stmt,expr->Iex.LDle.addr,def_counts);
+ case Iex_Load:
+ useBeforeDef_Expr(bb,stmt,expr->Iex.Load.addr,def_counts);
break;
case Iex_Const:
break;
@@ -1865,9 +1871,9 @@
case Ist_Tmp:
useBeforeDef_Expr(bb,stmt,stmt->Ist.Tmp.data,def_counts);
break;
- case Ist_STle:
- useBeforeDef_Expr(bb,stmt,stmt->Ist.STle.addr,def_counts);
- useBeforeDef_Expr(bb,stmt,stmt->Ist.STle.data,def_counts);
+ case Ist_Store:
+ useBeforeDef_Expr(bb,stmt,stmt->Ist.Store.addr,def_counts);
+ useBeforeDef_Expr(bb,stmt,stmt->Ist.Store.data,def_counts);
break;
case Ist_Dirty:
d =3D stmt->Ist.Dirty.details;
@@ -1948,10 +1954,12 @@
if (t_arg1 !=3D typeOfIRExpr(tyenv, expr->Iex.Unop.arg))
sanityCheckFail(bb,stmt,"Iex.Unop: arg ty doesn't match op t=
y");
break;
- case Iex_LDle:
- tcExpr(bb,stmt, expr->Iex.LDle.addr, gWordTy);
- if (typeOfIRExpr(tyenv, expr->Iex.LDle.addr) !=3D gWordTy)
- sanityCheckFail(bb,stmt,"Iex.LDle.addr: not :: guest word ty=
pe");
+ case Iex_Load:
+ tcExpr(bb,stmt, expr->Iex.Load.addr, gWordTy);
+ if (typeOfIRExpr(tyenv, expr->Iex.Load.addr) !=3D gWordTy)
+ sanityCheckFail(bb,stmt,"Iex.Load.addr: not :: guest word ty=
pe");
+ if (expr->Iex.Load.end !=3D Iend_LE && expr->Iex.Load.end !=3D =
Iend_BE)
+ sanityCheckFail(bb,stmt,"Iex.Load.end: bogus endianness");
break;
case Iex_CCall:
if (!saneIRCallee(expr->Iex.CCall.cee))
@@ -2031,13 +2039,15 @@
!=3D typeOfIRExpr(tyenv, stmt->Ist.Tmp.data))
sanityCheckFail(bb,stmt,"IRStmt.Put.Tmp: tmp and expr do not=
match");
break;
- case Ist_STle:
- tcExpr( bb, stmt, stmt->Ist.STle.addr, gWordTy );
- tcExpr( bb, stmt, stmt->Ist.STle.data, gWordTy );
- if (typeOfIRExpr(tyenv, stmt->Ist.STle.addr) !=3D gWordTy)
- sanityCheckFail(bb,stmt,"IRStmt.STle.addr: not :: guest word=
type");
- if (typeOfIRExpr(tyenv, stmt->Ist.STle.data) =3D=3D Ity_I1)
- sanityCheckFail(bb,stmt,"IRStmt.STle.data: cannot STle :: It=
y_I1");
+ case Ist_Store:
+ tcExpr( bb, stmt, stmt->Ist.Store.addr, gWordTy );
+ tcExpr( bb, stmt, stmt->Ist.Store.data, gWordTy );
+ if (typeOfIRExpr(tyenv, stmt->Ist.Store.addr) !=3D gWordTy)
+ sanityCheckFail(bb,stmt,"IRStmt.Store.addr: not :: guest wor=
d type");
+ if (typeOfIRExpr(tyenv, stmt->Ist.Store.data) =3D=3D Ity_I1)
+ sanityCheckFail(bb,stmt,"IRStmt.Store.data: cannot Store :: =
Ity_I1");
+ if (stmt->Ist.Store.end !=3D Iend_LE && stmt->Ist.Store.end !=3D=
Iend_BE)
+ sanityCheckFail(bb,stmt,"Ist.Store.end: bogus endianness");
break;
case Ist_Dirty:
/* Mostly check for various kinds of ill-formed dirty calls. */
Modified: trunk/priv/ir/irmatch.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/irmatch.c 2005-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/ir/irmatch.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -86,10 +86,11 @@
if (!matchWrk(mi, p->Iex.Binop.arg2, e->Iex.Binop.arg2))
return False;
return True;
- case Iex_LDle:
- if (e->tag !=3D Iex_LDle) return False;
- if (p->Iex.LDle.ty !=3D e->Iex.LDle.ty) return False;
- if (!matchWrk(mi, p->Iex.LDle.addr, e->Iex.LDle.addr))
+ case Iex_Load:
+ if (e->tag !=3D Iex_Load) return False;
+ if (p->Iex.Load.end !=3D e->Iex.Load.end) return False;
+ if (p->Iex.Load.ty !=3D e->Iex.Load.ty) return False;
+ if (!matchWrk(mi, p->Iex.Load.addr, e->Iex.Load.addr))
return False;
return True;
case Iex_Const:
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-06-30 13:38:38 UTC (rev 1238)
+++ trunk/priv/ir/iropt.c 2005-06-30 23:31:27 UTC (rev 1239)
@@ -253,8 +253,8 @@
if (e->tag =3D=3D Iex_Binop)
return toBool( isIRAtom(e->Iex.Binop.arg1)=20
&& isIRAtom(e->Iex.Binop.arg2) );
- if (e->tag =3D=3D Iex_LDle)
- return isIRAtom(e->Iex.LDle.addr);
+ if (e->tag =3D=3D Iex_Load)
+ return isIRAtom(e->Iex.Load.addr);
return False;
}
=20
@@ -300,11 +300,12 @@
flatten_Expr(bb, ex->Iex.Unop.arg))));
return IRExpr_Tmp(t1);
=20
- case Iex_LDle:
+ case Iex_Load:
t1 =3D newIRTemp(bb->tyenv, ty);
addStmtToIRBB(bb, IRStmt_Tmp(t1,
- IRExpr_LDle(ex->Iex.LDle.ty,=20
- flatten_Expr(bb, ex->Iex.LDle.addr))));
+ IRExpr_Load(ex->Iex.Load.end,
+ ex->Iex.Load.ty,=20
+ flatten_Expr(bb, ex->Iex.Load.addr))));
return IRExpr_Tmp(t1);
=20
case Iex_CCall:
@@ -389,10 +390,10 @@
addStmtToIRBB(bb, IRStmt_Tmp(st->Ist.Tmp.tmp, e1));
}
break;
- case Ist_STle:
- e1 =3D flatten_Expr(bb, st->Ist.STle.addr);
- e2 =3D flatten_Expr(bb, st->Ist.STle.data);
- addStmtToIRBB(bb, IRStmt_STle(e1,e2));
+ case Ist_Store:
+ e1 =3D flatten_Expr(bb, st->Ist.Store.addr);
+ e2 =3D flatten_Expr(bb, st->Ist.Store.data);
+ addStmtToIRBB(bb, IRStmt_Store(st->Ist.Store.end, e1,e2));
break;
case Ist_Dirty:
d =3D st->Ist.Dirty.details;
@@ -652,7 +653,7 @@
isGet =3D True;
key =3D mk_key_GetIPutI ( e->Iex.GetI.descr );
break;
- case Iex_LDle:
+ case Iex_Load:
isGet =3D False;
memRW =3D True;
break;
@@ -686,9 +687,9 @@
break;
=20
/* all other cases are boring. */
- case Ist_STle:
- vassert(isIRAtom(st->Ist.STle.addr));
- vassert(isIRAtom(st->Ist.STle.data));
+ case Ist_Store:
+ vassert(isIRAtom(st->Ist.Store.addr));
+ vassert(isIRAtom(st->Ist.Store.data));
memRW =3D True;
break;
=20
@@ -1469,11 +1470,12 @@
subst_Expr(env, ex->Iex.Unop.arg)
);
=20
- case Iex_LDle:
- vassert(isIRAtom(ex->Iex.LDle.addr));
- return IRExpr_LDle(
- ex->Iex.LDle.ty,
- subst_Expr(env, ex->Iex.LDle.addr)
+ case Iex_Load:
+ vassert(isIRAtom(ex->Iex.Load.addr));
+ return IRExpr_Load(
+ ex->Iex.Load.end,
+ ex->Iex.Load.ty,
+ subst_Expr(env, ex->Iex.Load.addr)
);
=20
case Iex_CCall: {
@@ -1552,12 +1554,13 @@
fold_Expr(subst_Expr(env, st->Ist.Tmp.data))
);
=20
- case Ist_STle:
- vassert(isIRAtom(st->Ist.STle.addr));
- vassert(isIRAtom(st->Ist.STle.data));
- return IRStmt_STle(
- fold_Expr(subst_Expr(env, st->Ist.STle.addr)),
- fold_Expr(subst_Expr(env, st->Ist.STle.data))
+ case Ist_Store:
+ vassert(isIRAtom(st->Ist.Store.addr));
+ vassert(isIRAtom(st->Ist.Store.data));
+ return IRStmt_Store(
+ st->Ist.Store.end,
+ fold_Expr(subst_Expr(env, st->Ist.Store.addr)),
+ fold_Expr(subst_Expr(env, st->Ist.Store.data))
);
=20
case Ist_Dirty: {
@@ -1724,8 +1727,8 @@
for (i =3D 0; e->Iex.CCall.args[i]; i++)
addUses_Expr(set, e->Iex.CCall.args[i]);
return;
- case Iex_LDle:
- addUses_Expr(set, e->Iex.LDle.addr);
+ case Iex_Load:
+ addUses_Expr(set, e->Iex.Load.addr);
return;
case Iex_Binop:
addUses_Expr(set, e->Iex.Binop.arg1);
@@ -1765,9 +1768,9 @@
case Ist_Put:
addUses_Expr(set, st->Ist.Put.data);
return;
- case Ist_STle:
- addUses_Expr(set, st->Ist.STle.addr);
- addUses_Expr(set, st->Ist.STle.data);
+ case Ist_Store:
+ addUses_Expr(set, st->Ist.Store.addr);
+ addUses_Expr(set, st->Ist.Store.data);
return;
case Ist_Dirty:
d =3D st->Ist.Dirty.details;
@@ -2650,9 +2653,9 @@
}
return False;
=20
- case Ist_STle:
- vassert(isIRAtom(s2->Ist.STle.addr));
- vassert(isIRAtom(s2->Ist.STle.data));
+ case Ist_Store:
+ vassert(isIRAtom(s2->Ist.Store.addr));
+ vassert(isIRAtom(s2->Ist.Store.data));
return False;
=20
default:
@@ -2799,8 +2802,8 @@
case Iex_Unop:
deltaIRExpr(e->Iex.Unop.arg, delta);
break;
- case Iex_LDle:
- deltaIRExpr(e->Iex.LDle.addr, delta);
+ case Iex_Load:
+ deltaIRExpr(e->Iex.Load.addr, delta);
break;
case Iex_CCall:
for (i =3D 0; e->Iex.CCall.args[i]; i++)
@@ -2846,9 +2849,9 @@
case Ist_Exit:
deltaIRExpr(st->Ist.Exit.guard, delta);
break;
- case Ist_STle:
- deltaIRExpr(st->Ist.STle.addr, delta);
- deltaIRExpr(st->Ist.STle.data, delta);
+ case Ist_Store:
+ deltaIRExpr(st->Ist.Store.addr, delta);
+ deltaIRExpr(st->Ist.Store.data, delta);
break;
case Ist_Dirty:
d =3D st->Ist.Dirty.details;
@@ -3161,8 +3164,8 @@
occCount_Expr(env, e->Iex.Unop.arg);
return;
=20
- case Iex_LDle:=20
- occCount_Expr(env, e->Iex.LDle.addr);
+ case Iex_Load:
+ occCount_Expr(env, e->Iex.Load.addr);
return;
=20
case Iex_CCall:
@@ -3207,9 +3210,9 @@
occCount_Expr(env, st->Ist.PutI.ix);
occCount_Expr(env, st->Ist.PutI.data);
return;
- case Ist_STle:=20
- occCount_Expr(env, st->Ist.STle.addr);
- occCount_Expr(env, st->Ist.STle.data);
+ case Ist_Store:
+ occCount_Expr(env, st->Ist.Store.addr);
+ occCount_Expr(env, st->Ist.Store.data);
return;
case Ist_Dirty:
d =3D st->Ist.Dirty.details;
@@ -3296,10 +3299,11 @@
e->Iex.Unop.op,
tbSubst_Expr(env, e->Iex.Unop.arg)
);
- case Iex_LDle:
- return IRExpr_LDle(
- e->Iex.LDle.ty,
- tbSubst_Expr(env, e->Iex.LDle.addr)
+ case Iex_Load:
+ return IRExpr_Load(
+ e->Iex.Load.end,
+ e->Iex.Load.ty,
+ tbSubst_Expr(env, e->Iex.Load.addr)
);
case Iex_GetI:
return IRExpr_GetI(
@@ -3329,10 +3333,11 @@
tbSubst_Expr(env, st->Ist.AbiHint.base),
st->Ist.AbiHint.len
);
- case Ist_STle:
- return IRStmt_STle(
- tbSubst_Expr(env, st->Ist.STle.addr),
- tbSubst_Expr(env, st->Ist.STle.data)
+ case Ist_Store:
+ return IRStmt_Store(
+ st->Ist.Store.end,
+ tbSubst_Expr(env, st->Ist.Store.addr),
+ tbSubst_Expr(env, st->Ist.Store.data)
);
case Ist_Tmp:
return IRStmt_Tmp(
@@ -3405,9 +3410,9 @@
case Iex_Unop:
setHints_Expr(doesLoad, doesGet, e->Iex.Unop.arg);
return;
- case Iex_LDle:
+ case Iex_Load:
*doesLoad =3D True;
- setHints_Expr(doesLoad, doesGet, e->Iex.LDle.addr);
+ setHints_Expr(doesLoad, doesGet, e->Iex.Load.addr);
return;
case Iex_Get:
*doesGet =3D True;
@@ -3587,7 +3592,7 @@
|| st->tag =3D=3D Ist_PutI=20
|| st->tag =3D=3D Ist_Dirty);
=20
- invStore =3D toBool(st->tag =3D=3D Ist_STle
+ invStore =3D toBool(st->tag =3D=3D Ist_Store
|| st->tag =3D=3D Ist_Dirty);
=20
for (k =3D 0; k < n_tmps; k++) {
@@ -3741,9 +3746,9 @@
case Ist_Put:
vassert(isIRAtom(st->Ist.Put.data));
break;
- case Ist_STle:
- vassert(isIRAtom(st->Ist.STle.addr));
- vassert(isIRAtom(st->Ist.STle.data));
+ case Ist_Store:
+ vassert(isIRAtom(st->Ist.Store.addr));
+ vassert(isIRAtom(st->Ist.Store.data));
break;
case Ist_Dirty:
d =3D st->Ist.Dirty.details;
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-06-30 13:38:38 UTC (rev 1238)
+++ trunk/pub/libvex_ir.h 2005-06-30 23:31:27 UTC (rev 1239)
@@ -87,6 +87,16 @@
extern Int sizeofIRType ( IRType );
=20
=20
+/* ------------------ Endianness ------------------ */
+
+typedef
+ enum {=20
+ Iend_LE=3D22, /* little endian */
+ Iend_BE=3D33 /* big endian */
+ }
+ IREndness;
+
+
/* ------------------ Constants ------------------ */
=20
typedef
@@ -655,7 +665,7 @@
Iex_Tmp, /* value of temporary */
Iex_Binop, /* binary operation */
Iex_Unop, /* unary operation */
- Iex_LDle, /* little-endian read from memory */=20
+ Iex_Load, /* read from memory */=20
Iex_Const, /* constant-valued expression */
Iex_Mux0X, /* ternary if-then-else operator (STRICT) */
Iex_CCall /* call to pure (side-effect-free) helper fn */
@@ -691,9 +701,10 @@
struct _IRExpr* arg;
} Unop;
struct {
+ IREndness end;
IRType ty;
struct _IRExpr* addr;
- } LDle;
+ } Load;
struct {
IRConst* con;
} Const;
@@ -717,7 +728,7 @@
extern IRExpr* IRExpr_Tmp ( IRTemp tmp );
extern IRExpr* IRExpr_Binop ( IROp op, IRExpr* arg1, IRExpr* arg2 );
extern IRExpr* IRExpr_Unop ( IROp op, IRExpr* arg );
-extern IRExpr* IRExpr_LDle ( IRType ty, IRExpr* addr );
+extern IRExpr* IRExpr_Load ( IREndness end, IRType ty, IRExpr* addr );
extern IRExpr* IRExpr_Const ( IRConst* con );
extern IRExpr* IRExpr_CCall ( IRCallee* cee, IRType retty, IRExpr** arg=
s );
extern IRExpr* IRExpr_Mux0X ( IRExpr* cond, IRExpr* expr0, IRExpr* expr=
X );
@@ -918,7 +929,7 @@
Ist_Put, /* write guest state, fixed offset */
Ist_PutI, /* write guest state, run-time offset */
Ist_Tmp, /* assign value to temporary */
- Ist_STle, /* little-endian write to memory */
+ Ist_Store, /* write to memory */
Ist_Dirty, /* call complex ("dirty") helper function */
Ist_MFence, /* memory fence */
Ist_Exit /* conditional exit from BB */
@@ -955,9 +966,10 @@
IRExpr* data;
} Tmp;
struct {
- IRExpr* addr;
- IRExpr* data;
- } STle;
+ IREndness end;
+ IRExpr* addr;
+ IRExpr* data;
+ } Store;
struct {
IRDirty* details;
} Dirty;
@@ -979,7 +991,7 @@
extern IRStmt* IRStmt_PutI ( IRArray* descr, IRExpr* ix, Int bias,=20
IRExpr* data );
extern IRStmt* IRStmt_Tmp ( IRTemp tmp, IRExpr* data );
-extern IRStmt* IRStmt_STle ( IRExpr* addr, IRExpr* data );
+extern IRStmt* IRStmt_Store ( IREndness end, IRExpr* addr, IRExpr* dat=
a );
extern IRStmt* IRStmt_Dirty ( IRDirty* details );
extern IRStmt* IRStmt_MFence ( void );
extern IRStmt* IRStmt_Exit ( IRExpr* guard, IRJumpKind jk, IRConst* d=
st );
|