]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390.c (s390_expand_movmem): Issue prefetch instructions for z10.
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Thu, 8 Apr 2010 11:23:23 +0000 (11:23 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Thu, 8 Apr 2010 11:23:23 +0000 (11:23 +0000)
2010-04-08  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* config/s390/s390.c (s390_expand_movmem): Issue prefetch
instructions for z10.
(s390_expand_setmem): Likewise.
(s390_expand_cmpmem): Likewise.

From-SVN: r158116

gcc/ChangeLog
gcc/config/s390/s390.c

index c7d4ecbf02be48158be9518d6f4e3399c76ecf6d..6f4ef744d0ec381f2b2c5857c35a6fcf71bd9cbc 100644 (file)
@@ -1,3 +1,10 @@
+2010-04-08  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390.c (s390_expand_movmem): Issue prefetch
+       instructions for z10.
+       (s390_expand_setmem): Likewise.
+       (s390_expand_cmpmem): Likewise.
+
 2010-04-08  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/43679
index c2cf3d4a828d864192b3165097bbcd5cbf054ef6..05ad9f2382e4760ce2db6fc900f9aff6f79e5991 100644 (file)
@@ -3940,6 +3940,24 @@ s390_expand_movmem (rtx dst, rtx src, rtx len)
 
       emit_label (loop_start_label);
 
+      if (TARGET_Z10
+         && (GET_CODE (len) != CONST_INT || INTVAL (len) > 768))
+       {
+         rtx prefetch;
+
+         /* Issue a read prefetch for the +3 cache line.  */
+         prefetch = gen_prefetch (gen_rtx_PLUS (Pmode, src_addr, GEN_INT (768)),
+                                  const0_rtx, const0_rtx);
+         PREFETCH_SCHEDULE_BARRIER_P (prefetch) = true;
+         emit_insn (prefetch);
+
+         /* Issue a write prefetch for the +3 cache line.  */
+         prefetch = gen_prefetch (gen_rtx_PLUS (Pmode, dst_addr, GEN_INT (768)),
+                                  const1_rtx, const0_rtx);
+         PREFETCH_SCHEDULE_BARRIER_P (prefetch) = true;
+         emit_insn (prefetch);
+       }
+
       emit_insn (gen_movmem_short (dst, src, GEN_INT (255)));
       s390_load_address (dst_addr,
                         gen_rtx_PLUS (Pmode, dst_addr, GEN_INT (256)));
@@ -4060,6 +4078,17 @@ s390_expand_setmem (rtx dst, rtx len, rtx val)
 
       emit_label (loop_start_label);
 
+      if (TARGET_Z10
+         && (GET_CODE (len) != CONST_INT || INTVAL (len) > 1024))
+       {
+         /* Issue a write prefetch for the +4 cache line.  */
+         rtx prefetch = gen_prefetch (gen_rtx_PLUS (Pmode, dst_addr,
+                                                    GEN_INT (1024)),
+                                      const1_rtx, const0_rtx);
+         emit_insn (prefetch);
+         PREFETCH_SCHEDULE_BARRIER_P (prefetch) = true;
+       }
+
       if (val == const0_rtx)
        emit_insn (gen_clrmem_short (dst, GEN_INT (255)));
       else
@@ -4155,6 +4184,24 @@ s390_expand_cmpmem (rtx target, rtx op0, rtx op1, rtx len)
 
       emit_label (loop_start_label);
 
+      if (TARGET_Z10
+         && (GET_CODE (len) != CONST_INT || INTVAL (len) > 512))
+       {
+         rtx prefetch;
+
+         /* Issue a read prefetch for the +2 cache line of operand 1.  */
+         prefetch = gen_prefetch (gen_rtx_PLUS (Pmode, addr0, GEN_INT (512)),
+                                  const0_rtx, const0_rtx);
+         emit_insn (prefetch);
+         PREFETCH_SCHEDULE_BARRIER_P (prefetch) = true;
+
+         /* Issue a read prefetch for the +2 cache line of operand 2.  */
+         prefetch = gen_prefetch (gen_rtx_PLUS (Pmode, addr1, GEN_INT (512)),
+                                  const0_rtx, const0_rtx);
+         emit_insn (prefetch);
+         PREFETCH_SCHEDULE_BARRIER_P (prefetch) = true;
+       }
+
       emit_insn (gen_cmpmem_short (op0, op1, GEN_INT (255)));
       temp = gen_rtx_NE (VOIDmode, ccreg, const0_rtx);
       temp = gen_rtx_IF_THEN_ELSE (VOIDmode, temp,