|
From: <sv...@va...> - 2012-05-12 15:26:52
|
florian 2012-05-12 16:26:44 +0100 (Sat, 12 May 2012)
New Revision: 2328
Log:
Eliminate helper s390_calculate_icc. Rewrite and factor the code to use
s390_calculate_cond instead. The benefit is that the latter has comprehensive
spec_helpers whereas the former had not.
Modified files:
trunk/priv/guest_s390_defs.h
trunk/priv/guest_s390_helpers.c
trunk/priv/guest_s390_toIR.c
Modified: trunk/priv/guest_s390_toIR.c (+55 -93)
===================================================================
--- trunk/priv/guest_s390_toIR.c 2012-05-12 04:44:49 +01:00 (rev 2327)
+++ trunk/priv/guest_s390_toIR.c 2012-05-12 16:26:44 +01:00 (rev 2328)
@@ -630,21 +630,35 @@
/* Build IR to calculate the internal condition code for a "compare and branch"
insn. Returns an expression of type Ity_I32 */
static IRExpr *
-s390_call_calculate_icc(UInt opc, IRTemp op1, IRTemp op2, Bool sign_extend)
+s390_call_calculate_icc(UInt m, UInt opc, IRTemp op1, IRTemp op2)
{
- IRExpr **args, *call, *op, *dep1, *dep2;
+ IRExpr **args, *call, *op, *dep1, *dep2, *mask;
+ switch (opc) {
+ case S390_CC_OP_SIGNED_COMPARE:
+ dep1 = s390_cc_widen(op1, True);
+ dep2 = s390_cc_widen(op2, True);
+ break;
+
+ case S390_CC_OP_UNSIGNED_COMPARE:
+ dep1 = s390_cc_widen(op1, False);
+ dep2 = s390_cc_widen(op2, False);
+ break;
+
+ default:
+ vpanic("s390_call_calculate_icc");
+ }
+
+ mask = mkU64(m);
op = mkU64(opc);
- dep1 = s390_cc_widen(op1, sign_extend);
- dep2 = s390_cc_widen(op2, sign_extend);
- args = mkIRExprVec_3(op, dep1, dep2);
+ args = mkIRExprVec_5(mask, op, dep1, dep2, mkU64(0) /* unused */);
call = mkIRExprCCall(Ity_I32, 0 /*regparm*/,
- "s390_calculate_icc", &s390_calculate_icc, args);
+ "s390_calculate_cond", &s390_calculate_cond, args);
- /* Exclude OP from definedness checking. We're only
- interested in DEP1 and DEP2. */
- call->Iex.CCall.cee->mcx_mask = (1<<0);
+ /* Exclude the requested condition, OP and NDEP from definedness
+ checking. We're only interested in DEP1 and DEP2. */
+ call->Iex.CCall.cee->mcx_mask = (1<<0) | (1<<1) | (1<<4);
return call;
}
@@ -683,10 +697,6 @@
s390_cc_thunk_put3(op,dep1,dep2,ndep,False)
#define s390_cc_thunk_putSSS(op,dep1,dep2,ndep) \
s390_cc_thunk_put3(op,dep1,dep2,ndep,True)
-#define s390_call_calculate_iccZZ(op,dep1,dep2) \
- s390_call_calculate_icc(op,dep1,dep2,False)
-#define s390_call_calculate_iccSS(op,dep1,dep2) \
- s390_call_calculate_icc(op,dep1,dep2,True)
@@ -3584,7 +3594,6 @@
{
IRTemp op1 = newTemp(Ity_I32);
IRTemp op2 = newTemp(Ity_I32);
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -3594,10 +3603,8 @@
} else {
assign(op1, get_gpr_w1(r1));
assign(op2, get_gpr_w1(r2));
- assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
- op2));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
+ op1, op2));
if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
mkU32(0)), mkexpr(op4addr));
}
@@ -3611,7 +3618,6 @@
{
IRTemp op1 = newTemp(Ity_I64);
IRTemp op2 = newTemp(Ity_I64);
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -3621,10 +3627,8 @@
} else {
assign(op1, get_gpr_dw0(r1));
assign(op2, get_gpr_dw0(r2));
- assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
- op2));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
+ op1, op2));
if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
mkU32(0)), mkexpr(op4addr));
}
@@ -3638,7 +3642,6 @@
{
IRTemp op1 = newTemp(Ity_I32);
IRTemp op2 = newTemp(Ity_I32);
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -3649,10 +3652,8 @@
} else {
assign(op1, get_gpr_w1(r1));
assign(op2, get_gpr_w1(r2));
- assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
- op2));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
+ op1, op2));
if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
@@ -3667,7 +3668,6 @@
{
IRTemp op1 = newTemp(Ity_I64);
IRTemp op2 = newTemp(Ity_I64);
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -3678,10 +3678,8 @@
} else {
assign(op1, get_gpr_dw0(r1));
assign(op2, get_gpr_dw0(r2));
- assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
- op2));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE,
+ op1, op2));
if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
@@ -3696,7 +3694,6 @@
{
IRTemp op1 = newTemp(Ity_I32);
Int op2;
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -3706,10 +3703,8 @@
} else {
assign(op1, get_gpr_w1(r1));
op2 = (Int)(Char)i2;
- assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
- mktemp(Ity_I32, mkU32((UInt)op2))));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
+ mktemp(Ity_I32, mkU32((UInt)op2))));
if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
mkU32(0)), mkexpr(op4addr));
}
@@ -3723,7 +3718,6 @@
{
IRTemp op1 = newTemp(Ity_I64);
Long op2;
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -3733,10 +3727,8 @@
} else {
assign(op1, get_gpr_dw0(r1));
op2 = (Long)(Char)i2;
- assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
- mktemp(Ity_I64, mkU64((ULong)op2))));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
+ mktemp(Ity_I64, mkU64((ULong)op2))));
if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
mkU32(0)), mkexpr(op4addr));
}
@@ -3750,7 +3742,6 @@
{
IRTemp op1 = newTemp(Ity_I32);
Int op2;
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -3760,10 +3751,8 @@
} else {
assign(op1, get_gpr_w1(r1));
op2 = (Int)(Char)i2;
- assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
- mktemp(Ity_I32, mkU32((UInt)op2))));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
+ mktemp(Ity_I32, mkU32((UInt)op2))));
if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
@@ -3778,7 +3767,6 @@
{
IRTemp op1 = newTemp(Ity_I64);
Long op2;
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -3788,10 +3776,8 @@
} else {
assign(op1, get_gpr_dw0(r1));
op2 = (Long)(Char)i2;
- assign(icc, s390_call_calculate_iccSS(S390_CC_OP_SIGNED_COMPARE, op1,
- mktemp(Ity_I64, mkU64((ULong)op2))));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_SIGNED_COMPARE, op1,
+ mktemp(Ity_I64, mkU64((ULong)op2))));
if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
@@ -4255,7 +4241,6 @@
{
IRTemp op1 = newTemp(Ity_I32);
IRTemp op2 = newTemp(Ity_I32);
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -4265,10 +4250,8 @@
} else {
assign(op1, get_gpr_w1(r1));
assign(op2, get_gpr_w1(r2));
- assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
- op2));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
+ op1, op2));
if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
mkU32(0)), mkexpr(op4addr));
}
@@ -4282,7 +4265,6 @@
{
IRTemp op1 = newTemp(Ity_I64);
IRTemp op2 = newTemp(Ity_I64);
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -4292,10 +4274,8 @@
} else {
assign(op1, get_gpr_dw0(r1));
assign(op2, get_gpr_dw0(r2));
- assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
- op2));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
+ op1, op2));
if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
mkU32(0)), mkexpr(op4addr));
}
@@ -4309,7 +4289,6 @@
{
IRTemp op1 = newTemp(Ity_I32);
IRTemp op2 = newTemp(Ity_I32);
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -4319,10 +4298,8 @@
} else {
assign(op1, get_gpr_w1(r1));
assign(op2, get_gpr_w1(r2));
- assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
- op2));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
+ op1, op2));
if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
@@ -4337,7 +4314,6 @@
{
IRTemp op1 = newTemp(Ity_I64);
IRTemp op2 = newTemp(Ity_I64);
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -4347,10 +4323,8 @@
} else {
assign(op1, get_gpr_dw0(r1));
assign(op2, get_gpr_dw0(r2));
- assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
- op2));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE,
+ op1, op2));
if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
@@ -4365,7 +4339,6 @@
{
IRTemp op1 = newTemp(Ity_I32);
UInt op2;
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -4375,10 +4348,8 @@
} else {
assign(op1, get_gpr_w1(r1));
op2 = (UInt)i2;
- assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
- mktemp(Ity_I32, mkU32(op2))));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
+ mktemp(Ity_I32, mkU32(op2))));
if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
mkU32(0)), mkexpr(op4addr));
}
@@ -4392,7 +4363,6 @@
{
IRTemp op1 = newTemp(Ity_I64);
ULong op2;
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -4402,10 +4372,8 @@
} else {
assign(op1, get_gpr_dw0(r1));
op2 = (ULong)i2;
- assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
- mktemp(Ity_I64, mkU64(op2))));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
+ mktemp(Ity_I64, mkU64(op2))));
if_not_condition_goto_computed(binop(Iop_CmpEQ32, mkexpr(cond),
mkU32(0)), mkexpr(op4addr));
}
@@ -4419,7 +4387,6 @@
{
IRTemp op1 = newTemp(Ity_I32);
UInt op2;
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -4429,10 +4396,8 @@
} else {
assign(op1, get_gpr_w1(r1));
op2 = (UInt)i2;
- assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
- mktemp(Ity_I32, mkU32(op2))));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
+ mktemp(Ity_I32, mkU32(op2))));
if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
@@ -4447,7 +4412,6 @@
{
IRTemp op1 = newTemp(Ity_I64);
ULong op2;
- IRTemp icc = newTemp(Ity_I32);
IRTemp cond = newTemp(Ity_I32);
if (m3 == 0) {
@@ -4457,10 +4421,8 @@
} else {
assign(op1, get_gpr_dw0(r1));
op2 = (ULong)i2;
- assign(icc, s390_call_calculate_iccZZ(S390_CC_OP_UNSIGNED_COMPARE, op1,
- mktemp(Ity_I64, mkU64(op2))));
- assign(cond, binop(Iop_And32, binop(Iop_Shl32, mkU32(m3),
- unop(Iop_32to8, mkexpr(icc))), mkU32(8)));
+ assign(cond, s390_call_calculate_icc(m3, S390_CC_OP_UNSIGNED_COMPARE, op1,
+ mktemp(Ity_I64, mkU64(op2))));
if_condition_goto(binop(Iop_CmpNE32, mkexpr(cond), mkU32(0)),
guest_IA_curr_instr + ((ULong)(Long)(Short)i4 << 1));
Modified: trunk/priv/guest_s390_helpers.c (+0 -7)
===================================================================
--- trunk/priv/guest_s390_helpers.c 2012-05-12 04:44:49 +01:00 (rev 2327)
+++ trunk/priv/guest_s390_helpers.c 2012-05-12 16:26:44 +01:00 (rev 2328)
@@ -656,13 +656,6 @@
}
-UInt
-s390_calculate_icc(ULong op, ULong dep1, ULong dep2)
-{
- return s390_calculate_cc(op, dep1, dep2, 0 /* unused */);
-}
-
-
/* Note that this does *not* return a Boolean value. The result needs to be
explicitly tested against zero. */
UInt
Modified: trunk/priv/guest_s390_defs.h (+0 -1)
===================================================================
--- trunk/priv/guest_s390_defs.h 2012-05-12 04:44:49 +01:00 (rev 2327)
+++ trunk/priv/guest_s390_defs.h 2012-05-12 16:26:44 +01:00 (rev 2328)
@@ -177,7 +177,6 @@
/*------------------------------------------------------------*/
UInt s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2,
ULong cc_ndep);
-UInt s390_calculate_icc(ULong op, ULong dep1, ULong dep2);
UInt s390_calculate_cond(ULong mask, ULong op, ULong dep1, ULong dep2,
ULong ndep);
|