This adds an internal table instead of regenerating naked symbols each time
the libfuncs are used.
Tested on visium-elf, applied on the mainline.
2016-02-17 Eric Botcazou <ebotca...@adacore.com>
* config/visium/visium.c (machine_libfunc_index): New enum.
(machine_libfuncs): New structure.
(visium_libfuncs): New static variable.
(TARGET_INIT_LIBFUNCS): Define to...
(visium_init_libfuncs): ...this. New function.
(expand_block_move_4): Use the appropriate libfunc.
(expand_block_move_2): Likewise.
(expand_block_move_1): Likewise.
(expand_block_set_4): Likewise.
(expand_block_set_2): Likewise.
(expand_block_set_1): Likewise.
(visium_trampoline_init): Likewise.
--
Eric Botcazou
Index: config/visium/visium.c
===================================================================
--- config/visium/visium.c (revision 233448)
+++ config/visium/visium.c (working copy)
@@ -57,6 +57,41 @@
/* This file should be included last. */
#include "target-def.h"
+/* Enumeration of indexes into machine_libfunc_table. */
+enum machine_libfunc_index
+{
+ MLTI_long_int_memcpy,
+ MLTI_wrd_memcpy,
+ MLTI_byt_memcpy,
+
+ MLTI_long_int_memset,
+ MLTI_wrd_memset,
+ MLTI_byt_memset,
+
+ MLTI_set_trampoline_parity,
+
+ MLTI_MAX
+};
+
+struct GTY(()) machine_libfuncs
+{
+ rtx table[MLTI_MAX];
+};
+
+/* The table of Visium-specific libfuncs. */
+static GTY(()) struct machine_libfuncs visium_libfuncs;
+
+#define vlt visium_libfuncs.table
+
+/* Accessor macros for visium_libfuncs. */
+#define long_int_memcpy_libfunc (vlt[MLTI_long_int_memcpy])
+#define wrd_memcpy_libfunc (vlt[MLTI_wrd_memcpy])
+#define byt_memcpy_libfunc (vlt[MLTI_byt_memcpy])
+#define long_int_memset_libfunc (vlt[MLTI_long_int_memset])
+#define wrd_memset_libfunc (vlt[MLTI_wrd_memset])
+#define byt_memset_libfunc (vlt[MLTI_byt_memset])
+#define set_trampoline_parity_libfunc (vlt[MLTI_set_trampoline_parity])
+
/* Machine specific function data. */
struct GTY (()) machine_function
{
@@ -187,6 +222,8 @@ static bool visium_rtx_costs (rtx, machi
static void visium_option_override (void);
+static void visium_init_libfuncs (void);
+
static unsigned int visium_reorg (void);
/* Setup the global target hooks structure. */
@@ -282,6 +319,9 @@ static unsigned int visium_reorg (void);
#undef TARGET_OPTION_OVERRIDE
#define TARGET_OPTION_OVERRIDE visium_option_override
+#undef TARGET_INIT_LIBFUNCS
+#define TARGET_INIT_LIBFUNCS visium_init_libfuncs
+
#undef TARGET_CONDITIONAL_REGISTER_USAGE
#define TARGET_CONDITIONAL_REGISTER_USAGE visium_conditional_register_usage
@@ -422,6 +462,23 @@ visium_option_override (void)
register_pass (&insert_pass_visium_reorg);
}
+/* Register the Visium-specific libfuncs with the middle-end. */
+
+static void
+visium_init_libfuncs (void)
+{
+ if (!TARGET_BMI)
+ long_int_memcpy_libfunc = init_one_libfunc ("__long_int_memcpy");
+ wrd_memcpy_libfunc = init_one_libfunc ("__wrd_memcpy");
+ byt_memcpy_libfunc = init_one_libfunc ("__byt_memcpy");
+
+ long_int_memset_libfunc = init_one_libfunc ("__long_int_memset");
+ wrd_memset_libfunc = init_one_libfunc ("__wrd_memset");
+ byt_memset_libfunc = init_one_libfunc ("__byt_memset");
+
+ set_trampoline_parity_libfunc = init_one_libfunc ("__set_trampoline_parity");
+}
+
/* Return the number of instructions that can issue on the same cycle. */
static int
@@ -2226,7 +2283,6 @@ visium_split_cstore (enum rtx_code op_co
static void
expand_block_move_4 (rtx dst, rtx dst_reg, rtx src, rtx src_reg, rtx bytes_rtx)
{
- const rtx sym = gen_rtx_SYMBOL_REF (Pmode, "__long_int_memcpy");
unsigned HOST_WIDE_INT bytes = UINTVAL (bytes_rtx);
unsigned int rem = bytes % 4;
@@ -2250,8 +2306,9 @@ expand_block_move_4 (rtx dst, rtx dst_re
emit_insn (insn);
}
else
- emit_library_call (sym, LCT_NORMAL, VOIDmode, 3, dst_reg, Pmode, src_reg,
- Pmode,
+ emit_library_call (long_int_memcpy_libfunc, LCT_NORMAL, VOIDmode, 3,
+ dst_reg, Pmode,
+ src_reg, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
GEN_INT (bytes >> 2),
TYPE_UNSIGNED (sizetype)),
@@ -2282,12 +2339,12 @@ expand_block_move_4 (rtx dst, rtx dst_re
static void
expand_block_move_2 (rtx dst, rtx dst_reg, rtx src, rtx src_reg, rtx bytes_rtx)
{
- const rtx sym = gen_rtx_SYMBOL_REF (Pmode, "__wrd_memcpy");
unsigned HOST_WIDE_INT bytes = UINTVAL (bytes_rtx);
unsigned int rem = bytes % 2;
- emit_library_call (sym, LCT_NORMAL, VOIDmode, 3, dst_reg, Pmode, src_reg,
- Pmode,
+ emit_library_call (wrd_memcpy_libfunc, LCT_NORMAL, VOIDmode, 3,
+ dst_reg, Pmode,
+ src_reg, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
GEN_INT (bytes >> 1),
TYPE_UNSIGNED (sizetype)),
@@ -2309,9 +2366,8 @@ expand_block_move_2 (rtx dst, rtx dst_re
static void
expand_block_move_1 (rtx dst_reg, rtx src_reg, rtx bytes_rtx)
{
- const rtx sym = gen_rtx_SYMBOL_REF (Pmode, "__byt_memcpy");
-
- emit_library_call (sym, LCT_NORMAL, VOIDmode, 3, dst_reg, Pmode,
+ emit_library_call (byt_memcpy_libfunc, LCT_NORMAL, VOIDmode, 3,
+ dst_reg, Pmode,
src_reg, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
bytes_rtx,
@@ -2325,12 +2381,12 @@ expand_block_move_1 (rtx dst_reg, rtx sr
static void
expand_block_set_4 (rtx dst, rtx dst_reg, rtx value_rtx, rtx bytes_rtx)
{
- const rtx sym = gen_rtx_SYMBOL_REF (Pmode, "__long_int_memset");
unsigned HOST_WIDE_INT bytes = UINTVAL (bytes_rtx);
unsigned int rem = bytes % 4;
value_rtx = convert_to_mode (Pmode, value_rtx, 1);
- emit_library_call (sym, LCT_NORMAL, VOIDmode, 3, dst_reg, Pmode,
+ emit_library_call (long_int_memset_libfunc, LCT_NORMAL, VOIDmode, 3,
+ dst_reg, Pmode,
value_rtx, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
GEN_INT (bytes >> 2),
@@ -2371,12 +2427,12 @@ expand_block_set_4 (rtx dst, rtx dst_reg
static void
expand_block_set_2 (rtx dst, rtx dst_reg, rtx value_rtx, rtx bytes_rtx)
{
- const rtx sym = gen_rtx_SYMBOL_REF (Pmode, "__wrd_memset");
unsigned HOST_WIDE_INT bytes = UINTVAL (bytes_rtx);
unsigned int rem = bytes % 2;
value_rtx = convert_to_mode (Pmode, value_rtx, 1);
- emit_library_call (sym, LCT_NORMAL, VOIDmode, 3, dst_reg, Pmode,
+ emit_library_call (wrd_memset_libfunc, LCT_NORMAL, VOIDmode, 3,
+ dst_reg, Pmode,
value_rtx, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
GEN_INT (bytes >> 1),
@@ -2398,10 +2454,9 @@ expand_block_set_2 (rtx dst, rtx dst_reg
static void
expand_block_set_1 (rtx dst_reg, rtx value_rtx, rtx bytes_rtx)
{
- const rtx sym = gen_rtx_SYMBOL_REF (Pmode, "__byt_memset");
-
value_rtx = convert_to_mode (Pmode, value_rtx, 1);
- emit_library_call (sym, LCT_NORMAL, VOIDmode, 3, dst_reg, Pmode,
+ emit_library_call (byt_memset_libfunc, LCT_NORMAL, VOIDmode, 3,
+ dst_reg, Pmode,
value_rtx, Pmode,
convert_to_mode (TYPE_MODE (sizetype),
bytes_rtx,
@@ -2552,8 +2607,8 @@ visium_trampoline_init (rtx m_tramp, tre
GEN_INT (0xffff), NULL_RTX),
0x04940000));
- emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__set_trampoline_parity"),
- LCT_NORMAL, VOIDmode, 1, addr, SImode);
+ emit_library_call (set_trampoline_parity_libfunc, LCT_NORMAL, VOIDmode, 1,
+ addr, SImode);
}
/* Return true if the current function must have and use a frame pointer. */