s390-protos.h (s390_label_align): New prototype.
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>
Wed, 9 Mar 2011 16:27:15 +0000 (16:27 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Wed, 9 Mar 2011 16:27:15 +0000 (16:27 +0000)
2011-03-09  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* config/s390/s390-protos.h (s390_label_align): New prototype.
* config/s390/s390.c (s390_label_align): New function.
* config/s390/s390.h (LABEL_ALIGN): New target macro definition.

From-SVN: r170821

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

index a92e4a62922bcb6cb1f54c7c9fc2b4d1c20981f6..147e7ef856cf5efe3669b0c62d13dfeb28b03870 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-09  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390-protos.h (s390_label_align): New prototype.
+       * config/s390/s390.c (s390_label_align): New function.
+       * config/s390/s390.h (LABEL_ALIGN): New target macro definition.
+
 2011-03-08  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR target/47755
index 94648792b316f8d82cd310ea289a994197c7cf8e..1df176e2346d458bec5f4d23415fb9b5494b4d0a 100644 (file)
@@ -101,6 +101,7 @@ extern void s390_split_access_reg (rtx, rtx *, rtx *);
 extern void print_operand_address (FILE *, rtx);
 extern void print_operand (FILE *, rtx, int);
 extern void s390_output_pool_entry (rtx, enum machine_mode, unsigned int);
+extern int s390_label_align (rtx);
 extern int s390_agen_dep_p (rtx, rtx);
 extern rtx s390_load_got (void);
 extern rtx s390_get_thread_pointer (void);
index 3e6edb76b475e56eeb9fb5f489c4825f3d1b5584..54632ddf9d64ed088c8ea3bb17714ed083fb34e1 100644 (file)
@@ -384,6 +384,32 @@ struct GTY(()) machine_function
    bytes on a z10 (or higher) CPU.  */
 #define PREDICT_DISTANCE (TARGET_Z10 ? 384 : 2048)
 
+/* Return the alignment for LABEL.  We default to the -falign-labels
+   value except for the literal pool base label.  */
+int
+s390_label_align (rtx label)
+{
+  rtx prev_insn = prev_active_insn (label);
+
+  if (prev_insn == NULL_RTX)
+    goto old;
+
+  prev_insn = single_set (prev_insn);
+
+  if (prev_insn == NULL_RTX)
+    goto old;
+
+  prev_insn = SET_SRC (prev_insn);
+
+  /* Don't align literal pool base labels.  */
+  if (GET_CODE (prev_insn) == UNSPEC
+      && XINT (prev_insn, 1) == UNSPEC_MAIN_BASE)
+    return 0;
+
+ old:
+  return align_labels_log;
+}
+
 static enum machine_mode
 s390_libgcc_cmp_return_mode (void)
 {
index 105f5aa0c51c79db5d414adb0d6dbffa327f835d..ec395e2952adb71dbe5e7117b8878a6e0db17a13 100644 (file)
@@ -870,6 +870,9 @@ do {                                                                        \
 /* The LOCAL_LABEL_PREFIX variable is used by dbxelf.h.  */
 #define LOCAL_LABEL_PREFIX "."
 
+#define LABEL_ALIGN(LABEL) \
+  s390_label_align (LABEL)
+
 /* How to refer to registers in assembler output.  This sequence is
    indexed by compiler's hard-register-number (see above).  */
 #define REGISTER_NAMES                                                 \