picochip-protos.h (picochip_function_arg): Delete.
* config/picochip/picochip-protos.h (picochip_function_arg): Delete. (picochip_incoming_function_arg): Delete. (picochip_arg_advance): Delete. * config/picochip/picochip.h (FUNCTION_ARG): Delete. (FUNCTION_INCOMING_ARG): Delete. (FUNCTION_ARG_ADVANCE): Delete. * config/picochip/picochip.c (picochip_function_arg): Take a const_tree and a bool. (picochip_incoming_function_arg): Likewise. (picochip_arg_advance): Likewise. (TARGET_FUNCTION_ARG, TARGET_FUNCTION_INCOMING_ARG): Define. (TARGET_FUNCTION_ARG_ADVANCE): Define. From-SVN: r165312
This commit is contained in:
parent
3414bf5384
commit
c159751bf5
@ -1,3 +1,19 @@
|
|||||||
|
2010-10-11 Hariharan Sandanagobalane <hariharan@picochip.com>
|
||||||
|
|
||||||
|
Nathan Froyds patch to hooks FUNCTION_ARG etc.
|
||||||
|
* config/picochip/picochip-protos.h (picochip_function_arg): Delete.
|
||||||
|
(picochip_incoming_function_arg): Delete.
|
||||||
|
(picochip_arg_advance): Delete.
|
||||||
|
* config/picochip/picochip.h (FUNCTION_ARG): Delete.
|
||||||
|
(FUNCTION_INCOMING_ARG): Delete.
|
||||||
|
(FUNCTION_ARG_ADVANCE): Delete.
|
||||||
|
* config/picochip/picochip.c (picochip_function_arg): Take a
|
||||||
|
const_tree and a bool.
|
||||||
|
(picochip_incoming_function_arg): Likewise.
|
||||||
|
(picochip_arg_advance): Likewise.
|
||||||
|
(TARGET_FUNCTION_ARG, TARGET_FUNCTION_INCOMING_ARG): Define.
|
||||||
|
(TARGET_FUNCTION_ARG_ADVANCE): Define.
|
||||||
|
|
||||||
2010-10-11 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
|
2010-10-11 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
|
||||||
|
|
||||||
PR middle-end/45955
|
PR middle-end/45955
|
||||||
|
@ -54,13 +54,6 @@ extern bool ok_to_peephole_ldw(rtx opnd0, rtx opnd1, rtx opnd2, rtx opnd3);
|
|||||||
|
|
||||||
extern rtx gen_min_reg(rtx opnd1,rtx opnd2);
|
extern rtx gen_min_reg(rtx opnd1,rtx opnd2);
|
||||||
|
|
||||||
extern rtx picochip_function_arg (CUMULATIVE_ARGS cum, int mode, tree type,
|
|
||||||
int named);
|
|
||||||
|
|
||||||
extern rtx picochip_incoming_function_arg (CUMULATIVE_ARGS, int, tree, int);
|
|
||||||
extern CUMULATIVE_ARGS picochip_arg_advance (CUMULATIVE_ARGS cum, int mode,
|
|
||||||
tree type, int named);
|
|
||||||
|
|
||||||
extern int picochip_regno_nregs (int regno, int mode);
|
extern int picochip_regno_nregs (int regno, int mode);
|
||||||
extern int picochip_class_max_nregs (int klass, int mode);
|
extern int picochip_class_max_nregs (int klass, int mode);
|
||||||
|
|
||||||
|
@ -81,6 +81,14 @@ void picochip_reorg (void);
|
|||||||
int picochip_arg_partial_bytes (CUMULATIVE_ARGS * p_cum,
|
int picochip_arg_partial_bytes (CUMULATIVE_ARGS * p_cum,
|
||||||
enum machine_mode mode,
|
enum machine_mode mode,
|
||||||
tree type, bool named);
|
tree type, bool named);
|
||||||
|
rtx picochip_function_arg (CUMULATIVE_ARGS * p_cum,
|
||||||
|
enum machine_mode mode,
|
||||||
|
const_tree type, bool named);
|
||||||
|
rtx picochip_incoming_function_arg (CUMULATIVE_ARGS * p_cum,
|
||||||
|
enum machine_mode mode,
|
||||||
|
const_tree type, bool named);
|
||||||
|
void picochip_arg_advance (CUMULATIVE_ARGS * p_cum, enum machine_mode mode,
|
||||||
|
const_tree type, bool named);
|
||||||
|
|
||||||
int picochip_sched_lookahead (void);
|
int picochip_sched_lookahead (void);
|
||||||
int picochip_sched_issue_rate (void);
|
int picochip_sched_issue_rate (void);
|
||||||
@ -262,6 +270,15 @@ static char picochip_get_vliw_alu_id (void);
|
|||||||
#undef TARGET_ARG_PARTIAL_BYTES
|
#undef TARGET_ARG_PARTIAL_BYTES
|
||||||
#define TARGET_ARG_PARTIAL_BYTES picochip_arg_partial_bytes
|
#define TARGET_ARG_PARTIAL_BYTES picochip_arg_partial_bytes
|
||||||
|
|
||||||
|
#undef TARGET_FUNCTION_ARG
|
||||||
|
#define TARGET_FUNCTION_ARG picochip_function_arg
|
||||||
|
|
||||||
|
#undef TARGET_FUNCTION_INCOMING_ARG
|
||||||
|
#define TARGET_FUNCTION_INCOMING_ARG picochip_incoming_function_arg
|
||||||
|
|
||||||
|
#undef TARGET_FUNCTION_ARG_ADVANCE
|
||||||
|
#define TARGET_FUNCTION_ARG_ADVANCE picochip_arg_advance
|
||||||
|
|
||||||
#undef TARGET_PROMOTE_FUNCTION_MODE
|
#undef TARGET_PROMOTE_FUNCTION_MODE
|
||||||
#define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
|
#define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
|
||||||
#undef TARGET_PROMOTE_PROTOTYPES
|
#undef TARGET_PROMOTE_PROTOTYPES
|
||||||
@ -315,12 +332,6 @@ static char picochip_get_vliw_alu_id (void);
|
|||||||
struct gcc_target targetm = TARGET_INITIALIZER;
|
struct gcc_target targetm = TARGET_INITIALIZER;
|
||||||
|
|
||||||
|
|
||||||
enum unwind_info_type
|
|
||||||
picochip_except_unwind_info (void)
|
|
||||||
{
|
|
||||||
return UI_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Only return a value in memory if it is greater than 4 bytes.
|
/* Only return a value in memory if it is greater than 4 bytes.
|
||||||
int_size_in_bytes returns -1 for variable size objects, which go in
|
int_size_in_bytes returns -1 for variable size objects, which go in
|
||||||
memory always. The cast to unsigned makes -1 > 8. */
|
memory always. The cast to unsigned makes -1 > 8. */
|
||||||
@ -799,7 +810,7 @@ picochip_is_aligned (int byte_offset, int bit_alignment)
|
|||||||
|
|
||||||
/* Compute the size of an argument in units. */
|
/* Compute the size of an argument in units. */
|
||||||
static int
|
static int
|
||||||
picochip_compute_arg_size (tree type, enum machine_mode mode)
|
picochip_compute_arg_size (const_tree type, enum machine_mode mode)
|
||||||
{
|
{
|
||||||
int type_size_in_units = 0;
|
int type_size_in_units = 0;
|
||||||
|
|
||||||
@ -814,8 +825,8 @@ picochip_compute_arg_size (tree type, enum machine_mode mode)
|
|||||||
|
|
||||||
/* Determine where the next outgoing arg should be placed. */
|
/* Determine where the next outgoing arg should be placed. */
|
||||||
rtx
|
rtx
|
||||||
picochip_function_arg (CUMULATIVE_ARGS cum, int mode, tree type,
|
picochip_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
|
||||||
int named ATTRIBUTE_UNUSED)
|
const_tree type, bool named ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
int reg = 0;
|
int reg = 0;
|
||||||
int type_align_in_units = 0;
|
int type_align_in_units = 0;
|
||||||
@ -835,17 +846,17 @@ picochip_function_arg (CUMULATIVE_ARGS cum, int mode, tree type,
|
|||||||
|
|
||||||
/* Compute the correct offset (i.e., ensure that the offset meets
|
/* Compute the correct offset (i.e., ensure that the offset meets
|
||||||
the alignment requirements). */
|
the alignment requirements). */
|
||||||
offset_overflow = cum % type_align_in_units;
|
offset_overflow = *cum % type_align_in_units;
|
||||||
if (offset_overflow == 0)
|
if (offset_overflow == 0)
|
||||||
new_offset = cum;
|
new_offset = *cum;
|
||||||
else
|
else
|
||||||
new_offset = (cum - offset_overflow) + type_align_in_units;
|
new_offset = (*cum - offset_overflow) + type_align_in_units;
|
||||||
|
|
||||||
if (TARGET_DEBUG)
|
if (TARGET_DEBUG)
|
||||||
{
|
{
|
||||||
printf ("Function arg:\n");
|
printf ("Function arg:\n");
|
||||||
printf (" Type valid: %s\n", (type ? "yes" : "no"));
|
printf (" Type valid: %s\n", (type ? "yes" : "no"));
|
||||||
printf (" Cumulative Value: %d\n", cum);
|
printf (" Cumulative Value: %d\n", *cum);
|
||||||
printf (" Mode: %s\n", GET_MODE_NAME (mode));
|
printf (" Mode: %s\n", GET_MODE_NAME (mode));
|
||||||
printf (" Type size: %i units\n", type_size_in_units);
|
printf (" Type size: %i units\n", type_size_in_units);
|
||||||
printf (" Alignment: %i units\n", type_align_in_units);
|
printf (" Alignment: %i units\n", type_align_in_units);
|
||||||
@ -879,7 +890,7 @@ picochip_function_arg (CUMULATIVE_ARGS cum, int mode, tree type,
|
|||||||
case CSImode:
|
case CSImode:
|
||||||
case SCmode:
|
case SCmode:
|
||||||
case CQImode:
|
case CQImode:
|
||||||
return gen_rtx_REG ((enum machine_mode) mode, reg);
|
return gen_rtx_REG (mode, reg);
|
||||||
|
|
||||||
case BLKmode:
|
case BLKmode:
|
||||||
{
|
{
|
||||||
@ -912,8 +923,9 @@ picochip_function_arg (CUMULATIVE_ARGS cum, int mode, tree type,
|
|||||||
passed in registers, which are then pushed onto the stack by the
|
passed in registers, which are then pushed onto the stack by the
|
||||||
function prologue). */
|
function prologue). */
|
||||||
rtx
|
rtx
|
||||||
picochip_incoming_function_arg (CUMULATIVE_ARGS cum, int mode,
|
picochip_incoming_function_arg (CUMULATIVE_ARGS *cum,
|
||||||
tree type, int named)
|
enum machine_mode mode,
|
||||||
|
const_tree type, bool named)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (cfun->stdarg)
|
if (cfun->stdarg)
|
||||||
@ -998,10 +1010,10 @@ picochip_arg_partial_bytes (CUMULATIVE_ARGS * p_cum, enum machine_mode mode,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Advance the cumulative args counter, returning the new counter. */
|
/* Advance the cumulative args counter CUM. */
|
||||||
CUMULATIVE_ARGS
|
void
|
||||||
picochip_arg_advance (const CUMULATIVE_ARGS cum, int mode,
|
picochip_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
|
||||||
tree type, int named ATTRIBUTE_UNUSED)
|
const_tree type, bool named ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
int type_align_in_units = 0;
|
int type_align_in_units = 0;
|
||||||
int type_size_in_units;
|
int type_size_in_units;
|
||||||
@ -1011,7 +1023,7 @@ picochip_arg_advance (const CUMULATIVE_ARGS cum, int mode,
|
|||||||
/* VOIDmode is passed when computing the second argument to a `call'
|
/* VOIDmode is passed when computing the second argument to a `call'
|
||||||
pattern. This can be ignored. */
|
pattern. This can be ignored. */
|
||||||
if (mode == VOIDmode)
|
if (mode == VOIDmode)
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
/* Compute the alignment and size of the parameter. */
|
/* Compute the alignment and size of the parameter. */
|
||||||
type_align_in_units =
|
type_align_in_units =
|
||||||
@ -1020,17 +1032,16 @@ picochip_arg_advance (const CUMULATIVE_ARGS cum, int mode,
|
|||||||
|
|
||||||
/* Compute the correct offset (i.e., ensure that the offset meets
|
/* Compute the correct offset (i.e., ensure that the offset meets
|
||||||
the alignment requirements). */
|
the alignment requirements). */
|
||||||
offset_overflow = cum % type_align_in_units;
|
offset_overflow = *cum % type_align_in_units;
|
||||||
if (offset_overflow == 0)
|
if (offset_overflow == 0)
|
||||||
new_offset = cum;
|
new_offset = *cum;
|
||||||
else
|
else
|
||||||
new_offset = (cum - offset_overflow) + type_align_in_units;
|
new_offset = (*cum - offset_overflow) + type_align_in_units;
|
||||||
|
|
||||||
/* Advance past the last argument. */
|
/* Advance past the last argument. */
|
||||||
new_offset += type_size_in_units;
|
new_offset += type_size_in_units;
|
||||||
|
|
||||||
return new_offset;
|
*cum = new_offset;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine whether a register needs saving/restoring. It does if it
|
/* Determine whether a register needs saving/restoring. It does if it
|
||||||
|
@ -405,22 +405,9 @@ extern const enum reg_class picochip_regno_reg_class[FIRST_PSEUDO_REGISTER];
|
|||||||
/* Store the offset of the next argument. */
|
/* Store the offset of the next argument. */
|
||||||
#define CUMULATIVE_ARGS unsigned
|
#define CUMULATIVE_ARGS unsigned
|
||||||
|
|
||||||
/* Decide how function arguments are handled. */
|
|
||||||
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
|
|
||||||
picochip_function_arg (CUM, MODE, TYPE, NAMED)
|
|
||||||
|
|
||||||
/* Incoming arguments are always the same as normal arguments, except
|
|
||||||
for a function which uses variadic arguments, in which case all
|
|
||||||
arguments are effectively passed on the stack. */
|
|
||||||
#define FUNCTION_INCOMING_ARG(CUM, MODE, TYPE, NAMED) \
|
|
||||||
picochip_incoming_function_arg(CUM, MODE, TYPE, NAMED)
|
|
||||||
|
|
||||||
#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT,N_NAMED_ARGS) \
|
#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT,N_NAMED_ARGS) \
|
||||||
((CUM) = 0)
|
((CUM) = 0)
|
||||||
|
|
||||||
#define FUNCTION_ARG_ADVANCE(CUM,MODE,TYPE,NAMED) \
|
|
||||||
(CUM) = picochip_arg_advance (CUM, MODE, TYPE, NAMED)
|
|
||||||
|
|
||||||
/* Originally this used TYPE_ALIGN to determine the
|
/* Originally this used TYPE_ALIGN to determine the
|
||||||
alignment. Unfortunately, this fails in some cases, because the
|
alignment. Unfortunately, this fails in some cases, because the
|
||||||
type is unknown (e.g., libcall's). Instead, use GET_MODE_ALIGNMENT
|
type is unknown (e.g., libcall's). Instead, use GET_MODE_ALIGNMENT
|
||||||
|
Loading…
Reference in New Issue
Block a user