]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Generalise S390_INSN_GZERO which only worked on the guest
authorFlorian Krohm <florian@eich-krohm.de>
Tue, 11 Dec 2012 04:09:43 +0000 (04:09 +0000)
committerFlorian Krohm <florian@eich-krohm.de>
Tue, 11 Dec 2012 04:09:43 +0000 (04:09 +0000)
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

VEX/priv/host_s390_defs.c
VEX/priv/host_s390_defs.h
VEX/priv/host_s390_isel.c

index ef790955f6b77ffbe589ec5f01f8f5d05c97fa4b..91a201f39e9838fb4a4c9c638936dc9899d59418 100644 (file)
@@ -714,8 +714,11 @@ s390_insn_get_reg_usage(HRegUsage *u, const s390_insn *insn)
       }
       break;
 
+   case S390_INSN_MZERO:
+      s390_amode_get_reg_usage(u, insn->variant.mzero.dst);
+      break;
+
    case S390_INSN_MFENCE:
-   case S390_INSN_GZERO:
    case S390_INSN_GADD:
       break;
 
@@ -963,8 +966,11 @@ s390_insn_map_regs(HRegRemap *m, s390_insn *insn)
       }
       break;
 
+   case S390_INSN_MZERO:
+      s390_amode_map_regs(m, insn->variant.mzero.dst);
+      break;
+
    case S390_INSN_MFENCE:
-   case S390_INSN_GZERO:
    case S390_INSN_GADD:
       break;
 
@@ -5078,13 +5084,17 @@ s390_insn_mfence(void)
 
 
 s390_insn *
-s390_insn_gzero(UChar size, UInt offset)
+s390_insn_mzero(UChar size, s390_amode *dst)
 {
    s390_insn *insn = LibVEX_Alloc(sizeof(s390_insn));
 
-   insn->tag  = S390_INSN_GZERO;
+   /* This insn will be mapped to an XC so we can only allow base register
+      plus 12-bit displacement */
+   vassert(dst->tag == S390_AMODE_B12);
+
+   insn->tag  = S390_INSN_MZERO;
    insn->size = size;
-   insn->variant.gzero.offset = offset;
+   insn->variant.mzero.dst = dst;
 
    return insn;
 }
@@ -5643,8 +5653,8 @@ s390_insn_as_string(const s390_insn *insn)
       s390_sprintf(buf, "%M", "v-mfence");
       return buf;   /* avoid printing "size = ..." which is meaningless */
 
-   case S390_INSN_GZERO:
-      s390_sprintf(buf, "%M %G", "v-gzero", insn->variant.gzero.offset);
+   case S390_INSN_MZERO:
+      s390_sprintf(buf, "%M %A", "v-mzero", insn->variant.mzero.dst);
       break;
 
    case S390_INSN_GADD:
@@ -7788,11 +7798,11 @@ s390_insn_mfence_emit(UChar *buf, const s390_insn *insn)
 
 
 static UChar *
-s390_insn_gzero_emit(UChar *buf, const s390_insn *insn)
+s390_insn_mzero_emit(UChar *buf, const s390_insn *insn)
 {
-   return s390_emit_XC(buf, insn->size - 1,
-                       S390_REGNO_GUEST_STATE_POINTER, insn->variant.gzero.offset,
-                       S390_REGNO_GUEST_STATE_POINTER, insn->variant.gzero.offset);
+   s390_amode *am = insn->variant.mzero.dst;
+
+   return s390_emit_XC(buf, insn->size - 1, am->b, am->d, am->b, am->d);
 }
 
 
@@ -8377,8 +8387,8 @@ emit_S390Instr(Bool *is_profinc, UChar *buf, Int nbuf, s390_insn *insn,
       end = s390_insn_mfence_emit(buf, insn);
       break;
 
-   case S390_INSN_GZERO:
-      end = s390_insn_gzero_emit(buf, insn);
+   case S390_INSN_MZERO:
+      end = s390_insn_mzero_emit(buf, insn);
       break;
 
    case S390_INSN_GADD:
index 2a24d5c5a372316bfb33a7c43ae01710fdae073c..2e93b2fd6a8ee3bc0414d985aebdd41445152706 100644 (file)
@@ -139,7 +139,7 @@ typedef enum {
    S390_INSN_BFP_CONVERT,
    S390_INSN_DFP_BINOP, /* Decimal floating point */
    S390_INSN_MFENCE,
-   S390_INSN_GZERO,   /* Assign zero to a guest register */
+   S390_INSN_MZERO,   /* Assign zero to a memory location */
    S390_INSN_GADD,    /* Add a value to a guest register */
    S390_INSN_SET_FPC_BFPRM, /* Set the bfp rounding mode in the FPC */
    S390_INSN_SET_FPC_DFPRM, /* Set the dfp rounding mode in the FPC */
@@ -510,8 +510,8 @@ typedef struct {
 
       /* Miscellaneous */
       struct {
-         UInt             offset;
-      } gzero;
+         s390_amode      *dst;
+      } mzero;
       struct {
          UInt             offset;
          UChar            delta;
@@ -616,7 +616,7 @@ s390_insn *s390_insn_dfp_binop(UChar size, s390_dfp_binop_t, HReg dst,
                                HReg op2, HReg op3,
                                s390_dfp_round_t rounding_mode);
 s390_insn *s390_insn_mfence(void);
-s390_insn *s390_insn_gzero(UChar size, UInt offset);
+s390_insn *s390_insn_mzero(UChar size, s390_amode *dst);
 s390_insn *s390_insn_gadd(UChar size, UInt offset, UChar delta, ULong value);
 s390_insn *s390_insn_set_fpc_bfprm(UChar size, HReg mode);
 s390_insn *s390_insn_set_fpc_dfprm(UChar size, HReg mode);
index f5010a4b1c777da8bbc37f76cd97054acb90bd32..0289baf9dc125f00f44d6e8909538d78f592a627 100644 (file)
@@ -2564,6 +2564,11 @@ s390_isel_stmt(ISelEnv *env, IRStmt *stmt)
       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 @@ s390_isel_stmt(ISelEnv *env, IRStmt *stmt)
 
       /* 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 @@ s390_isel_stmt(ISelEnv *env, IRStmt *stmt)
       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;