Commit c8a14e0e by Richard Henderson Committed by Richard Henderson

mips.c (save_restore_insns): Remove GP from the restore registers mask early…

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
parent 8ac9ea61
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.
......
......@@ -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,10 +6804,6 @@ 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
......@@ -6839,8 +6840,12 @@ save_restore_insns (store_p, large_reg, large_offset, file)
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);
}
}
......
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