diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-09 11:42:16 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-09 11:42:16 +0000 |
commit | 5f35dd0e122d3aa3cccd4a32c912c25f60064ee6 (patch) | |
tree | 5b96e2c7a588193d1b4019f9316a1ca13b8376ce /gcc/config/arc/arc.md | |
parent | d83b36f1d70e870859824fe4a98dad49437a6db3 (diff) | |
download | gcc-5f35dd0e122d3aa3cccd4a32c912c25f60064ee6.tar.gz |
gcc/
* target.def (can_use_doloop_p): New hook.
* doc/tm.texi.in (TARGET_CAN_USE_DOLOOP_P): Add.
* doc/tm.texi: Regenerate.
* doc/md.texi (doloop_begin, doloop_end): Update documentation.
* hooks.h (hook_bool_dint_dint_uint_true): Declare.
* hooks.c (hook_bool_dint_dint_uint_true): New function.
* targhooks.h (can_use_doloop_if_innermost): Declare.
* targhooks.c (can_use_doloop_if_innermost): New function.
* target.h: Include double-int.h.
* loop-doloop.c (doloop_optimize): Call targetm.can_use_doloop_p.
Remove iteration count, maximum iteration count, loop depth and
enter-at-top inputs from doloop_begin and doloop_end.
* config/arc/arc.md (doloop_begin, doloop_end): Update for new
interface.
* config/arc/arc.c (arc_can_use_doloop_p): New function.
(TARGET_CAN_USE_DOLOOP_P): Define.
* config/arm/thumb2.md (doloop_end): Update for new interface.
* config/arm/arm.c (TARGET_CAN_USE_DOLOOP_P): Define.
* config/bfin/bfin.md (doloop_end): Update for new interface.
* config/bfin/bfin.c (bfin_can_use_doloop_p): New function.
(TARGET_CAN_USE_DOLOOP_P): Define.
* config/c6x/c6x.md (doloop_end): Update for new interface.
* config/ia64/ia64.md (doloop_end): Update for new interface.
* config/ia64/ia64.c (TARGET_CAN_USE_DOLOOP_P): Define.
* config/mep/mep.md (doloop_begin, doloop_end): Update for new
interface.
* config/mep/mep.c (mep_emit_doloop): Likewise.
(TARGET_CAN_USE_DOLOOP_P): Define.
* config/rs6000/rs6000.md (doloop_end): Update for new interface.
* config/rs6000/rs6000.c (TARGET_CAN_USE_DOLOOP_P): Define.
* config/s390/s390.md (doloop_end): Update for new interface.
* config/sh/sh.md (doloop_end): Likewise.
* config/spu/spu.md (doloop_end): Likewise.
* config/spu/spu.c (TARGET_CAN_USE_DOLOOP_P): Define.
* config/tilegx/tilegx.md (doloop_end): Update for new interface.
* config/tilegx/tilegx.c (TARGET_CAN_USE_DOLOOP_P): Define.
* config/tilepro/tilepro.md (doloop_end): Update for new interface.
* config/tilepro/tilepro.c (TARGET_CAN_USE_DOLOOP_P): Define.
* config/v850/v850.md (doloop_begin, doloop_end): Update for new
interface.
* config/v850/v850.c (TARGET_CAN_USE_DOLOOP_P): Define.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204614 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/arc/arc.md')
-rw-r--r-- | gcc/config/arc/arc.md | 34 |
1 files changed, 6 insertions, 28 deletions
diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md index aa8243a8c83..baf347876be 100644 --- a/gcc/config/arc/arc.md +++ b/gcc/config/arc/arc.md @@ -4706,16 +4706,10 @@ }) ; operand 0 is the loop count pseudo register -; operand 1 is the number of loop iterations or 0 if it is unknown -; operand 2 is the maximum number of loop iterations -; operand 3 is the number of levels of enclosed loops -; operand 4 is the loop end pattern +; operand 1 is the loop end pattern (define_expand "doloop_begin" [(use (match_operand 0 "register_operand" "")) - (use (match_operand:QI 1 "const_int_operand" "")) - (use (match_operand:QI 2 "const_int_operand" "")) - (use (match_operand:QI 3 "const_int_operand" "")) - (use (match_operand 4 "" ""))] + (use (match_operand 1 "" ""))] "" { /* Using the INSN_UID of the loop end pattern to identify it causes @@ -4725,10 +4719,8 @@ still be able to tell what kind of number this is. */ static HOST_WIDE_INT loop_end_id = 0; - if (INTVAL (operands[3]) > 1) - FAIL; rtx id = GEN_INT (--loop_end_id); - XEXP (XVECEXP (PATTERN (operands[4]), 0, 4), 0) = id; + XEXP (XVECEXP (PATTERN (operands[1]), 0, 4), 0) = id; emit_insn (gen_doloop_begin_i (operands[0], const0_rtx, id, const0_rtx, const0_rtx)); DONE; @@ -4907,11 +4899,7 @@ ) ; operand 0 is the loop count pseudo register -; operand 1 is the number of loop iterations or 0 if it is unknown -; operand 2 is the maximum number of loop iterations -; operand 3 is the number of levels of enclosed loops -; operand 4 is the label to jump to at the top of the loop -; operand 5 is nonzero if the loop is entered at its top. +; operand 1 is the label to jump to at the top of the loop ; Use this for the ARC600 and ARC700. For ARCtangent-A5, this is unsafe ; without further checking for nearby branches etc., and without proper ; annotation of shift patterns that clobber lp_count @@ -4919,24 +4907,14 @@ ; single insn - loop setup is expensive then. (define_expand "doloop_end" [(use (match_operand 0 "register_operand" "")) - (use (match_operand:QI 1 "const_int_operand" "")) - (use (match_operand:QI 2 "const_int_operand" "")) - (use (match_operand:QI 3 "const_int_operand" "")) - (use (label_ref (match_operand 4 "" ""))) - (use (match_operand:QI 5 "const_int_operand" ""))] + (use (label_ref (match_operand 1 "" "")))] "TARGET_ARC600 || TARGET_ARC700" { - if (INTVAL (operands[3]) > 1) - FAIL; - /* Setting up the loop with two sr isntructions costs 6 cycles. */ - if (TARGET_ARC700 && !INTVAL (operands[5]) - && INTVAL (operands[1]) && INTVAL (operands[1]) <= (flag_pic ? 6 : 3)) - FAIL; /* We could do smaller bivs with biv widening, and wider bivs by having a high-word counter in an outer loop - but punt on this for now. */ if (GET_MODE (operands[0]) != SImode) FAIL; - emit_jump_insn (gen_doloop_end_i (operands[0], operands[4], const0_rtx)); + emit_jump_insn (gen_doloop_end_i (operands[0], operands[1], const0_rtx)); DONE; }) |