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;