From: Andreas Krebbel Date: Wed, 9 Mar 2011 16:27:15 +0000 (+0000) Subject: s390-protos.h (s390_label_align): New prototype. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5d304e47bc76ca92c3c9ae178a183f411f051fc3;p=gcc.git s390-protos.h (s390_label_align): New prototype. 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. From-SVN: r170821 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a92e4a62922..147e7ef856c 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 94648792b31..1df176e2346 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 3e6edb76b47..54632ddf9d6 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 105f5aa0c51..ec395e2952a 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 \