From: Richard Sandiford Date: Sun, 5 Jul 2015 07:44:45 +0000 (+0000) Subject: target.def: Add code_for_* hooks. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8684d89dea02aad5fba0ef4cef4eb7e51ea74450;p=gcc.git target.def: Add code_for_* hooks. gcc/ * target.def: Add code_for_* hooks. * gentarget-def.c (def_target_insn): Add TARGET_CODE_FOR_* macros. * defaults.h (HAVE_tablejump, gen_tablejump): Delete. * target-insns.def (casesi, tablejump): New targetm instruction patterns. * expr.c (try_casesi): Use them instead of HAVE_*/gen_* interface. (do_tablejump): Likewise. * stmt.c (expand_switch_as_decision_tree_p): Likewise. (expand_sjlj_dispatch_table): Likewise. * targhooks.c (default_case_values_threshold): Likewise. From-SVN: r225421 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fe9f6809a71..9ca2040e567 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2015-07-05 Richard Sandiford + + * target.def: Add code_for_* hooks. + * gentarget-def.c (def_target_insn): Add TARGET_CODE_FOR_* macros. + * defaults.h (HAVE_tablejump, gen_tablejump): Delete. + * target-insns.def (casesi, tablejump): New targetm instruction + patterns. + * expr.c (try_casesi): Use them instead of HAVE_*/gen_* interface. + (do_tablejump): Likewise. + * stmt.c (expand_switch_as_decision_tree_p): Likewise. + (expand_sjlj_dispatch_table): Likewise. + * targhooks.c (default_case_values_threshold): Likewise. + 2015-07-04 Sandra Loosemore * config/nios2/nios2.c (save_reg, restore_reg): Use plus_constant. diff --git a/gcc/defaults.h b/gcc/defaults.h index ea10eb915bc..5beddea669e 100644 --- a/gcc/defaults.h +++ b/gcc/defaults.h @@ -1426,16 +1426,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define TARGET_VTABLE_USES_DESCRIPTORS 0 #endif -#ifndef HAVE_tablejump -#define HAVE_tablejump 0 -static inline rtx -gen_tablejump (rtx, rtx) -{ - gcc_unreachable (); - return NULL; -} -#endif - #endif /* GCC_INSN_FLAGS_H */ #endif /* ! GCC_DEFAULTS_H */ diff --git a/gcc/expr.c b/gcc/expr.c index 5c0df44248d..87d24422312 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -11058,14 +11058,6 @@ do_store_flag (sepops ops, rtx target, machine_mode mode) && !TYPE_UNSIGNED (ops->type)) ? -1 : 1); } - -/* Stubs in case we haven't got a casesi insn. */ -#ifndef HAVE_casesi -# define HAVE_casesi 0 -# define gen_casesi(a, b, c, d, e) (0) -# define CODE_FOR_casesi CODE_FOR_nothing -#endif - /* Attempt to generate a casesi instruction. Returns 1 if successful, 0 otherwise (i.e. if there is no casesi instruction). @@ -11080,7 +11072,7 @@ try_casesi (tree index_type, tree index_expr, tree minval, tree range, machine_mode index_mode = SImode; rtx op1, op2, index; - if (! HAVE_casesi) + if (! targetm.have_casesi ()) return 0; /* Convert the index to SImode. */ @@ -11124,7 +11116,7 @@ try_casesi (tree index_type, tree index_expr, tree minval, tree range, create_fixed_operand (&ops[4], (default_label ? default_label : fallback_label)); - expand_jump_insn (CODE_FOR_casesi, 5, ops); + expand_jump_insn (targetm.code_for_casesi, 5, ops); return 1; } @@ -11197,7 +11189,7 @@ do_tablejump (rtx index, machine_mode mode, rtx range, rtx table_label, vector = gen_const_mem (CASE_VECTOR_MODE, index); convert_move (temp, vector, 0); - emit_jump_insn (gen_tablejump (temp, table_label)); + emit_jump_insn (targetm.gen_tablejump (temp, table_label)); /* If we are generating PIC code or if the table is PC-relative, the table and JUMP_INSN must be adjacent, so don't output a BARRIER. */ @@ -11211,7 +11203,7 @@ try_tablejump (tree index_type, tree index_expr, tree minval, tree range, { rtx index; - if (! HAVE_tablejump) + if (! targetm.have_tablejump ()) return 0; index_expr = fold_build2 (MINUS_EXPR, index_type, diff --git a/gcc/gentarget-def.c b/gcc/gentarget-def.c index c1125dde2fe..554fd421501 100644 --- a/gcc/gentarget-def.c +++ b/gcc/gentarget-def.c @@ -189,6 +189,13 @@ def_target_insn (const char *name, const char *prototype) printf ("invalid_%s\n", suffix); else printf ("target_gen_%s\n", name); + + printf ("#undef TARGET_CODE_FOR_%s\n", upper_name); + printf ("#define TARGET_CODE_FOR_%s ", upper_name); + if (truth == 0) + printf ("CODE_FOR_nothing\n"); + else + printf ("CODE_FOR_%s\n", name); } int diff --git a/gcc/stmt.c b/gcc/stmt.c index 426e3056d08..053ffb0c2a0 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -780,10 +780,6 @@ dump_case_nodes (FILE *f, struct case_node *root, dump_case_nodes (f, root->right, indent_step, indent_level); } -#ifndef HAVE_casesi -#define HAVE_casesi 0 -#endif - /* Return the smallest number of different values for which it is best to use a jump-table instead of a tree of conditional branches. */ @@ -812,7 +808,7 @@ expand_switch_as_decision_tree_p (tree range, /* If neither casesi or tablejump is available, or flag_jump_tables over-ruled us, we really have no choice. */ - if (!HAVE_casesi && !HAVE_tablejump) + if (!targetm.have_casesi () && !targetm.have_tablejump ()) return true; if (!flag_jump_tables) return true; @@ -1291,7 +1287,7 @@ expand_sjlj_dispatch_table (rtx dispatch_index, of expanding as a decision tree or dispatch table vs. the "new way" with decrement chain or dispatch table. */ if (dispatch_table.length () <= 5 - || (!HAVE_casesi && !HAVE_tablejump) + || (!targetm.have_casesi () && !targetm.have_tablejump ()) || !flag_jump_tables) { /* Expand the dispatch as a decrement chain: diff --git a/gcc/target-insns.def b/gcc/target-insns.def index 0d8f5014928..2c5288ebd05 100644 --- a/gcc/target-insns.def +++ b/gcc/target-insns.def @@ -31,6 +31,7 @@ Instructions should be documented in md.texi rather than here. */ DEF_TARGET_INSN (canonicalize_funcptr_for_compare, (rtx x0, rtx x1)) +DEF_TARGET_INSN (casesi, (rtx x0, rtx x1, rtx x2, rtx x3, rtx x4)) DEF_TARGET_INSN (epilogue, (void)) DEF_TARGET_INSN (jump, (rtx x0)) DEF_TARGET_INSN (load_multiple, (rtx x0, rtx x1, rtx x2)) @@ -42,3 +43,4 @@ DEF_TARGET_INSN (return, (void)) DEF_TARGET_INSN (sibcall_epilogue, (void)) DEF_TARGET_INSN (simple_return, (void)) DEF_TARGET_INSN (store_multiple, (rtx x0, rtx x1, rtx x2)) +DEF_TARGET_INSN (tablejump, (rtx x0, rtx x1)) diff --git a/gcc/target.def b/gcc/target.def index dabb1f27018..a2f35545a08 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -5877,6 +5877,11 @@ HOOK_VECTOR_END (mode_switching) #include "target-insns.def" #undef DEF_TARGET_INSN +#define DEF_TARGET_INSN(NAME, PROTO) \ + DEFHOOKPOD (code_for_##NAME, "*", enum insn_code, CODE_FOR_nothing) +#include "target-insns.def" +#undef DEF_TARGET_INSN + /* Close the 'struct gcc_target' definition. */ HOOK_VECTOR_END (C90_EMPTY_HACK) diff --git a/gcc/targhooks.c b/gcc/targhooks.c index 4e970573dd4..80f31767b2d 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -1339,10 +1339,6 @@ default_target_can_inline_p (tree caller, tree callee) return ret; } -#ifndef HAVE_casesi -# define HAVE_casesi 0 -#endif - /* If the machine does not have a case insn that compares the bounds, this means extra overhead for dispatch tables, which raises the threshold for using them. */ @@ -1350,7 +1346,7 @@ default_target_can_inline_p (tree caller, tree callee) unsigned int default_case_values_threshold (void) { - return (HAVE_casesi ? 4 : 5); + return (targetm.have_casesi () ? 4 : 5); } bool