mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-19 15:10:34 +08:00
mips-protos.h (mips_frame_pointer_required): Declare.
gcc/ * config/mips/mips-protos.h (mips_frame_pointer_required): Declare. * config/mips/mips.h (FRAME_POINTER_REQUIRED): Use mips_hard_frame_pointer_required. (CAN_ELIMINATE): Rely on FRAME_POINTER_REQUIRED to check for large MIPS16 frames. * config/mips/mips.c (mips_frame_pointer_required): New function. gcc/testsuite/ * gcc.target/mips/save-restore-3.c: Don't clobber $17. From-SVN: r129459
This commit is contained in:
parent
f374e413a7
commit
29c4d304fd
@ -1,3 +1,12 @@
|
||||
2007-10-18 Richard Sandiford <rsandifo@nildram.co.uk>
|
||||
|
||||
* config/mips/mips-protos.h (mips_frame_pointer_required): Declare.
|
||||
* config/mips/mips.h (FRAME_POINTER_REQUIRED): Use
|
||||
mips_hard_frame_pointer_required.
|
||||
(CAN_ELIMINATE): Rely on FRAME_POINTER_REQUIRED to check for
|
||||
large MIPS16 frames.
|
||||
* config/mips/mips.c (mips_frame_pointer_required): New function.
|
||||
|
||||
2007-10-18 Richard Sandiford <rsandifo@nildram.co.uk>
|
||||
|
||||
* config/mips/mips.c (mips_frame_info): Add arg_pointer_offset
|
||||
|
@ -255,6 +255,7 @@ extern void mips_finish_declare_object (FILE *, tree, int, int);
|
||||
|
||||
extern bool mips_small_data_pattern_p (rtx);
|
||||
extern rtx mips_rewrite_small_data (rtx);
|
||||
extern bool mips_frame_pointer_required (void);
|
||||
extern HOST_WIDE_INT compute_frame_size (HOST_WIDE_INT);
|
||||
extern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
|
||||
extern rtx mips_return_addr (int, rtx);
|
||||
|
@ -8030,6 +8030,30 @@ mips_current_loadgp_style (void)
|
||||
return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
|
||||
}
|
||||
|
||||
/* Implement FRAME_POINTER_REQUIRED. */
|
||||
|
||||
bool
|
||||
mips_frame_pointer_required (void)
|
||||
{
|
||||
/* If the function contains dynamic stack allocations, we need to
|
||||
use the frame pointer to access the static parts of the frame. */
|
||||
if (current_function_calls_alloca)
|
||||
return true;
|
||||
|
||||
/* In MIPS16 mode, we need a frame pointer for a large frame; otherwise,
|
||||
reload may be unable to compute the address of a local variable,
|
||||
since there is no way to add a large constant to the stack pointer
|
||||
without using a second temporary register. */
|
||||
if (TARGET_MIPS16)
|
||||
{
|
||||
compute_frame_size (get_frame_size ());
|
||||
if (!SMALL_OPERAND (cfun->machine->frame.total_size))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Implement INITIAL_ELIMINATION_OFFSET. FROM is either the frame
|
||||
pointer or argument pointer. TO is either the stack pointer or
|
||||
hard frame pointer. */
|
||||
|
@ -1585,11 +1585,7 @@ enum mips_code_readable_setting {
|
||||
#define HARD_FRAME_POINTER_REGNUM \
|
||||
(TARGET_MIPS16 ? GP_REG_FIRST + 17 : GP_REG_FIRST + 30)
|
||||
|
||||
/* Value should be nonzero if functions must have frame pointers.
|
||||
Zero means the frame pointer need not be set up (and parms
|
||||
may be accessed via the stack pointer) in functions that seem suitable.
|
||||
This is computed in `reload', in reload1.c. */
|
||||
#define FRAME_POINTER_REQUIRED (current_function_calls_alloca)
|
||||
#define FRAME_POINTER_REQUIRED (mips_frame_pointer_required ())
|
||||
|
||||
/* Register in which static-chain is passed to a function. */
|
||||
#define STATIC_CHAIN_REGNUM (GP_REG_FIRST + 2)
|
||||
@ -1916,18 +1912,10 @@ enum reg_class
|
||||
{ FRAME_POINTER_REGNUM, GP_REG_FIRST + 30}, \
|
||||
{ FRAME_POINTER_REGNUM, GP_REG_FIRST + 17}}
|
||||
|
||||
/* We can always eliminate to the hard frame pointer. We can eliminate
|
||||
to the stack pointer unless a frame pointer is needed.
|
||||
|
||||
In mips16 mode, we need a frame pointer for a large frame; otherwise,
|
||||
reload may be unable to compute the address of a local variable,
|
||||
since there is no way to add a large constant to the stack pointer
|
||||
without using a temporary register. */
|
||||
#define CAN_ELIMINATE(FROM, TO) \
|
||||
((TO) == HARD_FRAME_POINTER_REGNUM \
|
||||
|| ((TO) == STACK_POINTER_REGNUM && !frame_pointer_needed \
|
||||
&& (!TARGET_MIPS16 \
|
||||
|| compute_frame_size (get_frame_size ()) < 32768)))
|
||||
/* Make sure that we're not trying to eliminate to the wrong hard frame
|
||||
pointer. */
|
||||
#define CAN_ELIMINATE(FROM, TO) \
|
||||
((TO) == HARD_FRAME_POINTER_REGNUM || (TO) == STACK_POINTER_REGNUM)
|
||||
|
||||
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
|
||||
(OFFSET) = mips_initial_elimination_offset ((FROM), (TO))
|
||||
|
@ -1,3 +1,7 @@
|
||||
2007-10-18 Richard Sandiford <rsandifo@nildram.co.uk>
|
||||
|
||||
* gcc.target/mips/save-restore-3.c: Don't clobber $17.
|
||||
|
||||
2007-10-18 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/33233
|
||||
|
@ -12,7 +12,7 @@ foo (int *a, int b, int c)
|
||||
int x[0x4000];
|
||||
asm volatile ("" ::: "$2", "$3", "$4", "$5", "$6", "$7", "$8",
|
||||
"$9", "$10", "$11", "$12", "$13", "$14", "$15", "$16",
|
||||
"$17", "$18", "$19", "$20", "$21", "$22", "$23", "$24",
|
||||
"$18", "$19", "$20", "$21", "$22", "$23", "$24",
|
||||
"$25", "$30", "memory");
|
||||
bar (x);
|
||||
a[b] = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user