visium.c (machine_libfunc_index): New enum.

* 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.

From-SVN: r233488
This commit is contained in:
Eric Botcazou 2016-02-17 11:17:15 +00:00 committed by Eric Botcazou
parent 01c93899e2
commit 8072945b83
2 changed files with 88 additions and 18 deletions

View File

@ -1,3 +1,18 @@
2016-02-17 Eric Botcazou <ebotcazou@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.
2016-02-17 Nick Clifton <nickc@redhat.com>
* config/msp430/msp430.c (msp430_mcu_data): Sync with data from

View File

@ -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, machine_mode, int, int, int *, bool);
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_code, rtx op0, rtx op1,
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_reg, rtx src, rtx src_reg, rtx bytes_rtx)
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_reg, rtx src, rtx src_reg, rtx bytes_rtx)
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_reg, rtx src, rtx src_reg, rtx bytes_rtx)
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 src_reg, rtx bytes_rtx)
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, rtx value_rtx, rtx bytes_rtx)
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, rtx value_rtx, rtx bytes_rtx)
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, tree fndecl, rtx static_chain)
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. */