aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/sh/sh-mem.cc
diff options
context:
space:
mode:
authorChristian Bruel <christian.bruel@st.com>2014-04-14 10:31:34 +0200
committerChristian Bruel <chrbr@gcc.gnu.org>2014-04-14 10:31:34 +0200
commit9447df74c059415f2c53df95d845ab9964793074 (patch)
treee54a57f2c51644b57bc64cfabda1782fad7b36ea /gcc/config/sh/sh-mem.cc
parentfa1aecc1c218eca8a1b5643e9276bffe485f6e67 (diff)
downloadgcc-9447df74c059415f2c53df95d845ab9964793074.zip
gcc-9447df74c059415f2c53df95d845ab9964793074.tar.gz
gcc-9447df74c059415f2c53df95d845ab9964793074.tar.bz2
sh-mem.cc (sh_expand_strlen): Unroll last word.
2014-04-14 Christian Bruel <christian.bruel@st.com> * config/sh/sh-mem.cc (sh_expand_strlen): Unroll last word. From-SVN: r209358
Diffstat (limited to 'gcc/config/sh/sh-mem.cc')
-rw-r--r--gcc/config/sh/sh-mem.cc32
1 files changed, 29 insertions, 3 deletions
diff --git a/gcc/config/sh/sh-mem.cc b/gcc/config/sh/sh-mem.cc
index d499b3b..1b84f9b 100644
--- a/gcc/config/sh/sh-mem.cc
+++ b/gcc/config/sh/sh-mem.cc
@@ -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;