aboutsummaryrefslogtreecommitdiff
path: root/gcc/targhooks.c
diff options
context:
space:
mode:
authorAdrian Straetling <straetling@de.ibm.com>2005-05-25 11:52:13 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2005-05-25 11:52:13 +0000
commita71a498df01ba32349bed4e72631433be1ff4a2a (patch)
treef896023adb7eb858c67b994bbe4eac93db8874ba /gcc/targhooks.c
parentbe62afb4d55d42c776c13a70800f3d0300f9bb6a (diff)
downloadgcc-a71a498df01ba32349bed4e72631433be1ff4a2a.zip
gcc-a71a498df01ba32349bed4e72631433be1ff4a2a.tar.gz
gcc-a71a498df01ba32349bed4e72631433be1ff4a2a.tar.bz2
loop-doloop.c: Include "target.h".
2005-05-25 Adrian Straetling <straetling@de.ibm.com> * loop-doloop.c: Include "target.h". (doloop_valid_p): Move tests to function in targhooks.c. * target.h (struct gcc_target): New target hook "insn_valid_within_doloop". * target-def.h: Define default value for "insn_valid_within_doloop". (TARGET_INITIALIZER): Insert new target hook into initializer. * targhooks.c (default_insn_valid_within_doloop): New function. * targhooks.h (default_insn_valid_within_doloop): Declare. * hooks.c (hook_bool_rtx_true): New function. * hooks.h (hook_bool_rtx_true): Declare. * doc/tm.texi: Add documentation for new target hook. From-SVN: r100143
Diffstat (limited to 'gcc/targhooks.c')
-rw-r--r--gcc/targhooks.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/gcc/targhooks.c b/gcc/targhooks.c
index 2bf11a4..1f8b5b7 100644
--- a/gcc/targhooks.c
+++ b/gcc/targhooks.c
@@ -262,6 +262,36 @@ default_scalar_mode_supported_p (enum machine_mode mode)
}
}
+/* TRUE if INSN insn is valid within a low-overhead loop.
+
+ This function checks wheter a given INSN is valid within a low-overhead
+ loop. A called function may clobber any special registers required for
+ low-overhead looping. Additionally, some targets (eg, PPC) use the count
+ register for branch on table instructions. We reject the doloop pattern in
+ these cases. */
+
+bool
+default_insn_valid_within_doloop (rtx insn)
+{
+ if (CALL_P (insn))
+ {
+ if (dump_file)
+ fprintf (dump_file, "Doloop: Function call in loop.\n");
+ return false;
+ }
+
+ if (JUMP_P (insn)
+ && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
+ || GET_CODE (PATTERN (insn)) == ADDR_VEC))
+ {
+ if (dump_file)
+ fprintf (dump_file, "Doloop: Computed branch in the loop.\n");
+ return false;
+ }
+
+ return true;
+}
+
bool
hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false (
CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,