diff options
author | Jan Hubicka <jh@suse.cz> | 2002-07-17 00:20:10 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2002-07-16 22:20:10 +0000 |
commit | 2a500b9e70db56a16d4b06186708f1181eeb1b9a (patch) | |
tree | 7596767db4af978309d5cec69c5f8f9eacdb5129 /gcc | |
parent | 554b81110446a7af56af9417bd30437024443564 (diff) | |
download | gcc-2a500b9e70db56a16d4b06186708f1181eeb1b9a.zip gcc-2a500b9e70db56a16d4b06186708f1181eeb1b9a.tar.gz gcc-2a500b9e70db56a16d4b06186708f1181eeb1b9a.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 43 | ||||
-rw-r--r-- | gcc/config/i386/i386.h | 1 |
4 files changed, 51 insertions, 0 deletions
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 <jh@suse.cz> + + * 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 <zack@codesourcery.com> * 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 |