From: Jan Hubicka Date: Tue, 16 Jul 2002 22:20:10 +0000 (+0200) Subject: i386.h (MACHINE_DEPENDENT_REORG): New macro. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2a500b9e70db56a16d4b06186708f1181eeb1b9a;p=platform%2Fupstream%2Fgcc.git i386.h (MACHINE_DEPENDENT_REORG): New macro. * i386.h (MACHINE_DEPENDENT_REORG): New macro. * i386.c (x86_machine_dependent_reorg): New function. * i386-protos.h (x86_machine_dependent_reorg): Declare. From-SVN: r55498 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c0fddd..3939b61 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Wed Jul 17 00:19:20 CEST 2002 Jan Hubicka + + * i386.h (MACHINE_DEPENDENT_REORG): New macro. + * i386.c (x86_machine_dependent_reorg): New function. + * i386-protos.h (x86_machine_dependent_reorg): Declare. + 2002-07-16 Zack Weinberg * builtins.c (std_expand_builtin_va_start): Remove unused diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index d49ce1a..a81e0f5 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -209,6 +209,7 @@ extern int x86_field_alignment PARAMS ((tree, int)); #endif extern rtx ix86_tls_get_addr PARAMS ((void)); +extern void x86_machine_dependent_reorg PARAMS ((rtx)); /* In winnt.c */ extern void i386_pe_encode_section_info PARAMS ((tree, int)); diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 5c49f17..6e19b5c 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -13677,4 +13677,47 @@ x86_field_alignment (field, computed) return computed; } +/* Implement machine specific optimizations. + At the moment we implement single transformation: AMD Athlon works faster + when RET is not destination of conditional jump or directly preceeded + by other jump instruction. We avoid the penalty by inserting NOP just + before the RET instructions in such cases. */ +void +x86_machine_dependent_reorg (first) + rtx first ATTRIBUTE_UNUSED; +{ + edge e; + + if (!TARGET_ATHLON || !optimize || optimize_size) + return; + for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next) + { + basic_block bb = e->src; + rtx ret = bb->end; + rtx prev; + bool insert = false; + + if (!returnjump_p (ret) || !maybe_hot_bb_p (bb)) + continue; + prev = prev_nonnote_insn (ret); + if (prev && GET_CODE (prev) == CODE_LABEL) + { + edge e; + for (e = bb->pred; e; e = e->pred_next) + if (EDGE_FREQUENCY (e) && e->src->index > 0 + && !(e->flags & EDGE_FALLTHRU)) + insert = 1; + } + if (!insert) + { + prev = prev_real_insn (ret); + if (prev && GET_CODE (prev) == JUMP_INSN + && any_condjump_p (prev)) + insert = 1; + } + if (insert) + emit_insn_before (gen_nop (), ret); + } +} + #include "gt-i386.h" diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index be4e1b6..7cf9721 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -3354,6 +3354,7 @@ enum fp_cw_mode {FP_CW_STORED, FP_CW_UNINITIALIZED, FP_CW_ANY}; ((SRC) < FIRST_STACK_REG || (SRC) > LAST_STACK_REG) +#define MACHINE_DEPENDENT_REORG(X) x86_machine_dependent_reorg(X) /* Local variables: version-control: t