]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
visium.c (machine_libfunc_index): New enum.
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 17 Feb 2016 11:17:15 +0000 (11:17 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 17 Feb 2016 11:17:15 +0000 (11:17 +0000)
* 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

gcc/ChangeLog
gcc/config/visium/visium.c

index 3c57c83cf3b7fc832f80558a069b4e766c5cfb47..2178ae6095d45692562bd3dd71e1990b2abc8bb9 100644 (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
index 7881b0ea45875e28fdc792c4c699b4a400486349..cd28f9bf90af5f5b9aa36ef832ecfe4668593f64 100644 (file)
 /* 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.  */