sh-mem.cc (sh_expand_strlen): Unroll last word.
authorChristian Bruel <christian.bruel@st.com>
Mon, 14 Apr 2014 08:31:34 +0000 (10:31 +0200)
committerChristian Bruel <chrbr@gcc.gnu.org>
Mon, 14 Apr 2014 08:31:34 +0000 (10:31 +0200)
2014-04-14  Christian Bruel  <christian.bruel@st.com>

       * config/sh/sh-mem.cc (sh_expand_strlen): Unroll last word.

From-SVN: r209358

gcc/ChangeLog
gcc/config/sh/sh-mem.cc

index cc2b92e29102a2e6b6121d7216c1db32f3c20c08..4d1bc3d58cce3f13bcfe3bb7ea66a93e1062d8ba 100644 (file)
@@ -1,3 +1,7 @@
+2014-04-14  Christian Bruel  <christian.bruel@st.com>
+
+        * config/sh/sh-mem.cc (sh_expand_strlen): Unroll last word.
+
 2014-04-14  Christian Bruel  <christian.bruel@st.com>
 
        * config/sh/sh.md (setmemqi): New expand pattern.
index d499b3b5871d00a4c6779ddb01adfb498b373f35..1b84f9b63b7766d304b6d14612a9238f8367f7ad 100644 (file)
@@ -586,9 +586,35 @@ sh_expand_strlen (rtx *operands)
 
   emit_move_insn (current_addr, plus_constant (Pmode, current_addr, -4));
 
-  /* start byte loop.  */
   addr1 = adjust_address (addr1, QImode, 0);
 
+  /* unroll remaining bytes.  */
+  emit_insn (gen_extendqisi2 (tmp1, addr1));
+  emit_insn (gen_cmpeqsi_t (tmp1, const0_rtx));
+  jump = emit_jump_insn (gen_branch_true (L_return));
+  add_int_reg_note (jump, REG_BR_PROB, prob_likely);
+
+  emit_move_insn (current_addr, plus_constant (Pmode, current_addr, 1));
+
+  emit_insn (gen_extendqisi2 (tmp1, addr1));
+  emit_insn (gen_cmpeqsi_t (tmp1, const0_rtx));
+  jump = emit_jump_insn (gen_branch_true (L_return));
+  add_int_reg_note (jump, REG_BR_PROB, prob_likely);
+
+  emit_move_insn (current_addr, plus_constant (Pmode, current_addr, 1));
+
+  emit_insn (gen_extendqisi2 (tmp1, addr1));
+  emit_insn (gen_cmpeqsi_t (tmp1, const0_rtx));
+  jump = emit_jump_insn (gen_branch_true (L_return));
+  add_int_reg_note (jump, REG_BR_PROB, prob_likely);
+
+  emit_move_insn (current_addr, plus_constant (Pmode, current_addr, 1));
+
+  emit_insn (gen_extendqisi2 (tmp1, addr1));
+  jump = emit_jump_insn (gen_jump_compact (L_return));
+  emit_barrier_after (jump);
+
+  /* start byte loop.  */
   emit_label (L_loop_byte);
 
   emit_insn (gen_extendqisi2 (tmp1, addr1));
@@ -600,10 +626,10 @@ sh_expand_strlen (rtx *operands)
 
   /* end loop.  */
 
-  emit_label (L_return);
-
   emit_insn (gen_addsi3 (start_addr, start_addr, GEN_INT (1)));
 
+  emit_label (L_return);
+
   emit_insn (gen_subsi3 (operands[0], current_addr, start_addr));
 
   return true;