alpha.c (alpha_return_in_memory): Rename from return_in_memory, make static, change signature to match target hook.

* config/alpha/alpha.c (alpha_return_in_memory): Rename from
        return_in_memory, make static, change signature to match target hook.
        (alpha_setup_incoming_varargs): Make static, change signature to
        match target hook, add code for vms and unicos.
        (TARGET_PROMOTE_FUNCTION_ARGS, TARGET_PROMOTE_FUNCTION_RETURN,
        TARGET_PROMOTE_PROTOTYPES, TARGET_STRUCT_VALUE_RTX,
        TARGET_RETURN_IN_MEMORY, TARGET_SETUP_INCOMING_VARARGS,
        TARGET_STRICT_ARGUMENT_NAMING,
        TARGET_PRETEND_OUTGOING_VARARGS_NAMED): New.
        * config/alpha/alpha-protos.h: Update.
        * config/alpha/alpha.h (PROMOTE_FUNCTION_ARGS,
        PROMOTE_FUNCTION_RETURN, RETURN_IN_MEMORY,
        SETUP_INCOMING_VARARGS): Remove.
        * config/alpha/unicosmk.h (SETUP_INCOMING_VARARGS): Remove.
        * config/alpha/vms.h (SETUP_INCOMING_VARARGS): Remove.

From-SVN: r72338
This commit is contained in:
Richard Henderson 2003-10-11 09:54:17 -07:00 committed by Richard Henderson
parent e99faaaaaf
commit f93c21801e
6 changed files with 91 additions and 109 deletions

View File

@ -1,3 +1,21 @@
2003-10-11 Richard Henderson <rth@redhat.com>
* config/alpha/alpha.c (alpha_return_in_memory): Rename from
return_in_memory, make static, change signature to match target hook.
(alpha_setup_incoming_varargs): Make static, change signature to
match target hook, add code for vms and unicos.
(TARGET_PROMOTE_FUNCTION_ARGS, TARGET_PROMOTE_FUNCTION_RETURN,
TARGET_PROMOTE_PROTOTYPES, TARGET_STRUCT_VALUE_RTX,
TARGET_RETURN_IN_MEMORY, TARGET_SETUP_INCOMING_VARARGS,
TARGET_STRICT_ARGUMENT_NAMING,
TARGET_PRETEND_OUTGOING_VARARGS_NAMED): New.
* config/alpha/alpha-protos.h: Update.
* config/alpha/alpha.h (PROMOTE_FUNCTION_ARGS,
PROMOTE_FUNCTION_RETURN, RETURN_IN_MEMORY,
SETUP_INCOMING_VARARGS): Remove.
* config/alpha/unicosmk.h (SETUP_INCOMING_VARARGS): Remove.
* config/alpha/vms.h (SETUP_INCOMING_VARARGS): Remove.
2003-10-11 Ian Lance Taylor <ian@wasabisystems.com>
* config/arm/arm.c (arm_regno_class): Handle IWMMXT_GR_REGS.

View File

@ -130,13 +130,10 @@ extern void print_operand_address (FILE *, rtx);
extern void alpha_initialize_trampoline (rtx, rtx, rtx, int, int, int);
extern tree alpha_build_va_list (void);
extern void alpha_setup_incoming_varargs (CUMULATIVE_ARGS, enum machine_mode,
tree, int *, int);
extern void alpha_va_start (tree, rtx);
extern rtx alpha_va_arg (tree, tree);
extern rtx function_arg (CUMULATIVE_ARGS, enum machine_mode, tree, int);
extern rtx function_value (tree, tree, enum machine_mode);
extern bool return_in_memory (tree, enum machine_mode);
extern void alpha_start_function (FILE *, const char *, tree);
extern void alpha_end_function (FILE *, const char *, tree);

View File

@ -5983,9 +5983,10 @@ function_arg (CUMULATIVE_ARGS cum, enum machine_mode mode, tree type,
/* Return true if TYPE must be returned in memory, instead of in registers. */
bool
return_in_memory (tree type, enum machine_mode mode)
static bool
alpha_return_in_memory (tree type, tree fndecl ATTRIBUTE_UNUSED)
{
enum machine_mode mode = VOIDmode;
int size;
if (type)
@ -6043,7 +6044,7 @@ function_value (tree valtype, tree func ATTRIBUTE_UNUSED,
enum mode_class class;
#ifdef ENABLE_CHECKING
if (return_in_memory (valtype, mode))
if (alpha_return_in_memory (valtype, func))
abort ();
#endif
@ -6118,27 +6119,59 @@ alpha_build_va_list (void)
}
/* Perform any needed actions needed for a function that is receiving a
variable number of arguments.
variable number of arguments. */
On the Alpha, we allocate space for all 12 arg registers, but only
push those that are remaining. However, if NO registers need to be
saved, don't allocate any space. This is not only because we won't
need the space, but because AP includes the current_pretend_args_size
and we don't want to mess up any ap-relative addresses already made.
If we are not to use the floating-point registers, save the integer
registers where we would put the floating-point registers. This is
not the most efficient way to implement varargs with just one register
class, but it isn't worth doing anything more efficient in this rare
case. */
#if TARGET_ABI_OSF
void
alpha_setup_incoming_varargs(CUMULATIVE_ARGS cum,
enum machine_mode mode ATTRIBUTE_UNUSED,
tree type ATTRIBUTE_UNUSED,
int *pretend_size, int no_rtl)
static void
alpha_setup_incoming_varargs (CUMULATIVE_ARGS *pcum,
enum machine_mode mode ATTRIBUTE_UNUSED,
tree type ATTRIBUTE_UNUSED,
int *pretend_size, int no_rtl)
{
#if TARGET_ABI_UNICOSMK
/* On Unicos/Mk, the standard subroutine __T3E_MISMATCH stores all register
arguments on the stack. Unfortunately, it doesn't always store the first
one (i.e. the one that arrives in $16 or $f16). This is not a problem
with stdargs as we always have at least one named argument there. */
int num_reg_words = pcum->num_reg_words;
if (num_reg_words < 6)
{
if (!no_rtl)
{
emit_insn (gen_umk_mismatch_args (GEN_INT (num_reg_words + 1)));
emit_insn (gen_arg_home_umk ());
}
*pretend_size = 0;
}
#elif TARGET_ABI_OPEN_VMS
/* For VMS, we allocate space for all 6 arg registers plus a count.
However, if NO registers need to be saved, don't allocate any space.
This is not only because we won't need the space, but because AP
includes the current_pretend_args_size and we don't want to mess up
any ap-relative addresses already made. */
if (pcum->num_args < 6)
{
if (!no_rtl)
{
emit_move_insn (gen_rtx_REG (DImode, 1), virtual_incoming_args_rtx);
emit_insn (gen_arg_home ());
}
*pretend_size = 7 * UNITS_PER_WORD;
}
#else
/* On OSF/1 and friends, we allocate space for all 12 arg registers, but
only push those that are remaining. However, if NO registers need to
be saved, don't allocate any space. This is not only because we won't
need the space, but because AP includes the current_pretend_args_size
and we don't want to mess up any ap-relative addresses already made.
If we are not to use the floating-point registers, save the integer
registers where we would put the floating-point registers. This is
not the most efficient way to implement varargs with just one register
class, but it isn't worth doing anything more efficient in this rare
case. */
CUMULATIVE_ARGS cum = *pcum;
if (cum >= 6)
return;
@ -6161,8 +6194,8 @@ alpha_setup_incoming_varargs(CUMULATIVE_ARGS cum,
6 - cum);
}
*pretend_size = 12 * UNITS_PER_WORD;
}
#endif
}
void
alpha_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED)
@ -10146,6 +10179,23 @@ alpha_init_libfuncs (void)
#undef TARGET_MACHINE_DEPENDENT_REORG
#define TARGET_MACHINE_DEPENDENT_REORG alpha_reorg
#undef TARGET_PROMOTE_FUNCTION_ARGS
#define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
#undef TARGET_PROMOTE_FUNCTION_RETURN
#define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
#undef TARGET_PROMOTE_PROTOTYPES
#define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_false
#undef TARGET_STRUCT_VALUE_RTX
#define TARGET_STRUCT_VALUE_RTX hook_rtx_tree_int_null
#undef TARGET_RETURN_IN_MEMORY
#define TARGET_RETURN_IN_MEMORY alpha_return_in_memory
#undef TARGET_SETUP_INCOMING_VARARGS
#define TARGET_SETUP_INCOMING_VARARGS alpha_setup_incoming_varargs
#undef TARGET_STRICT_ARGUMENT_NAMING
#define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
#undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
#define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true
struct gcc_target targetm = TARGET_INITIALIZER;

View File

@ -461,15 +461,6 @@ extern const char *alpha_tls_size_string; /* For -mtls-size= */
(MODE) = DImode; \
}
/* Define this if function arguments should also be promoted using the above
procedure. */
#define PROMOTE_FUNCTION_ARGS
/* Likewise, if the function return value is promoted. */
#define PROMOTE_FUNCTION_RETURN
/* Define this if most significant bit is lowest numbered
in instructions that operate on numbered bit-fields.
@ -1003,15 +994,6 @@ extern int alpha_memory_latency;
#define LIBCALL_VALUE(MODE) \
function_value (NULL, NULL, MODE)
/* The definition of this macro implies that there are cases where
a scalar value cannot be returned in registers.
For the Alpha, any structure or union type is returned in memory, as
are integers whose size is larger than 64 bits. */
#define RETURN_IN_MEMORY(TYPE) \
return_in_memory (TYPE, VOIDmode)
/* 1 if N is a possible register number for a function value
as seen by the caller. */
@ -1096,11 +1078,6 @@ extern int alpha_memory_latency;
((CUM) < 6 && 6 < (CUM) + ALPHA_ARG_SIZE (MODE, TYPE, NAMED) \
? 6 - (CUM) : 0)
/* Perform any needed actions needed for a function that is receiving a
variable number of arguments. */
#define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL) \
alpha_setup_incoming_varargs(CUM,MODE,TYPE,&(PRETEND_SIZE),NO_RTL)
/* Try to output insns to set TARGET equal to the constant C if it can be
done in less than N insns. Do all computations in MODE. Returns the place
where the output has been placed if it can be done and the insns have been

View File

@ -223,30 +223,6 @@ do { \
#undef FUNCTION_ARG_PARTIAL_NREGS
/* #define FUNCTION_ARG_PARTIAL_NREGS(CUM,MODE,TYPE,NAMED) 0 */
/* Perform any needed actions needed for a function that is receiving a
variable number of arguments.
On Unicos/Mk, the standard subroutine __T3E_MISMATCH stores all register
arguments on the stack. Unfortunately, it doesn't always store the first
one (i.e. the one that arrives in $16 or $f16). This is not a problem
with stdargs as we always have at least one named argument there. */
#undef SETUP_INCOMING_VARARGS
#define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL) \
{ if ((CUM).num_reg_words < 6) \
{ \
if (! (NO_RTL)) \
{ \
int start = (CUM).num_reg_words + 1; \
\
emit_insn (gen_umk_mismatch_args (GEN_INT (start))); \
emit_insn (gen_arg_home_umk ()); \
} \
\
PRETEND_SIZE = 0; \
} \
}
/* This ensures that $15 increments/decrements in leaf functions won't get
eliminated. */

View File

@ -202,42 +202,6 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info;
+ ALPHA_ARG_SIZE (MODE, TYPE, NAMED) \
? 6 - (CUM).num_args : 0)
/* Perform any needed actions needed for a function that is receiving a
variable number of arguments.
CUM is as for INIT_CUMULATIVE_ARGS.
MODE and TYPE are the mode and type of the current parameter.
PRETEND_SIZE is a variable that should be set to the amount of stack
that must be pushed by the prolog to pretend that our caller pushed
it.
Normally, this macro will push all remaining incoming registers on the
stack and set PRETEND_SIZE to the length of the registers pushed.
For VMS, we allocate space for all 6 arg registers plus a count.
However, if NO registers need to be saved, don't allocate any space.
This is not only because we won't need the space, but because AP includes
the current_pretend_args_size and we don't want to mess up any
ap-relative addresses already made. */
#undef SETUP_INCOMING_VARARGS
#define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL) \
{ if ((CUM).num_args < 6) \
{ \
if (! (NO_RTL)) \
{ \
emit_move_insn (gen_rtx_REG (DImode, 1), \
virtual_incoming_args_rtx); \
emit_insn (gen_arg_home ()); \
} \
\
PRETEND_SIZE = 7 * UNITS_PER_WORD; \
} \
}
/* ABI has stack checking, but it's broken. */
#undef STACK_CHECK_BUILTIN
#define STACK_CHECK_BUILTIN 0