Commit 1e7a71c1 by Clinton Popetz Committed by Clinton Popetz

mips.c (mips_va_arg): For EABI...

        * config/mips/mips.c (mips_va_arg): For EABI, emit the queued
        integer vararg POSTINCREMENT before the destination of the jump
        for the hard fp case.
        (function_arg_pass_by_reference): Pass a copy of CUM to
	FUNCTION_ARG.

        * config/mips/mips.h (GO_IF_LEGITIMATE_ADDRESS): Move check
        for CONSTANT_ADDRESS_P above while loop for subreg.

From-SVN: r31328
parent a249decd
2000-01-11 Clinton Popetz <cpopetz@cygnus.com>
* config/mips/mips.c (mips_va_arg): For EABI, emit the queued
integer vararg POSTINCREMENT before the destination of the jump
for the hard fp case.
(function_arg_pass_by_reference): Pass a copy of CUM to
FUNCTION_ARG.
* config/mips/mips.h (GO_IF_LEGITIMATE_ADDRESS): Move check
for CONSTANT_ADDRESS_P above while loop for subreg.
2000-01-11 Clinton Popetz <cpopetz@cygnus.com>
* flow.c (propagate_block): When a prologue/epilogue insn
is marked dead, unconditionally clear libcall_is_dead and
insn_is_dead, and only dump rtl if warnings aren't being
......
......@@ -4226,6 +4226,9 @@ mips_va_arg (valist, type)
if (r != addr_rtx)
emit_move_insn (addr_rtx, r);
/* Ensure that the above POSTINCREMENT is emitted before lab_over */
emit_queue();
if (lab_over)
emit_label (lab_over);
......@@ -7449,9 +7452,16 @@ function_arg_pass_by_reference (cum, mode, type, named)
to prevent it, or add code to function.c to properly handle the case. */
/* ??? cum can be NULL when called from mips_va_arg. The problem handled
here hopefully is not relevant to mips_va_arg. */
if (cum && FUNCTION_ARG (*cum, mode, type, named) != 0
&& MUST_PASS_IN_STACK (mode, type))
return 1;
if (cum && MUST_PASS_IN_STACK (mode, type))
{
/* Don't pass the actual CUM to FUNCTION_ARG, because we would
get double copies of any offsets generated for small structs
passed in registers. */
CUMULATIVE_ARGS temp = *cum;
if (FUNCTION_ARG (temp, mode, type, named) != 0)
return 1;
}
/* Otherwise, we only do this if EABI is selected. */
if (mips_abi != ABI_EABI)
......
......@@ -2804,6 +2804,13 @@ typedef struct mips_args {
GO_DEBUG_RTX (xinsn); \
} \
\
/* Check for constant before stripping off SUBREG, so that we don't \
accept (subreg (const_int)) which will fail to reload. */ \
if (CONSTANT_ADDRESS_P (xinsn) \
&& ! (mips_split_addresses && mips_check_split (xinsn, MODE)) \
&& (! TARGET_MIPS16 || mips16_constant (xinsn, MODE, 1, 0))) \
goto ADDR; \
\
while (GET_CODE (xinsn) == SUBREG) \
xinsn = SUBREG_REG (xinsn); \
\
......@@ -2812,11 +2819,6 @@ typedef struct mips_args {
if (GET_CODE (xinsn) == REG && REG_MODE_OK_FOR_BASE_P (xinsn, MODE)) \
goto ADDR; \
\
if (CONSTANT_ADDRESS_P (xinsn) \
&& ! (mips_split_addresses && mips_check_split (xinsn, MODE)) \
&& (! TARGET_MIPS16 || mips16_constant (xinsn, MODE, 1, 0))) \
goto ADDR; \
\
if (GET_CODE (xinsn) == LO_SUM && mips_split_addresses) \
{ \
register rtx xlow0 = XEXP (xinsn, 0); \
......
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