This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Commit: RX: Add alignment for jumps, loops and labels


Hi Guys,

  I am applying the patch below to add alignment control for jumps,
  loops and labels to the RX backend.

  Tested without regressions on an rx-elf target.

Cheers
  Nick

gcc/ChangeLog
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.

Index: gcc/config/rx/rx.h
===================================================================
--- gcc/config/rx/rx.h	(revision 171417)
+++ gcc/config/rx/rx.h	(working copy)
@@ -413,6 +413,25 @@
 #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						\
     {						\
Index: gcc/config/rx/rx-protos.h
===================================================================
--- gcc/config/rx/rx-protos.h	(revision 171417)
+++ gcc/config/rx/rx-protos.h	(working copy)
@@ -26,6 +26,7 @@
 #define Fargs	CUMULATIVE_ARGS
 #define Rcode	enum rtx_code
 
+extern int		rx_align_for_label (void);
 extern void		rx_expand_prologue (void);
 extern int		rx_initial_elimination_offset (int, int);
 
Index: gcc/config/rx/rx.c
===================================================================
--- gcc/config/rx/rx.c	(revision 171417)
+++ gcc/config/rx/rx.c	(working copy)
@@ -2350,6 +2350,13 @@
     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 @@
 
   return true;
 }
+
+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;
+}
 
+#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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]