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.


git-svn-id: svn://svn.valgrind.org/vex/trunk@2328 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/guest_s390_toIR.c b/priv/guest_s390_toIR.c
index ed5d4dc..4cc4a15 100644
--- a/priv/guest_s390_toIR.c
+++ b/priv/guest_s390_toIR.c
@@ -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));