From: krebbel Date: Wed, 9 Mar 2011 16:27:15 +0000 (+0000) Subject: 2011-03-09 Andreas Krebbel X-Git-Tag: upstream/4.9.2~22395 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6d0afa28716e6b5b437e284572ca11057b350886;p=platform%2Fupstream%2Flinaro-gcc.git 2011-03-09 Andreas Krebbel * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170821 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a92e4a6..147e7ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-03-09 Andreas Krebbel + + * 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 PR target/47755 diff --git a/gcc/config/s390/s390-protos.h b/gcc/config/s390/s390-protos.h index 9464879..1df176e 100644 --- a/gcc/config/s390/s390-protos.h +++ b/gcc/config/s390/s390-protos.h @@ -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); diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 3e6edb7..54632dd 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -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) { diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h index 105f5aa..ec395e2 100644 --- a/gcc/config/s390/s390.h +++ b/gcc/config/s390/s390.h @@ -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 \