rx.h (LABEL_ALIGN_FOR_BARRIER): Define.
authorNick Clifton <nickc@redhat.com>
Thu, 24 Mar 2011 17:25:28 +0000 (17:25 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Thu, 24 Mar 2011 17:25:28 +0000 (17:25 +0000)
* config/rx/rx.h (LABEL_ALIGN_FOR_BARRIER): Define.
(ASM_OUTPUT_MAX_SKIP_ALIGN): Define.
* config/rx/rx.c (rx_option_override): Set align_jumps,
align_loops and align_labels if not set by the user.
(rx_align_for_label): New function.
(rx_max_skip_for_label): New function.
(TARGET_ASM_JUMP_ALIGN_MAX_SKIP): Define.
(TARGET_ASM_LOOP_ALIGN_MAX_SKIP): Define.
(TARGET_ASM_LABEL_ALIGN_MAX_SKIP): Define.
(TARGET_ASM_LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP): Define.
* config/rx/rx-protos.h (rx_align_for_label): Add prototype.

From-SVN: r171420

gcc/ChangeLog
gcc/config/rx/rx-protos.h
gcc/config/rx/rx.c
gcc/config/rx/rx.h

index a0b54d125747d5d9d7c25409bb65a2f6d310cf17..046aea78990b5c57cd5446dacd8927a0274a9463 100644 (file)
@@ -1,3 +1,17 @@
+2011-03-24  Nick Clifton  <nickc@redhat.com>
+
+       * config/rx/rx.h (LABEL_ALIGN_FOR_BARRIER): Define.
+       (ASM_OUTPUT_MAX_SKIP_ALIGN): Define.
+       * config/rx/rx.c (rx_option_override): Set align_jumps,
+       align_loops and align_labels if not set by the user.
+       (rx_align_for_label): New function.
+       (rx_max_skip_for_label): New function.
+       (TARGET_ASM_JUMP_ALIGN_MAX_SKIP): Define.
+       (TARGET_ASM_LOOP_ALIGN_MAX_SKIP): Define.
+       (TARGET_ASM_LABEL_ALIGN_MAX_SKIP): Define.
+       (TARGET_ASM_LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP): Define.
+       * config/rx/rx-protos.h (rx_align_for_label): Add prototype.
+
 2011-03-24  Richard Sandiford  <richard.sandiford@linaro.org>
 
        PR rtl-optimization/48263
index a6ae416e6dc2c9a3edca9037cedcf338f7de91ae..ab04fdd7ce0fde280ec62b984533ce47bd7bf332 100644 (file)
@@ -26,6 +26,7 @@
 #define Fargs  CUMULATIVE_ARGS
 #define Rcode  enum rtx_code
 \f
+extern int             rx_align_for_label (void);
 extern void            rx_expand_prologue (void);
 extern int             rx_initial_elimination_offset (int, int);
 
index bec921b1effc8969f1424a07298d185752564971..a6a63ac01ab990d7d3ab37e669a467c23106f170 100644 (file)
@@ -2350,6 +2350,13 @@ rx_option_override (void)
     flag_strict_volatile_bitfields = 1;
 
   rx_override_options_after_change ();
+
+  if (align_jumps == 0 && ! optimize_size)
+    align_jumps = 3;
+  if (align_loops == 0 && ! optimize_size)
+    align_loops = 3;
+  if (align_labels == 0 && ! optimize_size)
+    align_labels = 3;
 }
 
 /* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
@@ -2740,8 +2747,47 @@ rx_match_ccmode (rtx insn, enum machine_mode cc_mode)
 
   return true;
 }
+\f
+int
+rx_align_for_label (void)
+{
+  return optimize_size ? 1 : 3;
+}
+
+static int
+rx_max_skip_for_label (rtx lab)
+{
+  int opsize;
+  rtx op;
+
+  if (lab == NULL_RTX)
+    return 0;
 
+  op = lab;
+  do
+    {
+      op = next_nonnote_nondebug_insn (op);
+    }
+  while (op && (LABEL_P (op)
+               || (INSN_P (op) && GET_CODE (PATTERN (op)) == USE)));
+  if (!op)
+    return 0;
+
+  opsize = get_attr_length (op);
+  if (opsize >= 0 && opsize < 8)
+    return opsize - 1;
+  return 0;
+}
 \f
+#undef  TARGET_ASM_JUMP_ALIGN_MAX_SKIP
+#define TARGET_ASM_JUMP_ALIGN_MAX_SKIP                 rx_max_skip_for_label
+#undef  TARGET_ASM_LOOP_ALIGN_MAX_SKIP
+#define TARGET_ASM_LOOP_ALIGN_MAX_SKIP                 rx_max_skip_for_label
+#undef  TARGET_LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP
+#define TARGET_LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP      rx_max_skip_for_label
+#undef  TARGET_ASM_LABEL_ALIGN_MAX_SKIP
+#define TARGET_ASM_LABEL_ALIGN_MAX_SKIP                        rx_max_skip_for_label
+
 #undef  TARGET_FUNCTION_VALUE
 #define TARGET_FUNCTION_VALUE          rx_function_value
 
index e3966ed173dd6a7b6c918be51153ea8eabe7843c..bd54a2b954f2a11e81e04232acf915c8750b48b2 100644 (file)
@@ -413,6 +413,25 @@ typedef unsigned int CUMULATIVE_ARGS;
 #undef  USER_LABEL_PREFIX
 #define USER_LABEL_PREFIX      "_"
 
+#define LABEL_ALIGN_AFTER_BARRIER(x)           rx_align_for_label ()
+
+#define ASM_OUTPUT_MAX_SKIP_ALIGN(STREAM, LOG, MAX_SKIP)       \
+  do                                           \
+    {                                          \
+      if ((LOG) == 0 || (MAX_SKIP) == 0)       \
+        break;                                 \
+      if (TARGET_AS100_SYNTAX)                 \
+       {                                       \
+         if ((LOG) >= 2)                       \
+           fprintf (STREAM, "\t.ALIGN 4\t; %d alignment actually requested\n", 1 << (LOG)); \
+         else                                  \
+           fprintf (STREAM, "\t.ALIGN 2\n");   \
+       }                                       \
+      else                                     \
+       fprintf (STREAM, "\t.balign %d,3,%d\n", 1 << (LOG), (MAX_SKIP));        \
+    }                                          \
+  while (0)
+
 #define ASM_OUTPUT_ALIGN(STREAM, LOG)          \
   do                                           \
     {                                          \