Commit 4f5dfed0 by Josh Conner Committed by Paul Brook

arm.c (arm_size_return_regs): New.

2005-05-13  Josh Conner  <jconner@apple.com>

	* config/arm/arm.c (arm_size_return_regs): New.
	(thumb_unexpanded_epilogue): replace in-line calculation
	of return registers with call to arm_size_return_regs.
	(use_return_insn): Include test of which registers are
	being used to hold return values, to accommodate
	vector return values.

From-SVN: r99679
parent 9c309ac9
2005-05-13 Josh Conner <jconner@apple.com>
* config/arm/arm.c (arm_size_return_regs): New.
(thumb_unexpanded_epilogue): replace in-line calculation
of return registers with call to arm_size_return_regs.
(use_return_insn): Include test of which registers are
being used to hold return values, to accommodate
vector return values.
2005-05-11 Aldy Hernandez <aldyh@redhat.com> 2005-05-11 Aldy Hernandez <aldyh@redhat.com>
* config/rs6000/sysv4.opt (mlittle): Handle. * config/rs6000/sysv4.opt (mlittle): Handle.
......
...@@ -73,6 +73,7 @@ static int thumb_far_jump_used_p (void); ...@@ -73,6 +73,7 @@ static int thumb_far_jump_used_p (void);
static bool thumb_force_lr_save (void); static bool thumb_force_lr_save (void);
static int const_ok_for_op (HOST_WIDE_INT, enum rtx_code); static int const_ok_for_op (HOST_WIDE_INT, enum rtx_code);
static rtx emit_sfm (int, int); static rtx emit_sfm (int, int);
static int arm_size_return_regs (void);
#ifndef AOF_ASSEMBLER #ifndef AOF_ASSEMBLER
static bool arm_assemble_integer (rtx, unsigned int, int); static bool arm_assemble_integer (rtx, unsigned int, int);
#endif #endif
...@@ -1465,9 +1466,11 @@ use_return_insn (int iscond, rtx sibling) ...@@ -1465,9 +1466,11 @@ use_return_insn (int iscond, rtx sibling)
if (!call_used_regs[3]) if (!call_used_regs[3])
return 0; return 0;
/* ... that it isn't being used for a return value (always true /* ... that it isn't being used for a return value ... */
until we implement return-in-regs), or for a tail-call if (arm_size_return_regs () >= (4 * UNITS_PER_WORD))
argument ... */ return 0;
/* ... or for a tail-call argument ... */
if (sibling) if (sibling)
{ {
gcc_assert (GET_CODE (sibling) == CALL_INSN); gcc_assert (GET_CODE (sibling) == CALL_INSN);
...@@ -9851,6 +9854,20 @@ emit_multi_reg_push (unsigned long mask) ...@@ -9851,6 +9854,20 @@ emit_multi_reg_push (unsigned long mask)
return par; return par;
} }
/* Calculate the size of the return value that is passed in registers. */
static int
arm_size_return_regs (void)
{
enum machine_mode mode;
if (current_function_return_rtx != 0)
mode = GET_MODE (current_function_return_rtx);
else
mode = DECL_MODE (DECL_RESULT (current_function_decl));
return GET_MODE_SIZE (mode);
}
static rtx static rtx
emit_sfm (int base_reg, int count) emit_sfm (int base_reg, int count)
{ {
...@@ -12920,13 +12937,7 @@ thumb_unexpanded_epilogue (void) ...@@ -12920,13 +12937,7 @@ thumb_unexpanded_epilogue (void)
This is more reliable that examining regs_ever_live[] because that This is more reliable that examining regs_ever_live[] because that
will be set if the register is ever used in the function, not just if will be set if the register is ever used in the function, not just if
the register is used to hold a return value. */ the register is used to hold a return value. */
size = arm_size_return_regs ();
if (current_function_return_rtx != 0)
mode = GET_MODE (current_function_return_rtx);
else
mode = DECL_MODE (DECL_RESULT (current_function_decl));
size = GET_MODE_SIZE (mode);
/* The prolog may have pushed some high registers to use as /* The prolog may have pushed some high registers to use as
work registers. e.g. the testsuite file: work registers. e.g. the testsuite file:
......
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