From: Eric Botcazou Date: Wed, 17 Feb 2016 11:17:15 +0000 (+0000) Subject: visium.c (machine_libfunc_index): New enum. X-Git-Tag: basepoints/gcc-7~902 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8072945b8333f374590c5f66320ef71d308a8f96;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c57c83cf3b7..2178ae6095d4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2016-02-17 Eric Botcazou + + * 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 * config/msp430/msp430.c (msp430_mcu_data): Sync with data from diff --git a/gcc/config/visium/visium.c b/gcc/config/visium/visium.c index 7881b0ea4587..cd28f9bf90af 100644 --- a/gcc/config/visium/visium.c +++ b/gcc/config/visium/visium.c @@ -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. */