target.def: Add code_for_* hooks.
authorRichard Sandiford <richard.sandiford@arm.com>
Sun, 5 Jul 2015 07:44:45 +0000 (07:44 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 5 Jul 2015 07:44:45 +0000 (07:44 +0000)
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

gcc/ChangeLog
gcc/defaults.h
gcc/expr.c
gcc/gentarget-def.c
gcc/stmt.c
gcc/target-insns.def
gcc/target.def
gcc/targhooks.c

index fe9f680..9ca2040 100644 (file)
@@ -1,3 +1,16 @@
+2015-07-05  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * 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  <sandra@codesourcery.com>
 
        * config/nios2/nios2.c (save_reg, restore_reg): Use plus_constant.
index ea10eb9..5beddea 100644 (file)
@@ -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 */
index 5c0df44..87d2442 100644 (file)
@@ -11058,14 +11058,6 @@ do_store_flag (sepops ops, rtx target, machine_mode mode)
                                 && !TYPE_UNSIGNED (ops->type)) ? -1 : 1);
 }
 \f
-
-/* 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,
index c1125dd..554fd42 100644 (file)
@@ -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
index 426e305..053ffb0 100644 (file)
@@ -780,10 +780,6 @@ dump_case_nodes (FILE *f, struct case_node *root,
   dump_case_nodes (f, root->right, indent_step, indent_level);
 }
 \f
-#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:
index 0d8f501..2c5288e 100644 (file)
@@ -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))
index dabb1f2..a2f3554 100644 (file)
@@ -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)
 
index 4e97057..80f3176 100644 (file)
@@ -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