From: Nick Clifton Date: Thu, 24 Mar 2011 17:25:28 +0000 (+0000) Subject: rx.h (LABEL_ALIGN_FOR_BARRIER): Define. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=662666e54195337b99405c8e9ab0b8a392ba95e1;p=gcc.git rx.h (LABEL_ALIGN_FOR_BARRIER): Define. * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a0b54d12574..046aea78990 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2011-03-24 Nick Clifton + + * 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 PR rtl-optimization/48263 diff --git a/gcc/config/rx/rx-protos.h b/gcc/config/rx/rx-protos.h index a6ae416e6dc..ab04fdd7ce0 100644 --- a/gcc/config/rx/rx-protos.h +++ b/gcc/config/rx/rx-protos.h @@ -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); diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c index bec921b1eff..a6a63ac01ab 100644 --- a/gcc/config/rx/rx.c +++ b/gcc/config/rx/rx.c @@ -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; } + +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 diff --git a/gcc/config/rx/rx.h b/gcc/config/rx/rx.h index e3966ed173d..bd54a2b954f 100644 --- a/gcc/config/rx/rx.h +++ b/gcc/config/rx/rx.h @@ -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 \ { \