mips.c (save_restore_insns): Remove GP from the restore registers mask early instead of special casing it...

* config/mips/mips.c (save_restore_insns): Remove GP from the
        restore registers mask early instead of special casing it inside
        the loop.

From-SVN: r46853
This commit is contained in:
Richard Henderson 2001-11-08 11:20:38 -08:00 committed by Richard Henderson
parent 8ac9ea616e
commit c8a14e0e9a
2 changed files with 51 additions and 40 deletions

View File

@ -1,3 +1,9 @@
2001-11-08 Richard Henderson <rth@redhat.com>
* config/mips/mips.c (save_restore_insns): Remove GP from the
restore registers mask early instead of special casing it inside
the loop.
2001-11-08 Neil Booth <neil@daikokuya.demon.co.uk>
* cp/decl.c (shadow_warning): New function.

View File

@ -6659,6 +6659,7 @@ save_restore_insns (store_p, large_reg, large_offset, file)
{
long mask = current_frame_info.mask;
long fmask = current_frame_info.fmask;
long real_mask = mask;
int regno;
rtx base_reg_rtx;
HOST_WIDE_INT base_offset;
@ -6671,6 +6672,12 @@ save_restore_insns (store_p, large_reg, large_offset, file)
&& ! BITSET_P (mask, HARD_FRAME_POINTER_REGNUM - GP_REG_FIRST))
abort ();
/* Do not restore GP under certain conditions. */
if (! store_p
&& TARGET_ABICALLS
&& (mips_abi == ABI_32 || mips_abi == ABI_O64))
mask &= ~(1 << (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST));
if (mask == 0 && fmask == 0)
return;
@ -6785,9 +6792,7 @@ save_restore_insns (store_p, large_reg, large_offset, file)
if (store_p)
mips_emit_frame_related_store (mem_rtx, reg_rtx, gp_offset);
else if (!TARGET_ABICALLS
|| (mips_abi != ABI_32 && mips_abi != ABI_O64)
|| regno != (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST))
else
{
emit_move_insn (reg_rtx, mem_rtx);
if (TARGET_MIPS16
@ -6799,50 +6804,50 @@ save_restore_insns (store_p, large_reg, large_offset, file)
}
else
{
if (store_p || !TARGET_ABICALLS
|| (mips_abi != ABI_32 && mips_abi != ABI_O64)
|| regno != (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST))
int r = regno;
/* The mips16 does not have an instruction to
load $31, so we load $7 instead, and work
things out in the caller. */
if (TARGET_MIPS16 && ! store_p && r == GP_REG_FIRST + 31)
r = GP_REG_FIRST + 7;
/* The mips16 sometimes needs to save $18. */
if (TARGET_MIPS16
&& regno != GP_REG_FIRST + 31
&& ! M16_REG_P (regno))
{
int r = regno;
/* The mips16 does not have an instruction to
load $31, so we load $7 instead, and work
things out in the caller. */
if (TARGET_MIPS16 && ! store_p && r == GP_REG_FIRST + 31)
r = GP_REG_FIRST + 7;
/* The mips16 sometimes needs to save $18. */
if (TARGET_MIPS16
&& regno != GP_REG_FIRST + 31
&& ! M16_REG_P (regno))
if (! store_p)
r = GP_REG_FIRST + 6;
else
{
if (! store_p)
r = GP_REG_FIRST + 6;
else
{
r = GP_REG_FIRST + 3;
fprintf (file, "\tmove\t%s,%s\n",
reg_names[r], reg_names[regno]);
}
r = GP_REG_FIRST + 3;
fprintf (file, "\tmove\t%s,%s\n",
reg_names[r], reg_names[regno]);
}
fprintf (file, "\t%s\t%s,",
(TARGET_64BIT
? (store_p) ? "sd" : "ld"
: (store_p) ? "sw" : "lw"),
reg_names[r]);
fprintf (file, HOST_WIDE_INT_PRINT_DEC,
gp_offset - base_offset);
fprintf (file, "(%s)\n", reg_names[REGNO(base_reg_rtx)]);
if (! store_p
&& TARGET_MIPS16
&& regno != GP_REG_FIRST + 31
&& ! M16_REG_P (regno))
fprintf (file, "\tmove\t%s,%s\n",
reg_names[regno], reg_names[r]);
}
fprintf (file, "\t%s\t%s,",
(TARGET_64BIT
? (store_p) ? "sd" : "ld"
: (store_p) ? "sw" : "lw"),
reg_names[r]);
fprintf (file, HOST_WIDE_INT_PRINT_DEC,
gp_offset - base_offset);
fprintf (file, "(%s)\n", reg_names[REGNO(base_reg_rtx)]);
if (! store_p
&& TARGET_MIPS16
&& regno != GP_REG_FIRST + 31
&& ! M16_REG_P (regno))
fprintf (file, "\tmove\t%s,%s\n",
reg_names[regno], reg_names[r]);
}
gp_offset -= GET_MODE_SIZE (gpr_mode);
}
/* If the restore is being supressed, still take into account
the offset at which it is stored. */
else if (BITSET_P (real_mask, regno - GP_REG_FIRST))
{
gp_offset -= GET_MODE_SIZE (gpr_mode);
}
}
else
base_reg_rtx = 0, base_offset = 0;