+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.
#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 */
&& !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).
machine_mode index_mode = SImode;
rtx op1, op2, index;
- if (! HAVE_casesi)
+ if (! targetm.have_casesi ())
return 0;
/* Convert the index to SImode. */
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;
}
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. */
{
rtx index;
- if (! HAVE_tablejump)
+ if (! targetm.have_tablejump ())
return 0;
index_expr = fold_build2 (MINUS_EXPR, index_type,
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
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. */
/* 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;
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:
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))
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))
#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)
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. */
unsigned int
default_case_values_threshold (void)
{
- return (HAVE_casesi ? 4 : 5);
+ return (targetm.have_casesi () ? 4 : 5);
}
bool