Minor refactoring to avoid special handling of emulation
failures in s390_irgen_PFPO.
git-svn-id: svn://svn.valgrind.org/vex/trunk@2948 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/guest_s390_toIR.c b/priv/guest_s390_toIR.c
index 1f6bc6b..2bcbf34 100644
--- a/priv/guest_s390_toIR.c
+++ b/priv/guest_s390_toIR.c
@@ -482,20 +482,36 @@
/* Terminate the current IRSB with an emulation failure. */
static void
-emulation_failure(VexEmNote fail_kind)
+emulation_failure_with_expr(IRExpr *emfailure)
{
- stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_EMNOTE), mkU32(fail_kind)));
+ vassert(typeOfIRExpr(irsb->tyenv, emfailure) == Ity_I32);
+
+ stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_EMNOTE), emfailure));
dis_res->whatNext = Dis_StopHere;
dis_res->jk_StopHere = Ijk_EmFail;
}
+static void
+emulation_failure(VexEmNote fail_kind)
+{
+ emulation_failure_with_expr(mkU32(fail_kind));
+}
+
/* Terminate the current IRSB with an emulation warning. */
static void
+emulation_warning_with_expr(IRExpr *emwarning)
+{
+ vassert(typeOfIRExpr(irsb->tyenv, emwarning) == Ity_I32);
+
+ stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_EMNOTE), emwarning));
+ dis_res->whatNext = Dis_StopHere;
+ dis_res->jk_StopHere = Ijk_EmWarn;
+}
+
+static void
emulation_warning(VexEmNote warn_kind)
{
- stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_EMNOTE), mkU32(warn_kind)));
- dis_res->whatNext = Dis_StopHere;
- dis_res->jk_StopHere = Ijk_EmWarn;
+ emulation_warning_with_expr(mkU32(warn_kind));
}
/*------------------------------------------------------------*/
@@ -7262,12 +7278,7 @@
/* Check validity of function code in GR 0 */
assign(ef, s390_call_pfpo_helper(unop(Iop_32Uto64, mkexpr(gr0))));
-
- /* fixs390: Function emulation_failure can be used if it takes argument as
- IRExpr * instead of VexEmNote. */
- stmt(IRStmt_Put(S390X_GUEST_OFFSET(guest_EMNOTE), mkexpr(ef)));
- dis_res->whatNext = Dis_StopHere;
- dis_res->jk_StopHere = Ijk_EmFail;
+ emulation_failure_with_expr(mkexpr(ef));
stmt(
IRStmt_Exit(