{
vassert(sz == 1 || sz == 2 || sz == 4);
vassert(archreg < 8);
- stmt( IRStmt_Put(NULL, integerGuestRegOffset(sz,archreg), e) );
+ stmt( IRStmt_Put(integerGuestRegOffset(sz,archreg), e) );
}
static void assign ( IRTemp dst, IRExpr* e )
IRTemp dst1,
IRType ty )
{
- Bool logic = False;
- Int ccOp = ty==Ity_I8 ? 0 : (ty==Ity_I16 ? 1 : 2);
- IRExpr* guard = NULL;
+ Bool logic = False;
+ Int ccOp = ty==Ity_I8 ? 0 : (ty==Ity_I16 ? 1 : 2);
vassert(ty == Ity_I8 || ty == Ity_I16 || ty == Ity_I32);
default: ppIROp(op8);
vpanic("setFlags_SRC_DST1(x86)");
}
- stmt( IRStmt_Put(guard, OFFB_CC_OP, mkU32(ccOp)) );
- stmt( IRStmt_Put(guard, OFFB_CC_SRC, logic ? mkU32(0)
+ stmt( IRStmt_Put( OFFB_CC_OP, mkU32(ccOp)) );
+ stmt( IRStmt_Put( OFFB_CC_SRC, logic ? mkU32(0)
: mkexpr(src)) );
- stmt( IRStmt_Put(guard, OFFB_CC_DST, mkexpr(dst1)) );
+ stmt( IRStmt_Put( OFFB_CC_DST, mkexpr(dst1)) );
}
}
/* CC_SRC = undershifted %d after, CC_DST = %d afterwards */
- stmt( IRStmt_Put(mkexpr(guard), OFFB_CC_OP, mkU32(ccOp)) );
- stmt( IRStmt_Put(mkexpr(guard), OFFB_CC_SRC, mkexpr(dstUS)) );
- stmt( IRStmt_Put(mkexpr(guard), OFFB_CC_DST, mkexpr(dst1)) );
+ stmt( IRStmt_Put( OFFB_CC_OP,
+ IRExpr_Mux10( mkexpr(guard),
+ mkU32(ccOp),
+ IRExpr_Get(OFFB_CC_OP,Ity_I32))) );
+ stmt( IRStmt_Put( OFFB_CC_SRC,
+ IRExpr_Mux10( mkexpr(guard),
+ mkexpr(dstUS),
+ IRExpr_Get(OFFB_CC_SRC,Ity_I32))) );
+ stmt( IRStmt_Put( OFFB_CC_DST,
+ IRExpr_Mux10( mkexpr(guard),
+ mkexpr(dst1),
+ IRExpr_Get(OFFB_CC_DST,Ity_I32))) );
}
static void setFlags_INC_DEC ( Bool inc, IRTemp dst, IRType ty )
{
- IRExpr* guard = NULL;
- Int ccOp = inc ? CC_OP_INCB : CC_OP_DECB;
+ Int ccOp = inc ? CC_OP_INCB : CC_OP_DECB;
ccOp += ty==Ity_I8 ? 0 : (ty==Ity_I16 ? 1 : 2);
vassert(ty == Ity_I8 || ty == Ity_I16 || ty == Ity_I32);
/* This has to come first, because calculating the C flag
may require reading all three OFFB_CC fields. */
- stmt( IRStmt_Put(guard, OFFB_CC_SRC, mk_calculate_eflags_c()) );
- stmt( IRStmt_Put(guard, OFFB_CC_OP, mkU32(ccOp)) );
- stmt( IRStmt_Put(guard, OFFB_CC_DST, mkexpr(dst)) );
+ stmt( IRStmt_Put( OFFB_CC_SRC, mk_calculate_eflags_c()) );
+ stmt( IRStmt_Put( OFFB_CC_OP, mkU32(ccOp)) );
+ stmt( IRStmt_Put( OFFB_CC_DST, mkexpr(dst)) );
}
{
switch (ty) {
case Ity_I8:
- stmt( IRStmt_Put( NULL, OFFB_CC_OP, mkU32(base_op+0) ) );
- stmt( IRStmt_Put( NULL, OFFB_CC_SRC, unop(Iop_8Uto32,mkexpr(src1)) ) );
- stmt( IRStmt_Put( NULL, OFFB_CC_DST, unop(Iop_8Uto32,mkexpr(src2)) ) );
+ stmt( IRStmt_Put( OFFB_CC_OP, mkU32(base_op+0) ) );
+ stmt( IRStmt_Put( OFFB_CC_SRC, unop(Iop_8Uto32,mkexpr(src1)) ) );
+ stmt( IRStmt_Put( OFFB_CC_DST, unop(Iop_8Uto32,mkexpr(src2)) ) );
break;
case Ity_I16:
- stmt( IRStmt_Put( NULL, OFFB_CC_OP, mkU32(base_op+1) ) );
- stmt( IRStmt_Put( NULL, OFFB_CC_SRC, unop(Iop_16Uto32,mkexpr(src1)) ) );
- stmt( IRStmt_Put( NULL, OFFB_CC_DST, unop(Iop_16Uto32,mkexpr(src2)) ) );
+ stmt( IRStmt_Put( OFFB_CC_OP, mkU32(base_op+1) ) );
+ stmt( IRStmt_Put( OFFB_CC_SRC, unop(Iop_16Uto32,mkexpr(src1)) ) );
+ stmt( IRStmt_Put( OFFB_CC_DST, unop(Iop_16Uto32,mkexpr(src2)) ) );
break;
case Ity_I32:
- stmt( IRStmt_Put( NULL, OFFB_CC_OP, mkU32(base_op+2) ) );
- stmt( IRStmt_Put( NULL, OFFB_CC_SRC, mkexpr(src1) ) );
- stmt( IRStmt_Put( NULL, OFFB_CC_DST, mkexpr(src2) ) );
+ stmt( IRStmt_Put( OFFB_CC_OP, mkU32(base_op+2) ) );
+ stmt( IRStmt_Put( OFFB_CC_SRC, mkexpr(src1) ) );
+ stmt( IRStmt_Put( OFFB_CC_DST, mkexpr(src2) ) );
break;
default:
vpanic("setFlags_MUL(x86)");
mkU32(thunkOp),
binop(Iop_Mul32, mkexpr(oldc), mkU32(3)));
- stmt( IRStmt_Put( NULL, OFFB_CC_OP, thunkExpr ) );
- stmt( IRStmt_Put( NULL, OFFB_CC_SRC, mkexpr(ta2) ) );
- stmt( IRStmt_Put( NULL, OFFB_CC_DST, mkexpr(tdst) ) );
+ stmt( IRStmt_Put( OFFB_CC_OP, thunkExpr ) );
+ stmt( IRStmt_Put( OFFB_CC_SRC, mkexpr(ta2) ) );
+ stmt( IRStmt_Put( OFFB_CC_DST, mkexpr(tdst) ) );
}
case 0xFC: /* CLD */
- stmt( IRStmt_Put( NULL, OFFB_DFLAG, mkU32(1)) );
+ stmt( IRStmt_Put( OFFB_DFLAG, mkU32(1)) );
DIP("cld\n");
break;
vex_printf("):");
ppIRType(e->Iex.CCall.retty);
break;
+ case Iex_Mux10:
+ vex_printf("Mux10(");
+ ppIRExpr(e->Iex.Mux10.cond);
+ vex_printf(",");
+ ppIRExpr(e->Iex.Mux10.expr1);
+ vex_printf(",");
+ ppIRExpr(e->Iex.Mux10.expr0);
+ vex_printf(")");
+ break;
default:
vpanic("ppIExpr");
}
{
switch (s->tag) {
case Ist_Put:
- if (s->Ist.Put.guard) {
- vex_printf("if (");
- ppIRExpr(s->Ist.Put.guard);
- vex_printf( ") PUT(%d) = ", s->Ist.Put.offset);
- ppIRExpr(s->Ist.Put.expr);
- } else {
- vex_printf( "PUT(%d) = ", s->Ist.Put.offset);
- ppIRExpr(s->Ist.Put.expr);
- }
+ vex_printf( "PUT(%d) = ", s->Ist.Put.offset);
+ ppIRExpr(s->Ist.Put.expr);
break;
case Ist_Tmp:
ppIRTemp(s->Ist.Tmp.tmp);
e->Iex.CCall.args = args;
return e;
}
+IRExpr* IRExpr_Mux10 ( IRExpr* cond, IRExpr* expr1, IRExpr* expr0 ) {
+ IRExpr* e = LibVEX_Alloc(sizeof(IRExpr));
+ e->tag = Iex_Mux10;
+ e->Iex.Mux10.cond = cond;
+ e->Iex.Mux10.expr1 = expr1;
+ e->Iex.Mux10.expr0 = expr0;
+ return e;
+}
/* Constructors -- IRStmt */
-IRStmt* IRStmt_Put ( IRExpr* guard, Int off, IRExpr* value ) {
+IRStmt* IRStmt_Put ( Int off, IRExpr* value ) {
IRStmt* s = LibVEX_Alloc(sizeof(IRStmt));
s->tag = Ist_Put;
s->link = NULL;
- s->Ist.Put.guard = guard;
s->Ist.Put.offset = off;
s->Ist.Put.expr = value;
return s;
return t_dst;
case Iex_CCall:
return e->Iex.CCall.retty;
+ case Iex_Mux10:
+ return typeOfIRExpr(tyenv, e->Iex.Mux10.expr1);
default:
ppIRExpr(e);
vpanic("typeOfIRExpr");
for (i = 0; expr->Iex.CCall.args[i]; i++)
useBeforeDef_Expr(bb,stmt,expr->Iex.CCall.args[i],def_counts);
break;
+ case Iex_Mux10:
+ useBeforeDef_Expr(bb,stmt,expr->Iex.Mux10.cond,def_counts);
+ useBeforeDef_Expr(bb,stmt,expr->Iex.Mux10.expr1,def_counts);
+ useBeforeDef_Expr(bb,stmt,expr->Iex.Mux10.expr0,def_counts);
+ break;
+ default:
+ vpanic("useBeforeDef_Expr");
}
}
{
switch (stmt->tag) {
case Ist_Put:
- if (stmt->Ist.Put.guard)
- useBeforeDef_Expr(bb,stmt,stmt->Ist.Put.guard,def_counts);
useBeforeDef_Expr(bb,stmt,stmt->Ist.Put.expr,def_counts);
break;
case Ist_Tmp:
break;
case Iex_Const:
break;
- default:
+ case Iex_Mux10:
+ tcExpr(bb,stmt, expr->Iex.Mux10.cond, gWordTy);
+ tcExpr(bb,stmt, expr->Iex.Mux10.expr1, gWordTy);
+ tcExpr(bb,stmt, expr->Iex.Mux10.expr0, gWordTy);
+ if (typeOfIRExpr(tyenv, expr->Iex.Mux10.cond) != Ity_Bit)
+ sanityCheckFail(bb,stmt,"Iex.Mux10.cond: cond :: Ity_Bit");
+ if (typeOfIRExpr(tyenv, expr->Iex.Mux10.expr1)
+ != typeOfIRExpr(tyenv, expr->Iex.Mux10.expr0))
+ sanityCheckFail(bb,stmt,"Iex.Mux10: expr1/expr0 mismatch");
+ break;
+ default:
vpanic("tcExpr");
}
}
IRTypeEnv* tyenv = bb->tyenv;
switch (stmt->tag) {
case Ist_Put:
- if (stmt->Ist.Put.guard) {
- tcExpr( bb, stmt, stmt->Ist.Put.guard, gWordTy );
- if (typeOfIRExpr(tyenv,stmt->Ist.Put.guard) != Ity_Bit)
- sanityCheckFail(bb,stmt,"IRStmt.Put.guard: not :: Ity_Bit");
- }
tcExpr( bb, stmt, stmt->Ist.Put.expr, gWordTy );
if (typeOfIRExpr(tyenv,stmt->Ist.Put.expr) == Ity_Bit)
sanityCheckFail(bb,stmt,"IRStmt.Put.expr: cannot Put :: Ity_Bit");