diff options
-rw-r--r-- | gcc/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 4 | ||||
-rw-r--r-- | gcc/config/i386/i386.h | 16 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 8 | ||||
-rw-r--r-- | gcc/config/i386/x86-64.h | 9 |
5 files changed, 46 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 68b3419..8260f92 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2009-05-18 H.J. Lu <hongjiu.lu@intel.com> + + PR target/39942 + * config/i386/i386.c (ix86_avoid_jump_misspredicts): Replace + gen_align with gen_pad. + (ix86_reorg): Check ASM_OUTPUT_MAX_SKIP_PAD instead of + #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN. + + * config/i386/i386.h (ASM_OUTPUT_MAX_SKIP_PAD): New. + * config/i386/x86-64.h (ASM_OUTPUT_MAX_SKIP_PAD): Likewise. + + * config/i386/i386.md (align): Renamed to ... + (pad): This. Replace ASM_OUTPUT_MAX_SKIP_ALIGN with + ASM_OUTPUT_MAX_SKIP_PAD. + 2009-05-18 Andreas Schwab <schwab@linux-m68k.org> * config.gcc: Fix variable syntax. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index acd3069..e9f8b95 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -27334,7 +27334,7 @@ ix86_avoid_jump_mispredicts (void) if (dump_file) fprintf (dump_file, "Padding insn %i by %i bytes!\n", INSN_UID (insn), padsize); - emit_insn_before (gen_align (GEN_INT (padsize)), insn); + emit_insn_before (gen_pad (GEN_INT (padsize)), insn); } } } @@ -27402,7 +27402,7 @@ ix86_reorg (void) { if (TARGET_PAD_RETURNS) ix86_pad_returns (); -#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN +#ifdef ASM_OUTPUT_MAX_SKIP_PAD if (TARGET_FOUR_JUMP_LIMIT) ix86_avoid_jump_mispredicts (); #endif diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index f41ed7d..e42686b 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -2175,6 +2175,22 @@ do { \ #define ASM_OUTPUT_OPCODE(STREAM, PTR) \ ASM_OUTPUT_AVX_PREFIX ((STREAM), (PTR)) +/* A C statement to output to the stdio stream FILE an assembler + command to pad the location counter to a multiple of 1<<LOG + bytes if it is within MAX_SKIP bytes. */ + +#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN +#undef ASM_OUTPUT_MAX_SKIP_PAD +#define ASM_OUTPUT_MAX_SKIP_PAD(FILE, LOG, MAX_SKIP) \ + if ((LOG) != 0) \ + { \ + if ((MAX_SKIP) == 0) \ + fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ + else \ + fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \ + } +#endif + /* Under some conditions we need jump tables in the text section, because the assembler cannot handle label differences between sections. This is the case for x86_64 on Mach-O for example. */ diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 198b59d..2e28802 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -15519,16 +15519,16 @@ (set_attr "length_immediate" "0") (set_attr "modrm" "0")]) -;; Align to 16-byte boundary, max skip in op0. Used to avoid +;; Pad to 16-byte boundary, max skip in op0. Used to avoid ;; branch prediction penalty for the third jump in a 16-byte ;; block on K8. -(define_insn "align" +(define_insn "pad" [(unspec_volatile [(match_operand 0 "" "")] UNSPECV_ALIGN)] "" { -#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN - ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file, 4, (int)INTVAL (operands[0])); +#ifdef ASM_OUTPUT_MAX_SKIP_PAD + ASM_OUTPUT_MAX_SKIP_PAD (asm_out_file, 4, (int)INTVAL (operands[0])); #else /* It is tempting to use ASM_OUTPUT_ALIGN here, but we don't want to do that. The align insn is used to avoid 3 jump instructions in the row to improve diff --git a/gcc/config/i386/x86-64.h b/gcc/config/i386/x86-64.h index 96649af..5d6958c 100644 --- a/gcc/config/i386/x86-64.h +++ b/gcc/config/i386/x86-64.h @@ -81,6 +81,15 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see } \ } \ } while (0) +#undef ASM_OUTPUT_MAX_SKIP_PAD +#define ASM_OUTPUT_MAX_SKIP_PAD(FILE, LOG, MAX_SKIP) \ + if ((LOG) != 0) \ + { \ + if ((MAX_SKIP) == 0) \ + fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ + else \ + fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \ + } #endif |