Commit 84879759 by Richard Sandiford Committed by Richard Sandiford

mips.c (mips_frame_info): Add cprestore_size field.

	* config/mips/mips.c (mips_frame_info): Add cprestore_size field.
	(compute_frame_size): Initialize it.  Remove the .cprestore slot
	from args_size.
	(mips_output_function_prologue): Simplify accordingly.
	(mips_debugger_offset): Change the mips16 frame pointer offset from
	current_function_outgoing_args to cfun->machine->frame.args_size.
	(mips_initial_elimination_offset): Likewise.
	(mips_expand_prologue): Likewise.
	(mips_expand_epilogue): Likewise.

From-SVN: r72222
parent ef1b5bbb
2003-10-08 Richard Sandiford <rsandifo@redhat.com> 2003-10-08 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips.c (mips_frame_info): Add cprestore_size field.
(compute_frame_size): Initialize it. Remove the .cprestore slot
from args_size.
(mips_output_function_prologue): Simplify accordingly.
(mips_debugger_offset): Change the mips16 frame pointer offset from
current_function_outgoing_args to cfun->machine->frame.args_size.
(mips_initial_elimination_offset): Likewise.
(mips_expand_prologue): Likewise.
(mips_expand_epilogue): Likewise.
2003-10-08 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips.h (EXTRA_CONSTRAINT): Add 'W' constraint. * config/mips/mips.h (EXTRA_CONSTRAINT): Add 'W' constraint.
(EXTRA_MEMORY_CONSTRAINT): Define. (EXTRA_MEMORY_CONSTRAINT): Define.
(CAN_ELIMINATE): Remove lwu workaround. (CAN_ELIMINATE): Remove lwu workaround.
......
...@@ -297,6 +297,7 @@ struct mips_frame_info GTY(()) ...@@ -297,6 +297,7 @@ struct mips_frame_info GTY(())
long total_size; /* # bytes that the entire frame takes up */ long total_size; /* # bytes that the entire frame takes up */
long var_size; /* # bytes that variables take up */ long var_size; /* # bytes that variables take up */
long args_size; /* # bytes that outgoing arguments take up */ long args_size; /* # bytes that outgoing arguments take up */
long cprestore_size; /* # bytes that the .cprestore slot takes up */
int gp_reg_size; /* # bytes needed to store gp regs */ int gp_reg_size; /* # bytes needed to store gp regs */
int fp_reg_size; /* # bytes needed to store fp regs */ int fp_reg_size; /* # bytes needed to store fp regs */
long mask; /* mask of saved gp registers */ long mask; /* mask of saved gp registers */
...@@ -5107,7 +5108,7 @@ mips_debugger_offset (rtx addr, HOST_WIDE_INT offset) ...@@ -5107,7 +5108,7 @@ mips_debugger_offset (rtx addr, HOST_WIDE_INT offset)
/* MIPS16 frame is smaller */ /* MIPS16 frame is smaller */
if (frame_pointer_needed && TARGET_MIPS16) if (frame_pointer_needed && TARGET_MIPS16)
frame_size -= current_function_outgoing_args_size; frame_size -= cfun->machine->frame.args_size;
offset = offset - frame_size; offset = offset - frame_size;
} }
...@@ -6102,6 +6103,7 @@ compute_frame_size (HOST_WIDE_INT size) ...@@ -6102,6 +6103,7 @@ compute_frame_size (HOST_WIDE_INT size)
HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up */ HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up */
HOST_WIDE_INT var_size; /* # bytes that variables take up */ HOST_WIDE_INT var_size; /* # bytes that variables take up */
HOST_WIDE_INT args_size; /* # bytes that outgoing arguments take up */ HOST_WIDE_INT args_size; /* # bytes that outgoing arguments take up */
HOST_WIDE_INT cprestore_size; /* # bytes that the cprestore slot takes up */
HOST_WIDE_INT gp_reg_rounded; /* # bytes needed to store gp after rounding */ HOST_WIDE_INT gp_reg_rounded; /* # bytes needed to store gp after rounding */
HOST_WIDE_INT gp_reg_size; /* # bytes needed to store gp regs */ HOST_WIDE_INT gp_reg_size; /* # bytes needed to store gp regs */
HOST_WIDE_INT fp_reg_size; /* # bytes needed to store fp regs */ HOST_WIDE_INT fp_reg_size; /* # bytes needed to store fp regs */
...@@ -6115,13 +6117,14 @@ compute_frame_size (HOST_WIDE_INT size) ...@@ -6115,13 +6117,14 @@ compute_frame_size (HOST_WIDE_INT size)
mask = 0; mask = 0;
fmask = 0; fmask = 0;
var_size = MIPS_STACK_ALIGN (size); var_size = MIPS_STACK_ALIGN (size);
args_size = MIPS_STACK_ALIGN (STARTING_FRAME_OFFSET); args_size = current_function_outgoing_args_size;
cprestore_size = MIPS_STACK_ALIGN (STARTING_FRAME_OFFSET) - args_size;
/* The space set aside by STARTING_FRAME_OFFSET isn't needed in leaf /* The space set aside by STARTING_FRAME_OFFSET isn't needed in leaf
functions. If the function has local variables, we're committed functions. If the function has local variables, we're committed
to allocating it anyway. Otherwise reclaim it here. */ to allocating it anyway. Otherwise reclaim it here. */
if (var_size == 0 && current_function_is_leaf) if (var_size == 0 && current_function_is_leaf)
args_size = 0; cprestore_size = args_size = 0;
/* The MIPS 3.0 linker does not like functions that dynamically /* The MIPS 3.0 linker does not like functions that dynamically
allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it
...@@ -6131,7 +6134,7 @@ compute_frame_size (HOST_WIDE_INT size) ...@@ -6131,7 +6134,7 @@ compute_frame_size (HOST_WIDE_INT size)
if (args_size == 0 && current_function_calls_alloca) if (args_size == 0 && current_function_calls_alloca)
args_size = 4 * UNITS_PER_WORD; args_size = 4 * UNITS_PER_WORD;
total_size = var_size + args_size; total_size = var_size + args_size + cprestore_size;
/* Calculate space needed for gp registers. */ /* Calculate space needed for gp registers. */
for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++) for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
...@@ -6180,6 +6183,7 @@ compute_frame_size (HOST_WIDE_INT size) ...@@ -6180,6 +6183,7 @@ compute_frame_size (HOST_WIDE_INT size)
cfun->machine->frame.total_size = total_size; cfun->machine->frame.total_size = total_size;
cfun->machine->frame.var_size = var_size; cfun->machine->frame.var_size = var_size;
cfun->machine->frame.args_size = args_size; cfun->machine->frame.args_size = args_size;
cfun->machine->frame.cprestore_size = cprestore_size;
cfun->machine->frame.gp_reg_size = gp_reg_size; cfun->machine->frame.gp_reg_size = gp_reg_size;
cfun->machine->frame.fp_reg_size = fp_reg_size; cfun->machine->frame.fp_reg_size = fp_reg_size;
cfun->machine->frame.mask = mask; cfun->machine->frame.mask = mask;
...@@ -6192,7 +6196,8 @@ compute_frame_size (HOST_WIDE_INT size) ...@@ -6192,7 +6196,8 @@ compute_frame_size (HOST_WIDE_INT size)
{ {
unsigned long offset; unsigned long offset;
offset = args_size + var_size + gp_reg_size - GET_MODE_SIZE (gpr_mode); offset = (args_size + cprestore_size + var_size
+ gp_reg_size - GET_MODE_SIZE (gpr_mode));
cfun->machine->frame.gp_sp_offset = offset; cfun->machine->frame.gp_sp_offset = offset;
cfun->machine->frame.gp_save_offset = offset - total_size; cfun->machine->frame.gp_save_offset = offset - total_size;
} }
...@@ -6204,7 +6209,7 @@ compute_frame_size (HOST_WIDE_INT size) ...@@ -6204,7 +6209,7 @@ compute_frame_size (HOST_WIDE_INT size)
if (fmask) if (fmask)
{ {
unsigned long offset = (args_size + var_size unsigned long offset = (args_size + cprestore_size + var_size
+ gp_reg_rounded + fp_reg_size + gp_reg_rounded + fp_reg_size
- FP_INC * UNITS_PER_FPREG); - FP_INC * UNITS_PER_FPREG);
cfun->machine->frame.fp_sp_offset = offset; cfun->machine->frame.fp_sp_offset = offset;
...@@ -6229,6 +6234,8 @@ mips_initial_elimination_offset (int from, int to) ...@@ -6229,6 +6234,8 @@ mips_initial_elimination_offset (int from, int to)
{ {
int offset; int offset;
compute_frame_size (get_frame_size ());
/* Set OFFSET to the offset from the stack pointer. */ /* Set OFFSET to the offset from the stack pointer. */
switch (from) switch (from)
{ {
...@@ -6237,7 +6244,6 @@ mips_initial_elimination_offset (int from, int to) ...@@ -6237,7 +6244,6 @@ mips_initial_elimination_offset (int from, int to)
break; break;
case ARG_POINTER_REGNUM: case ARG_POINTER_REGNUM:
compute_frame_size (get_frame_size ());
offset = cfun->machine->frame.total_size; offset = cfun->machine->frame.total_size;
if (mips_abi == ABI_N32 || mips_abi == ABI_64) if (mips_abi == ABI_N32 || mips_abi == ABI_64)
offset -= current_function_pretend_args_size; offset -= current_function_pretend_args_size;
...@@ -6248,7 +6254,7 @@ mips_initial_elimination_offset (int from, int to) ...@@ -6248,7 +6254,7 @@ mips_initial_elimination_offset (int from, int to)
} }
if (TARGET_MIPS16 && to == HARD_FRAME_POINTER_REGNUM) if (TARGET_MIPS16 && to == HARD_FRAME_POINTER_REGNUM)
offset -= current_function_outgoing_args_size; offset -= cfun->machine->frame.args_size;
return offset; return offset;
} }
...@@ -6372,19 +6378,18 @@ mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED) ...@@ -6372,19 +6378,18 @@ mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
{ {
/* .frame FRAMEREG, FRAMESIZE, RETREG */ /* .frame FRAMEREG, FRAMESIZE, RETREG */
fprintf (file, fprintf (file,
"\t.frame\t%s,%ld,%s\t\t# vars= %ld, regs= %d/%d, args= %d, gp= %ld\n", "\t.frame\t%s,%ld,%s\t\t# vars= %ld, regs= %d/%d, args= %ld, gp= %ld\n",
(reg_names[(frame_pointer_needed) (reg_names[(frame_pointer_needed)
? HARD_FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM]), ? HARD_FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM]),
((frame_pointer_needed && TARGET_MIPS16) ((frame_pointer_needed && TARGET_MIPS16)
? ((long) tsize - current_function_outgoing_args_size) ? ((long) tsize - cfun->machine->frame.args_size)
: (long) tsize), : (long) tsize),
reg_names[GP_REG_FIRST + 31], reg_names[GP_REG_FIRST + 31],
cfun->machine->frame.var_size, cfun->machine->frame.var_size,
cfun->machine->frame.num_gp, cfun->machine->frame.num_gp,
cfun->machine->frame.num_fp, cfun->machine->frame.num_fp,
current_function_outgoing_args_size, cfun->machine->frame.args_size,
cfun->machine->frame.args_size cfun->machine->frame.cprestore_size);
- current_function_outgoing_args_size);
/* .mask MASK, GPOFFSET; .fmask FPOFFSET */ /* .mask MASK, GPOFFSET; .fmask FPOFFSET */
fprintf (file, "\t.mask\t0x%08lx,%ld\n\t.fmask\t0x%08lx,%ld\n", fprintf (file, "\t.mask\t0x%08lx,%ld\n\t.fmask\t0x%08lx,%ld\n",
...@@ -6562,9 +6567,9 @@ mips_expand_prologue (void) ...@@ -6562,9 +6567,9 @@ mips_expand_prologue (void)
acceesed with unextended instructions. */ acceesed with unextended instructions. */
if (frame_pointer_needed) if (frame_pointer_needed)
{ {
if (TARGET_MIPS16 && current_function_outgoing_args_size != 0) if (TARGET_MIPS16 && cfun->machine->frame.args_size != 0)
{ {
rtx offset = GEN_INT (current_function_outgoing_args_size); rtx offset = GEN_INT (cfun->machine->frame.args_size);
RTX_FRAME_RELATED_P RTX_FRAME_RELATED_P
(emit_insn (gen_add3_insn (hard_frame_pointer_rtx, (emit_insn (gen_add3_insn (hard_frame_pointer_rtx,
stack_pointer_rtx, stack_pointer_rtx,
...@@ -6718,7 +6723,7 @@ mips_expand_epilogue (int sibcall_p) ...@@ -6718,7 +6723,7 @@ mips_expand_epilogue (int sibcall_p)
{ {
base = hard_frame_pointer_rtx; base = hard_frame_pointer_rtx;
if (TARGET_MIPS16) if (TARGET_MIPS16)
step1 -= current_function_outgoing_args_size; step1 -= cfun->machine->frame.args_size;
} }
/* If we need to restore registers, deallocate as much stack as /* If we need to restore registers, deallocate as much stack as
......
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