Commit 2a500b9e by Jan Hubicka Committed by Jan Hubicka

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
parent 554b8111
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> 2002-07-16 Zack Weinberg <zack@codesourcery.com>
* builtins.c (std_expand_builtin_va_start): Remove unused * builtins.c (std_expand_builtin_va_start): Remove unused
......
...@@ -209,6 +209,7 @@ extern int x86_field_alignment PARAMS ((tree, int)); ...@@ -209,6 +209,7 @@ extern int x86_field_alignment PARAMS ((tree, int));
#endif #endif
extern rtx ix86_tls_get_addr PARAMS ((void)); extern rtx ix86_tls_get_addr PARAMS ((void));
extern void x86_machine_dependent_reorg PARAMS ((rtx));
/* In winnt.c */ /* In winnt.c */
extern void i386_pe_encode_section_info PARAMS ((tree, int)); extern void i386_pe_encode_section_info PARAMS ((tree, int));
......
...@@ -13677,4 +13677,47 @@ x86_field_alignment (field, computed) ...@@ -13677,4 +13677,47 @@ x86_field_alignment (field, computed)
return 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" #include "gt-i386.h"
...@@ -3354,6 +3354,7 @@ enum fp_cw_mode {FP_CW_STORED, FP_CW_UNINITIALIZED, FP_CW_ANY}; ...@@ -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) ((SRC) < FIRST_STACK_REG || (SRC) > LAST_STACK_REG)
#define MACHINE_DEPENDENT_REORG(X) x86_machine_dependent_reorg(X)
/* /*
Local variables: Local variables:
version-control: t version-control: t
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment