|
From: <sv...@va...> - 2012-06-01 20:41:40
|
florian 2012-06-01 21:41:24 +0100 (Fri, 01 Jun 2012)
New Revision: 2363
Log:
Put the Qop member into a separate struct (IRQop) and link to that
from IRExpr. Reduces size of IRExpr from 48 to 40 bytes on LP64.
Modified files:
trunk/priv/host_amd64_isel.c
trunk/priv/host_ppc_isel.c
trunk/priv/host_s390_isel.c
trunk/priv/ir_defs.c
trunk/priv/ir_opt.c
trunk/priv/main_main.c
trunk/pub/libvex_ir.h
Modified: trunk/priv/ir_opt.c (+41 -37)
===================================================================
--- trunk/priv/ir_opt.c 2012-06-01 17:09:50 +01:00 (rev 2362)
+++ trunk/priv/ir_opt.c 2012-06-01 21:41:24 +01:00 (rev 2363)
@@ -290,15 +290,17 @@
IRStmt_WrTmp(t1, ex));
return IRExpr_RdTmp(t1);
- case Iex_Qop:
+ case Iex_Qop: {
+ IRQop* qop = ex->Iex.Qop.details;
t1 = newIRTemp(bb->tyenv, ty);
addStmtToIRSB(bb, IRStmt_WrTmp(t1,
- IRExpr_Qop(ex->Iex.Qop.op,
- flatten_Expr(bb, ex->Iex.Qop.arg1),
- flatten_Expr(bb, ex->Iex.Qop.arg2),
- flatten_Expr(bb, ex->Iex.Qop.arg3),
- flatten_Expr(bb, ex->Iex.Qop.arg4))));
+ IRExpr_Qop(qop->op,
+ flatten_Expr(bb, qop->arg1),
+ flatten_Expr(bb, qop->arg2),
+ flatten_Expr(bb, qop->arg3),
+ flatten_Expr(bb, qop->arg4))));
return IRExpr_RdTmp(t1);
+ }
case Iex_Triop:
t1 = newIRTemp(bb->tyenv, ty);
@@ -2038,18 +2040,20 @@
ex->Iex.GetI.bias
);
- case Iex_Qop:
- vassert(isIRAtom(ex->Iex.Qop.arg1));
- vassert(isIRAtom(ex->Iex.Qop.arg2));
- vassert(isIRAtom(ex->Iex.Qop.arg3));
- vassert(isIRAtom(ex->Iex.Qop.arg4));
+ case Iex_Qop: {
+ IRQop* qop = ex->Iex.Qop.details;
+ vassert(isIRAtom(qop->arg1));
+ vassert(isIRAtom(qop->arg2));
+ vassert(isIRAtom(qop->arg3));
+ vassert(isIRAtom(qop->arg4));
return IRExpr_Qop(
- ex->Iex.Qop.op,
- subst_Expr(env, ex->Iex.Qop.arg1),
- subst_Expr(env, ex->Iex.Qop.arg2),
- subst_Expr(env, ex->Iex.Qop.arg3),
- subst_Expr(env, ex->Iex.Qop.arg4)
+ qop->op,
+ subst_Expr(env, qop->arg1),
+ subst_Expr(env, qop->arg2),
+ subst_Expr(env, qop->arg3),
+ subst_Expr(env, qop->arg4)
);
+ }
case Iex_Triop:
vassert(isIRAtom(ex->Iex.Triop.arg1));
@@ -2383,10 +2387,10 @@
addUses_Expr(set, e->Iex.Load.addr);
return;
case Iex_Qop:
- addUses_Expr(set, e->Iex.Qop.arg1);
- addUses_Expr(set, e->Iex.Qop.arg2);
- addUses_Expr(set, e->Iex.Qop.arg3);
- addUses_Expr(set, e->Iex.Qop.arg4);
+ addUses_Expr(set, e->Iex.Qop.details->arg1);
+ addUses_Expr(set, e->Iex.Qop.details->arg2);
+ addUses_Expr(set, e->Iex.Qop.details->arg3);
+ addUses_Expr(set, e->Iex.Qop.details->arg4);
return;
case Iex_Triop:
addUses_Expr(set, e->Iex.Triop.arg1);
@@ -3813,10 +3817,10 @@
deltaIRExpr(e->Iex.GetI.ix, delta);
break;
case Iex_Qop:
- deltaIRExpr(e->Iex.Qop.arg1, delta);
- deltaIRExpr(e->Iex.Qop.arg2, delta);
- deltaIRExpr(e->Iex.Qop.arg3, delta);
- deltaIRExpr(e->Iex.Qop.arg4, delta);
+ deltaIRExpr(e->Iex.Qop.details->arg1, delta);
+ deltaIRExpr(e->Iex.Qop.details->arg2, delta);
+ deltaIRExpr(e->Iex.Qop.details->arg3, delta);
+ deltaIRExpr(e->Iex.Qop.details->arg4, delta);
break;
case Iex_Triop:
deltaIRExpr(e->Iex.Triop.arg1, delta);
@@ -4208,10 +4212,10 @@
setHints_Expr(doesLoad, doesGet, e->Iex.Mux0X.exprX);
return;
case Iex_Qop:
- setHints_Expr(doesLoad, doesGet, e->Iex.Qop.arg1);
- setHints_Expr(doesLoad, doesGet, e->Iex.Qop.arg2);
- setHints_Expr(doesLoad, doesGet, e->Iex.Qop.arg3);
- setHints_Expr(doesLoad, doesGet, e->Iex.Qop.arg4);
+ setHints_Expr(doesLoad, doesGet, e->Iex.Qop.details->arg1);
+ setHints_Expr(doesLoad, doesGet, e->Iex.Qop.details->arg2);
+ setHints_Expr(doesLoad, doesGet, e->Iex.Qop.details->arg3);
+ setHints_Expr(doesLoad, doesGet, e->Iex.Qop.details->arg4);
return;
case Iex_Triop:
setHints_Expr(doesLoad, doesGet, e->Iex.Triop.arg1);
@@ -4281,10 +4285,10 @@
return;
case Iex_Qop:
- aoccCount_Expr(uses, e->Iex.Qop.arg1);
- aoccCount_Expr(uses, e->Iex.Qop.arg2);
- aoccCount_Expr(uses, e->Iex.Qop.arg3);
- aoccCount_Expr(uses, e->Iex.Qop.arg4);
+ aoccCount_Expr(uses, e->Iex.Qop.details->arg1);
+ aoccCount_Expr(uses, e->Iex.Qop.details->arg2);
+ aoccCount_Expr(uses, e->Iex.Qop.details->arg3);
+ aoccCount_Expr(uses, e->Iex.Qop.details->arg4);
return;
case Iex_Triop:
@@ -4603,11 +4607,11 @@
);
case Iex_Qop:
return IRExpr_Qop(
- e->Iex.Qop.op,
- atbSubst_Expr(env, e->Iex.Qop.arg1),
- atbSubst_Expr(env, e->Iex.Qop.arg2),
- atbSubst_Expr(env, e->Iex.Qop.arg3),
- atbSubst_Expr(env, e->Iex.Qop.arg4)
+ e->Iex.Qop.details->op,
+ atbSubst_Expr(env, e->Iex.Qop.details->arg1),
+ atbSubst_Expr(env, e->Iex.Qop.details->arg2),
+ atbSubst_Expr(env, e->Iex.Qop.details->arg3),
+ atbSubst_Expr(env, e->Iex.Qop.details->arg4)
);
case Iex_Triop:
return IRExpr_Triop(
Modified: trunk/priv/host_s390_isel.c (+5 -5)
===================================================================
--- trunk/priv/host_s390_isel.c 2012-06-01 17:09:50 +01:00 (rev 2362)
+++ trunk/priv/host_s390_isel.c 2012-06-01 21:41:24 +01:00 (rev 2363)
@@ -1760,13 +1760,13 @@
s390_bfp_triop_t bfpop;
s390_round_t rounding_mode;
- op1 = s390_isel_float_expr(env, expr->Iex.Qop.arg2);
- op2 = s390_isel_float_expr(env, expr->Iex.Qop.arg3);
- op3 = s390_isel_float_expr(env, expr->Iex.Qop.arg4);
+ op1 = s390_isel_float_expr(env, expr->Iex.Qop.details->arg2);
+ op2 = s390_isel_float_expr(env, expr->Iex.Qop.details->arg3);
+ op3 = s390_isel_float_expr(env, expr->Iex.Qop.details->arg4);
dst = newVRegF(env);
addInstr(env, s390_insn_move(size, dst, op1));
- switch (expr->Iex.Qop.op) {
+ switch (expr->Iex.Qop.details->op) {
case Iop_MAddF32:
case Iop_MAddF64: bfpop = S390_BFP_MADD; break;
case Iop_MSubF32:
@@ -1776,7 +1776,7 @@
goto irreducible;
}
- rounding_mode = decode_rounding_mode(expr->Iex.Qop.arg1);
+ rounding_mode = decode_rounding_mode(expr->Iex.Qop.details->arg1);
addInstr(env, s390_insn_bfp_triop(size, bfpop, dst, op2, op3,
rounding_mode));
return dst;
Modified: trunk/priv/ir_defs.c (+51 -39)
===================================================================
--- trunk/priv/ir_defs.c 2012-06-01 17:09:50 +01:00 (rev 2362)
+++ trunk/priv/ir_defs.c 2012-06-01 21:41:24 +01:00 (rev 2363)
@@ -1017,18 +1017,20 @@
case Iex_RdTmp:
ppIRTemp(e->Iex.RdTmp.tmp);
break;
- case Iex_Qop:
- ppIROp(e->Iex.Qop.op);
+ case Iex_Qop: {
+ IRQop *qop = e->Iex.Qop.details;
+ ppIROp(qop->op);
vex_printf( "(" );
- ppIRExpr(e->Iex.Qop.arg1);
+ ppIRExpr(qop->arg1);
vex_printf( "," );
- ppIRExpr(e->Iex.Qop.arg2);
+ ppIRExpr(qop->arg2);
vex_printf( "," );
- ppIRExpr(e->Iex.Qop.arg3);
+ ppIRExpr(qop->arg3);
vex_printf( "," );
- ppIRExpr(e->Iex.Qop.arg4);
+ ppIRExpr(qop->arg4);
vex_printf( ")" );
break;
+ }
case Iex_Triop:
ppIROp(e->Iex.Triop.op);
vex_printf( "(" );
@@ -1475,12 +1477,14 @@
IRExpr* IRExpr_Qop ( IROp op, IRExpr* arg1, IRExpr* arg2,
IRExpr* arg3, IRExpr* arg4 ) {
IRExpr* e = LibVEX_Alloc(sizeof(IRExpr));
+ IRQop* qop = LibVEX_Alloc(sizeof(IRQop));
+ qop->op = op;
+ qop->arg1 = arg1;
+ qop->arg2 = arg2;
+ qop->arg3 = arg3;
+ qop->arg4 = arg4;
e->tag = Iex_Qop;
- e->Iex.Qop.op = op;
- e->Iex.Qop.arg1 = arg1;
- e->Iex.Qop.arg2 = arg2;
- e->Iex.Qop.arg3 = arg3;
- e->Iex.Qop.arg4 = arg4;
+ e->Iex.Qop.details = qop;
return e;
}
IRExpr* IRExpr_Triop ( IROp op, IRExpr* arg1,
@@ -1884,12 +1888,15 @@
e->Iex.GetI.bias);
case Iex_RdTmp:
return IRExpr_RdTmp(e->Iex.RdTmp.tmp);
- case Iex_Qop:
- return IRExpr_Qop(e->Iex.Qop.op,
- deepCopyIRExpr(e->Iex.Qop.arg1),
- deepCopyIRExpr(e->Iex.Qop.arg2),
- deepCopyIRExpr(e->Iex.Qop.arg3),
- deepCopyIRExpr(e->Iex.Qop.arg4));
+ case Iex_Qop: {
+ IRQop* qop = e->Iex.Qop.details;
+
+ return IRExpr_Qop(qop->op,
+ deepCopyIRExpr(qop->arg1),
+ deepCopyIRExpr(qop->arg2),
+ deepCopyIRExpr(qop->arg3),
+ deepCopyIRExpr(qop->arg4));
+ }
case Iex_Triop:
return IRExpr_Triop(e->Iex.Triop.op,
deepCopyIRExpr(e->Iex.Triop.arg1),
@@ -2870,7 +2877,7 @@
case Iex_Const:
return typeOfIRConst(e->Iex.Const.con);
case Iex_Qop:
- typeOfPrimop(e->Iex.Qop.op,
+ typeOfPrimop(e->Iex.Qop.details->op,
&t_dst, &t_arg1, &t_arg2, &t_arg3, &t_arg4);
return t_dst;
case Iex_Triop:
@@ -2937,6 +2944,7 @@
IRDirty* di;
IRCAS* cas;
IRPutI* puti;
+ IRQop* qop;
switch (st->tag) {
case Ist_AbiHint:
@@ -2958,11 +2966,12 @@
case Iex_Get: return True;
case Iex_GetI: return isIRAtom(e->Iex.GetI.ix);
case Iex_RdTmp: return True;
- case Iex_Qop: return toBool(
- isIRAtom(e->Iex.Qop.arg1)
- && isIRAtom(e->Iex.Qop.arg2)
- && isIRAtom(e->Iex.Qop.arg3)
- && isIRAtom(e->Iex.Qop.arg4));
+ case Iex_Qop: qop = e->Iex.Qop.details;
+ return toBool(
+ isIRAtom(qop->arg1)
+ && isIRAtom(qop->arg2)
+ && isIRAtom(qop->arg3)
+ && isIRAtom(qop->arg4));
case Iex_Triop: return toBool(
isIRAtom(e->Iex.Triop.arg1)
&& isIRAtom(e->Iex.Triop.arg2)
@@ -3116,12 +3125,14 @@
case Iex_RdTmp:
useBeforeDef_Temp(bb,stmt,expr->Iex.RdTmp.tmp,def_counts);
break;
- case Iex_Qop:
- useBeforeDef_Expr(bb,stmt,expr->Iex.Qop.arg1,def_counts);
- useBeforeDef_Expr(bb,stmt,expr->Iex.Qop.arg2,def_counts);
- useBeforeDef_Expr(bb,stmt,expr->Iex.Qop.arg3,def_counts);
- useBeforeDef_Expr(bb,stmt,expr->Iex.Qop.arg4,def_counts);
+ case Iex_Qop: {
+ IRQop* qop = expr->Iex.Qop.details;
+ useBeforeDef_Expr(bb,stmt,qop->arg1,def_counts);
+ useBeforeDef_Expr(bb,stmt,qop->arg2,def_counts);
+ useBeforeDef_Expr(bb,stmt,qop->arg3,def_counts);
+ useBeforeDef_Expr(bb,stmt,qop->arg4,def_counts);
break;
+ }
case Iex_Triop:
useBeforeDef_Expr(bb,stmt,expr->Iex.Triop.arg1,def_counts);
useBeforeDef_Expr(bb,stmt,expr->Iex.Triop.arg2,def_counts);
@@ -3234,29 +3245,30 @@
break;
case Iex_Qop: {
IRType ttarg1, ttarg2, ttarg3, ttarg4;
- tcExpr(bb,stmt, expr->Iex.Qop.arg1, gWordTy );
- tcExpr(bb,stmt, expr->Iex.Qop.arg2, gWordTy );
- tcExpr(bb,stmt, expr->Iex.Qop.arg3, gWordTy );
- tcExpr(bb,stmt, expr->Iex.Qop.arg4, gWordTy );
- typeOfPrimop(expr->Iex.Qop.op,
+ IRQop* qop = expr->Iex.Qop.details;
+ tcExpr(bb,stmt, qop->arg1, gWordTy );
+ tcExpr(bb,stmt, qop->arg2, gWordTy );
+ tcExpr(bb,stmt, qop->arg3, gWordTy );
+ tcExpr(bb,stmt, qop->arg4, gWordTy );
+ typeOfPrimop(qop->op,
&t_dst, &t_arg1, &t_arg2, &t_arg3, &t_arg4);
if (t_arg1 == Ity_INVALID || t_arg2 == Ity_INVALID
|| t_arg3 == Ity_INVALID || t_arg4 == Ity_INVALID) {
vex_printf(" op name: " );
- ppIROp(expr->Iex.Qop.op);
+ ppIROp(qop->op);
vex_printf("\n");
sanityCheckFail(bb,stmt,
"Iex.Qop: wrong arity op\n"
"... name of op precedes BB printout\n");
}
- ttarg1 = typeOfIRExpr(tyenv, expr->Iex.Qop.arg1);
- ttarg2 = typeOfIRExpr(tyenv, expr->Iex.Qop.arg2);
- ttarg3 = typeOfIRExpr(tyenv, expr->Iex.Qop.arg3);
- ttarg4 = typeOfIRExpr(tyenv, expr->Iex.Qop.arg4);
+ ttarg1 = typeOfIRExpr(tyenv, qop->arg1);
+ ttarg2 = typeOfIRExpr(tyenv, qop->arg2);
+ ttarg3 = typeOfIRExpr(tyenv, qop->arg3);
+ ttarg4 = typeOfIRExpr(tyenv, qop->arg4);
if (t_arg1 != ttarg1 || t_arg2 != ttarg2
|| t_arg3 != ttarg3 || t_arg4 != ttarg4) {
vex_printf(" op name: ");
- ppIROp(expr->Iex.Qop.op);
+ ppIROp(qop->op);
vex_printf("\n");
vex_printf(" op type is (");
ppIRType(t_arg1);
Modified: trunk/pub/libvex_ir.h (+13 -5)
===================================================================
--- trunk/pub/libvex_ir.h 2012-06-01 17:09:50 +01:00 (rev 2362)
+++ trunk/pub/libvex_ir.h 2012-06-01 21:41:24 +01:00 (rev 2363)
@@ -1477,6 +1477,9 @@
/* ------------------ Expressions ------------------ */
+typedef struct _IRQop IRQop; /* forward declaration */
+
+
/* The different kinds of expressions. Their meaning is explained below
in the comments for IRExpr. */
typedef
@@ -1580,11 +1583,7 @@
eg. MAddF64r32(t1, t2, t3, t4)
*/
struct {
- IROp op; /* op-code */
- IRExpr* arg1; /* operand 1 */
- IRExpr* arg2; /* operand 2 */
- IRExpr* arg3; /* operand 3 */
- IRExpr* arg4; /* operand 4 */
+ IRQop* details;
} Qop;
/* A ternary operation.
@@ -1697,6 +1696,15 @@
} Iex;
};
+/* ------------------ A quarternary expression ------------------ */
+struct _IRQop {
+ IROp op; /* op-code */
+ IRExpr* arg1; /* operand 1 */
+ IRExpr* arg2; /* operand 2 */
+ IRExpr* arg3; /* operand 3 */
+ IRExpr* arg4; /* operand 4 */
+};
+
/* Expression constructors. */
extern IRExpr* IRExpr_Binder ( Int binder );
extern IRExpr* IRExpr_Get ( Int off, IRType ty );
Modified: trunk/priv/main_main.c (+2 -2)
===================================================================
--- trunk/priv/main_main.c 2012-06-01 17:09:50 +01:00 (rev 2362)
+++ trunk/priv/main_main.c 2012-06-01 21:41:24 +01:00 (rev 2363)
@@ -159,11 +159,11 @@
/* These take a lot of space, so make sure we don't have
any unnoticed size regressions. */
if (VEX_HOST_WORDSIZE == 4) {
- vassert(sizeof(IRExpr) == 24);
+ vassert(sizeof(IRExpr) == 20);
vassert(sizeof(IRStmt) == 20 /* x86 */
|| sizeof(IRStmt) == 24 /* arm */);
} else {
- vassert(sizeof(IRExpr) == 48);
+ vassert(sizeof(IRExpr) == 40);
vassert(sizeof(IRStmt) == 32);
}
Modified: trunk/priv/host_amd64_isel.c (+5 -5)
===================================================================
--- trunk/priv/host_amd64_isel.c 2012-06-01 17:09:50 +01:00 (rev 2362)
+++ trunk/priv/host_amd64_isel.c 2012-06-01 21:41:24 +01:00 (rev 2363)
@@ -3419,7 +3419,7 @@
return;
}
- if (e->tag == Iex_Qop && e->Iex.Qop.op == Iop_64x4toV256) {
+ if (e->tag == Iex_Qop && e->Iex.Qop.details->op == Iop_64x4toV256) {
HReg rsp = hregAMD64_RSP();
HReg vHi = newVRegV(env);
HReg vLo = newVRegV(env);
@@ -3427,10 +3427,10 @@
AMD64AMode* m16_rsp = AMD64AMode_IR(-16, rsp);
/* arg1 is the most significant (Q3), arg4 the least (Q0) */
/* Get all the args into regs, before messing with the stack. */
- AMD64RI* q3 = iselIntExpr_RI(env, e->Iex.Qop.arg1);
- AMD64RI* q2 = iselIntExpr_RI(env, e->Iex.Qop.arg2);
- AMD64RI* q1 = iselIntExpr_RI(env, e->Iex.Qop.arg3);
- AMD64RI* q0 = iselIntExpr_RI(env, e->Iex.Qop.arg4);
+ AMD64RI* q3 = iselIntExpr_RI(env, e->Iex.Qop.details->arg1);
+ AMD64RI* q2 = iselIntExpr_RI(env, e->Iex.Qop.details->arg2);
+ AMD64RI* q1 = iselIntExpr_RI(env, e->Iex.Qop.details->arg3);
+ AMD64RI* q0 = iselIntExpr_RI(env, e->Iex.Qop.details->arg4);
/* less significant lane (Q2) at the lower address (-16(rsp)) */
addInstr(env, AMD64Instr_Alu64M(Aalu_MOV, q3, m8_rsp));
addInstr(env, AMD64Instr_Alu64M(Aalu_MOV, q2, m16_rsp));
Modified: trunk/priv/host_ppc_isel.c (+5 -5)
===================================================================
--- trunk/priv/host_ppc_isel.c 2012-06-01 17:09:50 +01:00 (rev 2362)
+++ trunk/priv/host_ppc_isel.c 2012-06-01 21:41:24 +01:00 (rev 2363)
@@ -3445,7 +3445,7 @@
/* --------- OPS --------- */
if (e->tag == Iex_Qop) {
PPCFpOp fpop = Pfp_INVALID;
- switch (e->Iex.Qop.op) {
+ switch (e->Iex.Qop.details->op) {
case Iop_MAddF64: fpop = Pfp_MADDD; break;
case Iop_MAddF64r32: fpop = Pfp_MADDS; break;
case Iop_MSubF64: fpop = Pfp_MSUBD; break;
@@ -3454,10 +3454,10 @@
}
if (fpop != Pfp_INVALID) {
HReg r_dst = newVRegF(env);
- HReg r_srcML = iselDblExpr(env, e->Iex.Qop.arg2);
- HReg r_srcMR = iselDblExpr(env, e->Iex.Qop.arg3);
- HReg r_srcAcc = iselDblExpr(env, e->Iex.Qop.arg4);
- set_FPU_rounding_mode( env, e->Iex.Qop.arg1 );
+ HReg r_srcML = iselDblExpr(env, e->Iex.Qop.details->arg2);
+ HReg r_srcMR = iselDblExpr(env, e->Iex.Qop.details->arg3);
+ HReg r_srcAcc = iselDblExpr(env, e->Iex.Qop.details->arg4);
+ set_FPU_rounding_mode( env, e->Iex.Qop.details->arg1 );
addInstr(env, PPCInstr_FpMulAcc(fpop, r_dst,
r_srcML, r_srcMR, r_srcAcc));
return r_dst;
|