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 fe9f6809a71f22848070cc883adc846a7f78b694..9ca2040e567d05816bb0bb4753d28fa663c17094 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 ea10eb915bcb306b888f078a98c0e439bc76edd0..5beddea669ea5880187edd05ddd921315673a2fb 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 5c0df44248db9032d7371a5e7750b657c60bc89c..87d24422312c98feb7100e8197d973bc99ab9757 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 c1125dde2fecdb163f2e7dc5e31bf77f25fd4e8b..554fd421501324183a75dab773979a9cf24d3294 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 426e3056d083f44b1284b8671251819e02b9105d..053ffb0c2a0bc118874d530a16c1212210452024 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 0d8f5014928e3ddbfdff126fe27c2c71e30a61e1..2c5288ebd05478a84be089ee801c4413f56426e3 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 dabb1f27018848d36e969b1970f0bd71cb0d91c1..a2f35545a08dfdaf4c6b5ef06d350a5143d7b758 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 4e970573dd4d745a109e7c179b7420bfb4810400..80f31767b2d6547f5b4fbfa1a100981c0e8b943d 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