Generalise S390_INSN_GZERO which only worked on the guest
state to S390_INSN_MZERO which works for any memory location
addressable with base reg + 12-bit displacement.
git-svn-id: svn://svn.valgrind.org/vex/trunk@2587 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/host_s390_isel.c b/priv/host_s390_isel.c
index f5010a4..0289baf 100644
--- a/priv/host_s390_isel.c
+++ b/priv/host_s390_isel.c
@@ -2564,6 +2564,11 @@
case Ity_I16:
case Ity_I32:
case Ity_I64:
+ if (am->tag == S390_AMODE_B12 &&
+ s390_expr_is_const_zero(stmt->Ist.Store.data)) {
+ addInstr(env, s390_insn_mzero(sizeofIRType(tyd), am));
+ return;
+ }
src = s390_isel_int_expr(env, stmt->Ist.Store.data);
break;
@@ -2649,7 +2654,8 @@
/* guest register = 0 */
if (new_value == 0) {
- addInstr(env, s390_insn_gzero(sizeofIRType(tyd), offset));
+ am = s390_amode_for_guest_state(offset);
+ addInstr(env, s390_insn_mzero(sizeofIRType(tyd), am));
return;
}
@@ -2689,6 +2695,11 @@
case Ity_I16:
case Ity_I32:
case Ity_I64:
+ if (am->tag == S390_AMODE_B12 &&
+ s390_expr_is_const_zero(stmt->Ist.Put.data)) {
+ addInstr(env, s390_insn_mzero(sizeofIRType(tyd), am));
+ return;
+ }
src = s390_isel_int_expr(env, stmt->Ist.Put.data);
break;