From: Christian Bruel Date: Mon, 14 Apr 2014 08:31:34 +0000 (+0200) Subject: sh-mem.cc (sh_expand_strlen): Unroll last word. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9447df74c059415f2c53df95d845ab9964793074;p=gcc.git sh-mem.cc (sh_expand_strlen): Unroll last word. 2014-04-14 Christian Bruel * config/sh/sh-mem.cc (sh_expand_strlen): Unroll last word. From-SVN: r209358 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cc2b92e2910..4d1bc3d58cc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2014-04-14 Christian Bruel + + * config/sh/sh-mem.cc (sh_expand_strlen): Unroll last word. + 2014-04-14 Christian Bruel * config/sh/sh.md (setmemqi): New expand pattern. diff --git a/gcc/config/sh/sh-mem.cc b/gcc/config/sh/sh-mem.cc index d499b3b5871..1b84f9b63b7 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;