More refactoring to avoid code duplication (irgen_CLC/CLC_EX and
irgen_MVC/MVC_EX)
git-svn-id: svn://svn.valgrind.org/vex/trunk@2321 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/guest_s390_toIR.c b/priv/guest_s390_toIR.c
index a741c64..01d8b3e 100644
--- a/priv/guest_s390_toIR.c
+++ b/priv/guest_s390_toIR.c
@@ -49,6 +49,7 @@
/*------------------------------------------------------------*/
static UInt s390_decode_and_irgen(UChar *, UInt, DisResult *);
static void s390_irgen_xonc(IROp, IRTemp, IRTemp, IRTemp);
+static void s390_irgen_CLC_EX(IRTemp, IRTemp, IRTemp);
/*------------------------------------------------------------*/
@@ -8589,29 +8590,10 @@
static HChar *
s390_irgen_CLC(UChar length, IRTemp start1, IRTemp start2)
{
- IRTemp current1 = newTemp(Ity_I8);
- IRTemp current2 = newTemp(Ity_I8);
- IRTemp counter = newTemp(Ity_I64);
+ IRTemp len = newTemp(Ity_I64);
- assign(counter, get_counter_dw0());
- put_counter_dw0(mkU64(0));
-
- assign(current1, load(Ity_I8, binop(Iop_Add64, mkexpr(start1),
- mkexpr(counter))));
- assign(current2, load(Ity_I8, binop(Iop_Add64, mkexpr(start2),
- mkexpr(counter))));
- s390_cc_thunk_put2(S390_CC_OP_UNSIGNED_COMPARE, current1, current2,
- False);
-
- /* Both fields differ ? */
- if_condition_goto(binop(Iop_CmpNE8, mkexpr(current1), mkexpr(current2)),
- guest_IA_next_instr);
-
- /* Check for end of field */
- put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
- if_condition_goto(binop(Iop_CmpNE64, mkexpr(counter), mkU64(length)),
- guest_IA_curr_instr);
- put_counter_dw0(mkU64(0));
+ assign(len, mkU64(length));
+ s390_irgen_CLC_EX(len, start1, start2);
dummy_put_IA();
return "clc";
@@ -9340,7 +9322,6 @@
s390_cc_thunk_put1(S390_CC_OP_BITWISE, mktemp(Ity_I32, get_counter_w1()),
False);
put_counter_dw0(mkU64(0));
- dummy_put_IA();
}
static HChar *
@@ -9350,6 +9331,7 @@
assign(len, mkU32(length));
s390_irgen_xonc(Iop_Xor8, len, start1, start2);
+ dummy_put_IA();
return "xc";
}
@@ -9401,6 +9383,7 @@
assign(len, mkU32(length));
s390_irgen_xonc(Iop_And8, len, start1, start2);
+ dummy_put_IA();
return "nc";
}
@@ -9412,6 +9395,7 @@
assign(len, mkU32(length));
s390_irgen_xonc(Iop_Or8, len, start1, start2);
+ dummy_put_IA();
return "oc";
}
@@ -9420,18 +9404,10 @@
static HChar *
s390_irgen_MVC(UChar length, IRTemp start1, IRTemp start2)
{
- IRTemp counter = newTemp(Ity_I64);
+ IRTemp len = newTemp(Ity_I64);
- assign(counter, get_counter_dw0());
-
- store(binop(Iop_Add64, mkexpr(start1), mkexpr(counter)),
- load(Ity_I8, binop(Iop_Add64, mkexpr(start2), mkexpr(counter))));
-
- /* Check for end of field */
- put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
- if_condition_goto(binop(Iop_CmpNE64, mkexpr(counter), mkU64(length)),
- guest_IA_curr_instr);
- put_counter_dw0(mkU64(0));
+ assign(len, mkU64(length));
+ s390_irgen_MVC_EX(len, start1, start2);
dummy_put_IA();
return "mvc";