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> 2001-11-08 Neil Booth <neil@daikokuya.demon.co.uk>
* cp/decl.c (shadow_warning): New function. * cp/decl.c (shadow_warning): New function.
......
...@@ -6659,6 +6659,7 @@ save_restore_insns (store_p, large_reg, large_offset, file) ...@@ -6659,6 +6659,7 @@ save_restore_insns (store_p, large_reg, large_offset, file)
{ {
long mask = current_frame_info.mask; long mask = current_frame_info.mask;
long fmask = current_frame_info.fmask; long fmask = current_frame_info.fmask;
long real_mask = mask;
int regno; int regno;
rtx base_reg_rtx; rtx base_reg_rtx;
HOST_WIDE_INT base_offset; HOST_WIDE_INT base_offset;
...@@ -6671,6 +6672,12 @@ save_restore_insns (store_p, large_reg, large_offset, file) ...@@ -6671,6 +6672,12 @@ save_restore_insns (store_p, large_reg, large_offset, file)
&& ! BITSET_P (mask, HARD_FRAME_POINTER_REGNUM - GP_REG_FIRST)) && ! BITSET_P (mask, HARD_FRAME_POINTER_REGNUM - GP_REG_FIRST))
abort (); 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) if (mask == 0 && fmask == 0)
return; return;
...@@ -6785,9 +6792,7 @@ save_restore_insns (store_p, large_reg, large_offset, file) ...@@ -6785,9 +6792,7 @@ save_restore_insns (store_p, large_reg, large_offset, file)
if (store_p) if (store_p)
mips_emit_frame_related_store (mem_rtx, reg_rtx, gp_offset); mips_emit_frame_related_store (mem_rtx, reg_rtx, gp_offset);
else if (!TARGET_ABICALLS else
|| (mips_abi != ABI_32 && mips_abi != ABI_O64)
|| regno != (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST))
{ {
emit_move_insn (reg_rtx, mem_rtx); emit_move_insn (reg_rtx, mem_rtx);
if (TARGET_MIPS16 if (TARGET_MIPS16
...@@ -6799,50 +6804,50 @@ save_restore_insns (store_p, large_reg, large_offset, file) ...@@ -6799,50 +6804,50 @@ save_restore_insns (store_p, large_reg, large_offset, file)
} }
else else
{ {
if (store_p || !TARGET_ABICALLS int r = regno;
|| (mips_abi != ABI_32 && mips_abi != ABI_O64)
|| regno != (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST)) /* 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; if (! store_p)
r = GP_REG_FIRST + 6;
/* The mips16 does not have an instruction to else
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 + 3;
r = GP_REG_FIRST + 6; fprintf (file, "\tmove\t%s,%s\n",
else 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); 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 else
base_reg_rtx = 0, base_offset = 0; base_reg_rtx = 0, base_offset = 0;
......
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