i386.h (CONDITIONAL_REGISTER_USAGE): Initialize for current function ABI.

* i386.h (CONDITIONAL_REGISTER_USAGE): Initialize for current function
	ABI.
	* i386.c (ix86_call_abi_override): Do not trigger target re-init and
	do not try to modify call used regs.
	(ix86_maybe_switch_abi): New function.
	(TARGET_EXPAND_TO_RTL_HOOK): New macro.

Co-Authored-By: Kai Tietz <kai.tietz@onevision.com>

From-SVN: r142810
This commit is contained in:
Jan Hubicka 2008-12-18 14:48:36 +01:00 committed by Jan Hubicka
parent 02b47899e1
commit 877a0b76e1
3 changed files with 28 additions and 22 deletions

View File

@ -1,3 +1,13 @@
2008-12-18 Jan Hubicka <jh@suse.cz>
Kai Tietz <kai.tietz@onevision.com>
* i386.h (CONDITIONAL_REGISTER_USAGE): Initialize for current function
ABI.
* i386.c (ix86_call_abi_override): Do not trigger target re-init and
do not try to modify call used regs.
(ix86_maybe_switch_abi): New function.
(TARGET_EXPAND_TO_RTL_HOOK): New macro.
2008-12-18 Kenneth Zadeck <zadeck@naturalbridge.com>
PR rtl-optimization/37922

View File

@ -4600,9 +4600,7 @@ extern void init_regs (void);
/* Implementation of call abi switching target hook. Specific to FNDECL
the specific call register sets are set. See also CONDITIONAL_REGISTER_USAGE
for more details.
To prevent redudant calls of costy function init_regs (), it checks not to
reset register usage for default abi. */
for more details. */
void
ix86_call_abi_override (const_tree fndecl)
{
@ -4610,24 +4608,17 @@ ix86_call_abi_override (const_tree fndecl)
cfun->machine->call_abi = DEFAULT_ABI;
else
cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
if (TARGET_64BIT && cfun->machine->call_abi == MS_ABI)
{
if (call_used_regs[4 /*RSI*/] != 0 || call_used_regs[5 /*RDI*/] != 0)
{
call_used_regs[4 /*RSI*/] = 0;
call_used_regs[5 /*RDI*/] = 0;
init_regs ();
}
}
else if (TARGET_64BIT)
{
if (call_used_regs[4 /*RSI*/] != 1 || call_used_regs[5 /*RDI*/] != 1)
{
call_used_regs[4 /*RSI*/] = 1;
call_used_regs[5 /*RDI*/] = 1;
init_regs ();
}
}
}
/* MS and SYSV ABI have different set of call used registers. Avoid expensive
re-initialization of init_regs each time we switch function context since
this is needed only during RTL expansion. */
static void
ix86_maybe_switch_abi (void)
{
if (TARGET_64BIT &&
call_used_regs[4 /*RSI*/] == (cfun->machine->call_abi == MS_ABI))
init_regs ();
}
/* Initialize a variable CUM of type CUMULATIVE_ARGS
@ -29243,6 +29234,9 @@ ix86_enum_va_list (int idx, const char **pname, tree *ptree)
#undef TARGET_OPTION_CAN_INLINE_P
#define TARGET_OPTION_CAN_INLINE_P ix86_can_inline_p
#undef TARGET_EXPAND_TO_RTL_HOOK
#define TARGET_EXPAND_TO_RTL_HOOK ix86_maybe_switch_abi
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-i386.h"

View File

@ -964,7 +964,9 @@ do { \
for (i = FIRST_REX_SSE_REG; i <= LAST_REX_SSE_REG; i++) \
reg_names[i] = ""; \
} \
if (TARGET_64BIT && DEFAULT_ABI == MS_ABI) \
if (TARGET_64BIT \
&& ((cfun && cfun->machine->call_abi == MS_ABI) \
|| (!cfun && DEFAULT_ABI == MS_ABI))) \
{ \
call_used_regs[4 /*RSI*/] = 0; \
call_used_regs[5 /*RDI*/] = 0; \