static void storeLE ( IRExpr* addr, IRExpr* data )
{
- stmt( IRStmt_STle(addr,data) );
+ stmt( IRStmt_Store(Iend_LE,addr,data) );
}
static IRExpr* loadLE ( IRType ty, IRExpr* data )
{
- return IRExpr_LDle(ty,data);
+ return IRExpr_Load(Iend_LE,ty,data);
}
static IROp mkSizedOp ( IRType ty, IROp op8 )
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;
case 2: /* FST double-real */
static void storeLE ( IRExpr* addr, IRExpr* data )
{
- stmt( IRStmt_STle(addr,data) );
+ stmt( IRStmt_Store(Iend_LE,addr,data) );
}
static IRExpr* unop ( IROp op, IRExpr* a )
static IRExpr* loadLE ( IRType ty, IRExpr* data )
{
- return IRExpr_LDle(ty,data);
+ return IRExpr_Load(Iend_LE,ty,data);
}
#if 0
return IRExpr_Get( vectorGuestRegOffset(archreg), Ity_V128 );
}
+#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) == Ity_V128);
stmt( IRStmt_Put(vectorGuestRegOffset(archreg), e) );
}
-
+#endif
static void assign ( IRTemp dst, IRExpr* e )
{
static void storeBE ( IRExpr* addr, IRExpr* data )
{
- stmt( IRStmt_STle(addr,data) );
+ stmt( IRStmt_Store(Iend_BE,addr,data) );
}
static IRExpr* unop ( IROp op, IRExpr* a )
static IRExpr* loadBE ( IRType ty, IRExpr* data )
{
- return IRExpr_LDle(ty,data);
+ return IRExpr_Load(Iend_BE,ty,data);
}
// ROTL(src32, rot_amt5)
static void storeLE ( IRExpr* addr, IRExpr* data )
{
- stmt( IRStmt_STle(addr,data) );
+ stmt( IRStmt_Store(Iend_LE,addr,data) );
}
static IRExpr* unop ( IROp op, IRExpr* a )
static IRExpr* loadLE ( IRType ty, IRExpr* data )
{
- return IRExpr_LDle(ty,data);
+ return IRExpr_Load(Iend_LE,ty,data);
}
static IROp mkSizedOp ( IRType ty, IROp op8 )
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;
case 2: /* FST double-real */
}
/* --------- LOAD --------- */
- case Iex_LDle: {
+ case Iex_Load: {
HReg dst = newVRegI(env);
- AMD64AMode* amode = iselIntExpr_AMode ( env, e->Iex.LDle.addr );
+ AMD64AMode* amode = iselIntExpr_AMode ( env, e->Iex.Load.addr );
+
+ if (e->Iex.Load.end != Iend_LE)
+ goto irreducible;
+
if (ty == Ity_I64) {
addInstr(env, AMD64Instr_Alu64R(Aalu_MOV,
AMD64RMI_Mem(amode), dst) );
}
/* special case: 64-bit load from memory */
- if (e->tag == Iex_LDle && ty == Ity_I64) {
- AMD64AMode* am = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ if (e->tag == Iex_Load && ty == Ity_I64 && e->Iex.Load.end == Iend_LE) {
+ AMD64AMode* am = iselIntExpr_AMode(env, e->Iex.Load.addr);
return AMD64RMI_Mem(am);
}
return lookupIRTemp(env, e->Iex.Tmp.tmp);
}
- if (e->tag == Iex_LDle) {
+ if (e->tag == Iex_Load && e->Iex.Load.end == Iend_LE) {
AMD64AMode* am;
HReg res = newVRegV(env);
- vassert(e->Iex.LDle.ty == Ity_F32);
- am = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty == Ity_F32);
+ am = iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, AMD64Instr_SseLdSt(True/*load*/, 4, res, am));
return res;
}
return res;
}
- if (e->tag == Iex_LDle) {
+ if (e->tag == Iex_Load && e->Iex.Load.end == Iend_LE) {
AMD64AMode* am;
HReg res = newVRegV(env);
- vassert(e->Iex.LDle.ty == Ity_F64);
- am = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty == Ity_F64);
+ am = iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, AMD64Instr_SseLdSt( True/*load*/, 8, res, am ));
return res;
}
return dst;
}
- if (e->tag == Iex_LDle) {
+ if (e->tag == Iex_Load && e->Iex.Load.end == Iend_LE) {
HReg dst = newVRegV(env);
- AMD64AMode* am = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ AMD64AMode* am = iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, AMD64Instr_SseLdSt( True/*load*/, 16, dst, am ));
return dst;
}
switch (stmt->tag) {
/* --------- STORE --------- */
- case Ist_STle: {
+ case Ist_Store: {
AMD64AMode* am;
- IRType tya = typeOfIRExpr(env->type_env, stmt->Ist.STle.addr);
- IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.STle.data);
- vassert(tya == Ity_I64);
- am = iselIntExpr_AMode(env, stmt->Ist.STle.addr);
+ IRType tya = typeOfIRExpr(env->type_env, stmt->Ist.Store.addr);
+ IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.Store.data);
+ IREndness end = stmt->Ist.Store.end;
+
+ if (tya != Ity_I64 || end != Iend_LE)
+ goto stmt_fail;
+
+ am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
if (tyd == Ity_I64) {
- AMD64RI* ri = iselIntExpr_RI(env, stmt->Ist.STle.data);
+ AMD64RI* ri = iselIntExpr_RI(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_Alu64M(Aalu_MOV,ri,am));
return;
}
if (tyd == Ity_I8 || tyd == Ity_I16 || tyd == Ity_I32) {
- HReg r = iselIntExpr_R(env, stmt->Ist.STle.data);
+ HReg r = iselIntExpr_R(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_Store(
toUChar(tyd==Ity_I8 ? 1 : (tyd==Ity_I16 ? 2 : 4)),
r,am));
return;
}
if (tyd == Ity_F64) {
- HReg r = iselDblExpr(env, stmt->Ist.STle.data);
+ HReg r = iselDblExpr(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_SseLdSt(False/*store*/, 8, r, am));
return;
}
if (tyd == Ity_F32) {
- HReg r = iselFltExpr(env, stmt->Ist.STle.data);
+ HReg r = iselFltExpr(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_SseLdSt(False/*store*/, 4, r, am));
return;
}
//.. if (tyd == Ity_I64) {
//.. HReg vHi, vLo, rA;
-//.. iselInt64Expr(&vHi, &vLo, env, stmt->Ist.STle.data);
-//.. rA = iselIntExpr_R(env, stmt->Ist.STle.addr);
+//.. iselInt64Expr(&vHi, &vLo, env, stmt->Ist.Store.data);
+//.. rA = iselIntExpr_R(env, stmt->Ist.Store.addr);
//.. addInstr(env, X86Instr_Alu32M(
//.. Xalu_MOV, X86RI_Reg(vLo), X86AMode_IR(0, rA)));
//.. addInstr(env, X86Instr_Alu32M(
//.. return;
//.. }
if (tyd == Ity_V128) {
- HReg r = iselVecExpr(env, stmt->Ist.STle.data);
+ HReg r = iselVecExpr(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_SseLdSt(False/*store*/, 16, r, am));
return;
}
default: break;
}
+ stmt_fail:
ppIRStmt(stmt);
vpanic("iselStmt(amd64)");
}
/* --------- STORE --------- */
/* little-endian write to memory */
- case Ist_STle: {
+ case Ist_Store: {
HReg reg;
- IRType tya = typeOfIRExpr(env->type_env, stmt->Ist.STle.addr);
- IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.STle.data);
- vassert(tya == Ity_I32);
- reg = iselIntExpr_R(env, stmt->Ist.STle.data);
+ IRType tya = typeOfIRExpr(env->type_env, stmt->Ist.Store.addr);
+ IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.Store.data);
+ IREndness end = stmt->Ist.Store.end;
+
+ if (tya != Ity_I32 || end != Iend_LE)
+ goto stmt_fail;
+
+ reg = iselIntExpr_R(env, stmt->Ist.Store.data);
if (tyd == Ity_I8) {
- ARMAMode2* am2 = iselIntExpr_AMode2(env, stmt->Ist.STle.addr);
+ ARMAMode2* am2 = iselIntExpr_AMode2(env, stmt->Ist.Store.addr);
addInstr(env, ARMInstr_StoreB(reg,am2));
return;
}
if (tyd == Ity_I16) {
- ARMAMode3* am3 = iselIntExpr_AMode3(env, stmt->Ist.STle.addr);
+ ARMAMode3* am3 = iselIntExpr_AMode3(env, stmt->Ist.Store.addr);
addInstr(env, ARMInstr_StoreH(reg,am3));
return;
}
if (tyd == Ity_I32) {
- ARMAMode2* am2 = iselIntExpr_AMode2(env, stmt->Ist.STle.addr);
+ ARMAMode2* am2 = iselIntExpr_AMode2(env, stmt->Ist.Store.addr);
addInstr(env, ARMInstr_StoreW(reg,am2));
return;
}
default: break;
}
+ stmt_fail:
ppIRStmt(stmt);
vpanic("iselStmt");
}
return lookupIRTemp(env, e->Iex.Tmp.tmp);
/* --------- LOAD --------- */
- case Iex_LDle: {
- HReg r_dst = newVRegI(env);
- PPC32AMode* am_addr = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ case Iex_Load: {
+ HReg r_dst = newVRegI(env);
+ PPC32AMode* am_addr = iselIntExpr_AMode(env, e->Iex.Load.addr);
+ if (e->Iex.Load.end != Iend_BE)
+ goto irreducible;
if (ty == Ity_I8 || ty == Ity_I16 || ty == Ity_I32) {
- addInstr(env, PPC32Instr_Load( sizeofIRType(ty), False, r_dst, am_addr ));
+ addInstr(env, PPC32Instr_Load(
+ sizeofIRType(ty), False, r_dst, am_addr ));
return r_dst;
}
break;
return r_dst;
}
- /* 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 = newVRegI(env);
PPC32AMode* amode = iselIntExpr_AMode ( env, mi.bindee[0] );
addInstr(env, PPC32Instr_Load(2,False,r_dst,amode));
return lookupIRTemp(env, e->Iex.Tmp.tmp);
}
- if (e->tag == Iex_LDle) {
+ if (e->tag == Iex_Load && e->Iex.Load.end == Iend_BE) {
PPC32AMode* am_addr;
HReg r_dst = newVRegF(env);
- vassert(e->Iex.LDle.ty == Ity_F32);
- am_addr = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty == Ity_F32);
+ am_addr = iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, PPC32Instr_FpLdSt(True/*load*/, 4, r_dst, am_addr));
return r_dst;
}
return mk_LoadRRtoFPR( env, r_srcHi, r_srcLo );
}
- if (e->tag == Iex_LDle) {
+ if (e->tag == Iex_Load && e->Iex.Load.end == Iend_BE) {
HReg r_dst = newVRegF(env);
PPC32AMode* am_addr;
- vassert(e->Iex.LDle.ty == Ity_F64);
- am_addr = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty == Ity_F64);
+ am_addr = iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, PPC32Instr_FpLdSt(True/*load*/, 8, r_dst, am_addr));
return r_dst;
}
static HReg iselVecExpr_wrk ( ISelEnv* env, IRExpr* e )
{
//.. Bool arg1isEReg = False;
- PPC32AvOp op = Pav_INVALID;
+ // unused: PPC32AvOp op = Pav_INVALID;
IRType ty = typeOfIRExpr(env->type_env,e);
vassert(e);
vassert(ty == Ity_V128);
//.. return dst;
//.. }
- vec_fail:
+ // unused: vec_fail:
vex_printf("iselVecExpr(ppc32) (subarch = %s): can't reduce\n",
LibVEX_ppVexSubArch(env->subarch));
ppIRExpr(e);
switch (stmt->tag) {
/* --------- STORE --------- */
- case Ist_STle: {
+ case Ist_Store: {
PPC32AMode* am_addr;
- IRType tya = typeOfIRExpr(env->type_env, stmt->Ist.STle.addr);
- IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.STle.data);
- vassert(tya == Ity_I32);
+ IRType tya = typeOfIRExpr(env->type_env, stmt->Ist.Store.addr);
+ IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.Store.data);
+ IREndness end = stmt->Ist.Store.end;
+
+ if (tya != Ity_I32 || end != Iend_BE)
+ goto stmt_fail;
- am_addr = iselIntExpr_AMode(env, stmt->Ist.STle.addr);
+ am_addr = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
if (tyd == Ity_I8 || tyd == Ity_I16 || tyd == Ity_I32) {
- HReg r_src = iselIntExpr_R(env, stmt->Ist.STle.data);
+ HReg r_src = iselIntExpr_R(env, stmt->Ist.Store.data);
addInstr(env, PPC32Instr_Store(sizeofIRType(tyd), am_addr, r_src));
return;
}
if (tyd == Ity_F64) {
- HReg fr_src = iselDblExpr(env, stmt->Ist.STle.data);
+ HReg fr_src = iselDblExpr(env, stmt->Ist.Store.data);
addInstr(env, PPC32Instr_FpLdSt(False/*store*/, 8, fr_src, am_addr));
return;
}
if (tyd == Ity_F32) {
- HReg fr_src = iselFltExpr(env, stmt->Ist.STle.data);
+ HReg fr_src = iselFltExpr(env, stmt->Ist.Store.data);
addInstr(env, PPC32Instr_FpLdSt(False/*store*/, 4, fr_src, am_addr));
return;
}
//.. if (tyd == Ity_I64) {
//.. HReg vHi, vLo, rA;
-//.. iselInt64Expr(&vHi, &vLo, env, stmt->Ist.STle.data);
-//.. rA = iselIntExpr_R(env, stmt->Ist.STle.addr);
+//.. iselInt64Expr(&vHi, &vLo, env, stmt->Ist.Store.data);
+//.. rA = iselIntExpr_R(env, stmt->Ist.Store.addr);
//.. addInstr(env, X86Instr_Alu32M(
//.. Xalu_MOV, X86RI_Reg(vLo), X86AMode_IR(0, rA)));
//.. addInstr(env, X86Instr_Alu32M(
//.. return;
//.. }
if (tyd == Ity_V128) {
- HReg v_src = iselVecExpr(env, stmt->Ist.STle.data);
+ HReg v_src = iselVecExpr(env, stmt->Ist.Store.data);
addInstr(env, PPC32Instr_AvLdSt(False/*store*/, 16, v_src, am_addr));
return;
}
default: break;
}
+ stmt_fail:
ppIRStmt(stmt);
vpanic("iselStmt(ppc32)");
}
}
/* --------- LOAD --------- */
- case Iex_LDle: {
+ case Iex_Load: {
HReg dst = newVRegI(env);
- X86AMode* amode = iselIntExpr_AMode ( env, e->Iex.LDle.addr );
+ X86AMode* amode = iselIntExpr_AMode ( env, e->Iex.Load.addr );
+
+ if (e->Iex.Load.end != Iend_LE)
+ goto irreducible;
+
if (ty == Ity_I32) {
addInstr(env, X86Instr_Alu32R(Xalu_MOV,
X86RMI_Mem(amode), dst) );
{
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 = newVRegI(env);
X86AMode* amode = iselIntExpr_AMode ( env, mi.bindee[0] );
}
/* special case: 32-bit load from memory */
- if (e->tag == Iex_LDle && ty == Ity_I32) {
- X86AMode* am = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ if (e->tag == Iex_Load && ty == Ity_I32 && e->Iex.Load.end == Iend_LE) {
+ X86AMode* am = iselIntExpr_AMode(env, e->Iex.Load.addr);
return X86RMI_Mem(am);
}
}
/* 64-bit load */
- if (e->tag == Iex_LDle) {
+ if (e->tag == Iex_Load && e->Iex.Load.end == Iend_LE) {
HReg tLo, tHi;
X86AMode *am0, *am4;
- vassert(e->Iex.LDle.ty == Ity_I64);
+ vassert(e->Iex.Load.ty == Ity_I64);
tLo = newVRegI(env);
tHi = newVRegI(env);
- am0 = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ am0 = iselIntExpr_AMode(env, e->Iex.Load.addr);
am4 = advance4(am0);
addInstr(env, X86Instr_Alu32R( Xalu_MOV, X86RMI_Mem(am0), tLo ));
addInstr(env, X86Instr_Alu32R( Xalu_MOV, X86RMI_Mem(am4), tHi ));
return lookupIRTemp(env, e->Iex.Tmp.tmp);
}
- if (e->tag == Iex_LDle) {
+ if (e->tag == Iex_Load && e->Iex.Load.end == Iend_LE) {
X86AMode* am;
HReg res = newVRegF(env);
- vassert(e->Iex.LDle.ty == Ity_F32);
- am = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty == Ity_F32);
+ am = iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, X86Instr_FpLdSt(True/*load*/, 4, res, am));
return res;
}
return freg;
}
- if (e->tag == Iex_LDle) {
+ if (e->tag == Iex_Load && e->Iex.Load.end == Iend_LE) {
X86AMode* am;
HReg res = newVRegF(env);
- vassert(e->Iex.LDle.ty == Ity_F64);
- am = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ vassert(e->Iex.Load.ty == Ity_F64);
+ am = iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, X86Instr_FpLdSt(True/*load*/, 8, res, am));
return res;
}
return dst;
}
- if (e->tag == Iex_LDle) {
+ if (e->tag == Iex_Load && e->Iex.Load.end == Iend_LE) {
HReg dst = newVRegV(env);
- X86AMode* am = iselIntExpr_AMode(env, e->Iex.LDle.addr);
+ X86AMode* am = iselIntExpr_AMode(env, e->Iex.Load.addr);
addInstr(env, X86Instr_SseLdSt( True/*load*/, dst, am ));
return dst;
}
/* 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,
+ IRExpr_Load(Iend_LE,Ity_I64,bind(0))));
if (matchIRExpr(&mi, p_zwiden_load64, e)) {
X86AMode* am = iselIntExpr_AMode(env, mi.bindee[0]);
HReg dst = newVRegV(env);
switch (stmt->tag) {
/* --------- STORE --------- */
- case Ist_STle: {
+ case Ist_Store: {
X86AMode* am;
- IRType tya = typeOfIRExpr(env->type_env, stmt->Ist.STle.addr);
- IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.STle.data);
- vassert(tya == Ity_I32);
- am = iselIntExpr_AMode(env, stmt->Ist.STle.addr);
+ IRType tya = typeOfIRExpr(env->type_env, stmt->Ist.Store.addr);
+ IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.Store.data);
+ IREndness end = stmt->Ist.Store.end;
+
+ if (tya != Ity_I32 || end != Iend_LE)
+ goto stmt_fail;
+
+ am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
if (tyd == Ity_I32) {
- X86RI* ri = iselIntExpr_RI(env, stmt->Ist.STle.data);
+ X86RI* ri = iselIntExpr_RI(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_Alu32M(Xalu_MOV,ri,am));
return;
}
if (tyd == Ity_I8 || tyd == Ity_I16) {
- HReg r = iselIntExpr_R(env, stmt->Ist.STle.data);
+ HReg r = iselIntExpr_R(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_Store( toUChar(tyd==Ity_I8 ? 1 : 2),
r,am ));
return;
}
if (tyd == Ity_F64) {
- HReg r = iselDblExpr(env, stmt->Ist.STle.data);
+ HReg r = iselDblExpr(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_FpLdSt(False/*store*/, 8, r, am));
return;
}
if (tyd == Ity_F32) {
- HReg r = iselFltExpr(env, stmt->Ist.STle.data);
+ HReg r = iselFltExpr(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_FpLdSt(False/*store*/, 4, r, am));
return;
}
if (tyd == Ity_I64) {
HReg vHi, vLo, rA;
- iselInt64Expr(&vHi, &vLo, env, stmt->Ist.STle.data);
- rA = iselIntExpr_R(env, stmt->Ist.STle.addr);
+ iselInt64Expr(&vHi, &vLo, env, stmt->Ist.Store.data);
+ rA = iselIntExpr_R(env, stmt->Ist.Store.addr);
addInstr(env, X86Instr_Alu32M(
Xalu_MOV, X86RI_Reg(vLo), X86AMode_IR(0, rA)));
addInstr(env, X86Instr_Alu32M(
return;
}
if (tyd == Ity_V128) {
- HReg r = iselVecExpr(env, stmt->Ist.STle.data);
+ HReg r = iselVecExpr(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_SseLdSt(False/*store*/, r, am));
return;
}
default: break;
}
+ stmt_fail:
ppIRStmt(stmt);
vpanic("iselStmt");
}
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==Iend_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:
vex_printf( " = " );
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==Iend_LE ? "le" : "be" );
+ ppIRExpr(s->Ist.Store.addr);
vex_printf( ") = ");
- ppIRExpr(s->Ist.STle.data);
+ ppIRExpr(s->Ist.Store.data);
break;
case Ist_Dirty:
ppIRDirty(s->Ist.Dirty.details);
e->Iex.Unop.arg = arg;
return e;
}
-IRExpr* IRExpr_LDle ( IRType ty, IRExpr* addr ) {
+IRExpr* IRExpr_Load ( IREndness end, IRType ty, IRExpr* addr ) {
IRExpr* e = LibVEX_Alloc(sizeof(IRExpr));
- e->tag = Iex_LDle;
- e->Iex.LDle.ty = ty;
- e->Iex.LDle.addr = addr;
+ e->tag = Iex_Load;
+ e->Iex.Load.end = end;
+ e->Iex.Load.ty = ty;
+ e->Iex.Load.addr = addr;
+ vassert(end == Iend_LE || end == Iend_BE);
return e;
}
IRExpr* IRExpr_Const ( IRConst* con ) {
s->Ist.Tmp.data = data;
return s;
}
-IRStmt* IRStmt_STle ( IRExpr* addr, IRExpr* data ) {
- IRStmt* s = LibVEX_Alloc(sizeof(IRStmt));
- s->tag = Ist_STle;
- s->Ist.STle.addr = addr;
- s->Ist.STle.data = data;
+IRStmt* IRStmt_Store ( IREndness end, IRExpr* addr, IRExpr* data ) {
+ IRStmt* s = LibVEX_Alloc(sizeof(IRStmt));
+ s->tag = Ist_Store;
+ s->Ist.Store.end = end;
+ s->Ist.Store.addr = addr;
+ s->Ist.Store.data = data;
+ vassert(end == Iend_LE || end == Iend_BE);
return s;
}
IRStmt* IRStmt_Dirty ( IRDirty* d )
case Iex_Unop:
return IRExpr_Unop(e->Iex.Unop.op,
dopyIRExpr(e->Iex.Unop.arg));
- case Iex_LDle:
- return IRExpr_LDle(e->Iex.LDle.ty,
- dopyIRExpr(e->Iex.LDle.addr));
+ case Iex_Load:
+ return IRExpr_Load(e->Iex.Load.end,
+ e->Iex.Load.ty,
+ dopyIRExpr(e->Iex.Load.addr));
case Iex_Const:
return IRExpr_Const(dopyIRConst(e->Iex.Const.con));
case Iex_CCall:
case Ist_Tmp:
return IRStmt_Tmp(s->Ist.Tmp.tmp,
dopyIRExpr(s->Ist.Tmp.data));
- case Ist_STle:
- return IRStmt_STle(dopyIRExpr(s->Ist.STle.addr),
- dopyIRExpr(s->Ist.STle.data));
+ case Ist_Store:
+ return IRStmt_Store(s->Ist.Store.end,
+ dopyIRExpr(s->Ist.Store.addr),
+ dopyIRExpr(s->Ist.Store.data));
case Ist_Dirty:
return IRStmt_Dirty(dopyIRDirty(s->Ist.Dirty.details));
case Ist_MFence:
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:
isIRAtom(e->Iex.Binop.arg1)
&& 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 = 0; e->Iex.CCall.args[i]; i++)
if (!isIRAtom(e->Iex.CCall.args[i]))
}
/*notreached*/
vassert(0);
- case Ist_STle:
- return toBool( isIRAtom(st->Ist.STle.addr)
- && isIRAtom(st->Ist.STle.data) );
+ case Ist_Store:
+ return toBool( isIRAtom(st->Ist.Store.addr)
+ && isIRAtom(st->Ist.Store.data) );
case Ist_Dirty:
di = st->Ist.Dirty.details;
if (!isIRAtom(di->guard))
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;
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 = stmt->Ist.Dirty.details;
if (t_arg1 != typeOfIRExpr(tyenv, expr->Iex.Unop.arg))
sanityCheckFail(bb,stmt,"Iex.Unop: arg ty doesn't match op ty");
break;
- case Iex_LDle:
- tcExpr(bb,stmt, expr->Iex.LDle.addr, gWordTy);
- if (typeOfIRExpr(tyenv, expr->Iex.LDle.addr) != gWordTy)
- sanityCheckFail(bb,stmt,"Iex.LDle.addr: not :: guest word type");
+ case Iex_Load:
+ tcExpr(bb,stmt, expr->Iex.Load.addr, gWordTy);
+ if (typeOfIRExpr(tyenv, expr->Iex.Load.addr) != gWordTy)
+ sanityCheckFail(bb,stmt,"Iex.Load.addr: not :: guest word type");
+ if (expr->Iex.Load.end != Iend_LE && expr->Iex.Load.end != Iend_BE)
+ sanityCheckFail(bb,stmt,"Iex.Load.end: bogus endianness");
break;
case Iex_CCall:
if (!saneIRCallee(expr->Iex.CCall.cee))
!= 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) != gWordTy)
- sanityCheckFail(bb,stmt,"IRStmt.STle.addr: not :: guest word type");
- if (typeOfIRExpr(tyenv, stmt->Ist.STle.data) == Ity_I1)
- sanityCheckFail(bb,stmt,"IRStmt.STle.data: cannot STle :: Ity_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) != gWordTy)
+ sanityCheckFail(bb,stmt,"IRStmt.Store.addr: not :: guest word type");
+ if (typeOfIRExpr(tyenv, stmt->Ist.Store.data) == Ity_I1)
+ sanityCheckFail(bb,stmt,"IRStmt.Store.data: cannot Store :: Ity_I1");
+ if (stmt->Ist.Store.end != Iend_LE && stmt->Ist.Store.end != Iend_BE)
+ sanityCheckFail(bb,stmt,"Ist.Store.end: bogus endianness");
break;
case Ist_Dirty:
/* Mostly check for various kinds of ill-formed dirty calls. */
if (!matchWrk(mi, p->Iex.Binop.arg2, e->Iex.Binop.arg2))
return False;
return True;
- case Iex_LDle:
- if (e->tag != Iex_LDle) return False;
- if (p->Iex.LDle.ty != e->Iex.LDle.ty) return False;
- if (!matchWrk(mi, p->Iex.LDle.addr, e->Iex.LDle.addr))
+ case Iex_Load:
+ if (e->tag != Iex_Load) return False;
+ if (p->Iex.Load.end != e->Iex.Load.end) return False;
+ if (p->Iex.Load.ty != e->Iex.Load.ty) return False;
+ if (!matchWrk(mi, p->Iex.Load.addr, e->Iex.Load.addr))
return False;
return True;
case Iex_Const:
if (e->tag == Iex_Binop)
return toBool( isIRAtom(e->Iex.Binop.arg1)
&& isIRAtom(e->Iex.Binop.arg2) );
- if (e->tag == Iex_LDle)
- return isIRAtom(e->Iex.LDle.addr);
+ if (e->tag == Iex_Load)
+ return isIRAtom(e->Iex.Load.addr);
return False;
}
flatten_Expr(bb, ex->Iex.Unop.arg))));
return IRExpr_Tmp(t1);
- case Iex_LDle:
+ case Iex_Load:
t1 = newIRTemp(bb->tyenv, ty);
addStmtToIRBB(bb, IRStmt_Tmp(t1,
- IRExpr_LDle(ex->Iex.LDle.ty,
- flatten_Expr(bb, ex->Iex.LDle.addr))));
+ IRExpr_Load(ex->Iex.Load.end,
+ ex->Iex.Load.ty,
+ flatten_Expr(bb, ex->Iex.Load.addr))));
return IRExpr_Tmp(t1);
case Iex_CCall:
addStmtToIRBB(bb, IRStmt_Tmp(st->Ist.Tmp.tmp, e1));
}
break;
- case Ist_STle:
- e1 = flatten_Expr(bb, st->Ist.STle.addr);
- e2 = flatten_Expr(bb, st->Ist.STle.data);
- addStmtToIRBB(bb, IRStmt_STle(e1,e2));
+ case Ist_Store:
+ e1 = flatten_Expr(bb, st->Ist.Store.addr);
+ e2 = flatten_Expr(bb, st->Ist.Store.data);
+ addStmtToIRBB(bb, IRStmt_Store(st->Ist.Store.end, e1,e2));
break;
case Ist_Dirty:
d = st->Ist.Dirty.details;
isGet = True;
key = mk_key_GetIPutI ( e->Iex.GetI.descr );
break;
- case Iex_LDle:
+ case Iex_Load:
isGet = False;
memRW = True;
break;
break;
/* 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 = True;
break;
subst_Expr(env, ex->Iex.Unop.arg)
);
- 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)
);
case Iex_CCall: {
fold_Expr(subst_Expr(env, st->Ist.Tmp.data))
);
- 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))
);
case Ist_Dirty: {
for (i = 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);
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 = st->Ist.Dirty.details;
}
return False;
- 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;
default:
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 = 0; e->Iex.CCall.args[i]; i++)
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 = st->Ist.Dirty.details;
occCount_Expr(env, e->Iex.Unop.arg);
return;
- case Iex_LDle:
- occCount_Expr(env, e->Iex.LDle.addr);
+ case Iex_Load:
+ occCount_Expr(env, e->Iex.Load.addr);
return;
case Iex_CCall:
occCount_Expr(env, st->Ist.PutI.ix);
occCount_Expr(env, st->Ist.PutI.data);
return;
- case Ist_STle:
- 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 = st->Ist.Dirty.details;
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(
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(
case Iex_Unop:
setHints_Expr(doesLoad, doesGet, e->Iex.Unop.arg);
return;
- case Iex_LDle:
+ case Iex_Load:
*doesLoad = True;
- setHints_Expr(doesLoad, doesGet, e->Iex.LDle.addr);
+ setHints_Expr(doesLoad, doesGet, e->Iex.Load.addr);
return;
case Iex_Get:
*doesGet = True;
|| st->tag == Ist_PutI
|| st->tag == Ist_Dirty);
- invStore = toBool(st->tag == Ist_STle
+ invStore = toBool(st->tag == Ist_Store
|| st->tag == Ist_Dirty);
for (k = 0; k < n_tmps; k++) {
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 = st->Ist.Dirty.details;
extern Int sizeofIRType ( IRType );
+/* ------------------ Endianness ------------------ */
+
+typedef
+ enum {
+ Iend_LE=22, /* little endian */
+ Iend_BE=33 /* big endian */
+ }
+ IREndness;
+
+
/* ------------------ Constants ------------------ */
typedef
Iex_Tmp, /* value of temporary */
Iex_Binop, /* binary operation */
Iex_Unop, /* unary operation */
- Iex_LDle, /* little-endian read from memory */
+ Iex_Load, /* read from memory */
Iex_Const, /* constant-valued expression */
Iex_Mux0X, /* ternary if-then-else operator (STRICT) */
Iex_CCall /* call to pure (side-effect-free) helper fn */
struct _IRExpr* arg;
} Unop;
struct {
+ IREndness end;
IRType ty;
struct _IRExpr* addr;
- } LDle;
+ } Load;
struct {
IRConst* con;
} Const;
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** args );
extern IRExpr* IRExpr_Mux0X ( IRExpr* cond, IRExpr* expr0, IRExpr* exprX );
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 */
IRExpr* data;
} Tmp;
struct {
- IRExpr* addr;
- IRExpr* data;
- } STle;
+ IREndness end;
+ IRExpr* addr;
+ IRExpr* data;
+ } Store;
struct {
IRDirty* details;
} Dirty;
extern IRStmt* IRStmt_PutI ( IRArray* descr, IRExpr* ix, Int bias,
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* data );
extern IRStmt* IRStmt_Dirty ( IRDirty* details );
extern IRStmt* IRStmt_MFence ( void );
extern IRStmt* IRStmt_Exit ( IRExpr* guard, IRJumpKind jk, IRConst* dst );