mips.c (mips_add_large_offset_to_sp): Remove FILE arg.

* config/mips/mips.c (mips_add_large_offset_to_sp): Remove FILE arg.
	(save_restore_insns): Likewise.
	(mips_expand_prologue, mips_expand_epilogue): Update callers.
	(highpart_shift_operator): Attach ATTRIBUTE_UNUSED to mode argument.

From-SVN: r53341
This commit is contained in:
Richard Sandiford 2002-05-09 20:10:54 +00:00 committed by Richard Sandiford
parent b70b3534fa
commit a8b4881f10
2 changed files with 90 additions and 179 deletions

View file

@ -1,3 +1,10 @@
2002-05-09 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips.c (mips_add_large_offset_to_sp): Remove FILE arg.
(save_restore_insns): Likewise.
(mips_expand_prologue, mips_expand_epilogue): Update callers.
(highpart_shift_operator): Attach ATTRIBUTE_UNUSED to mode argument.
Thu May 9 11:50:09 2002 Jeffrey A Law (law@cygnus.com)
* i386.md (type attribute): Add "rotate" for rotate insns.

View file

@ -104,15 +104,13 @@ static void mips_arg_info PARAMS ((const CUMULATIVE_ARGS *,
enum machine_mode,
tree, int,
struct mips_arg_info *));
static rtx mips_add_large_offset_to_sp PARAMS ((HOST_WIDE_INT,
FILE *));
static rtx mips_add_large_offset_to_sp PARAMS ((HOST_WIDE_INT));
static void mips_annotate_frame_insn PARAMS ((rtx, rtx));
static rtx mips_frame_set PARAMS ((enum machine_mode,
int, int));
static void mips_emit_frame_related_store PARAMS ((rtx, rtx,
HOST_WIDE_INT));
static void save_restore_insns PARAMS ((int, rtx,
long, FILE *));
static void save_restore_insns PARAMS ((int, rtx, long));
static void mips16_output_gp_offset PARAMS ((FILE *, rtx));
static void mips16_fp_args PARAMS ((FILE *, int, int));
static void build_mips16_function_stub PARAMS ((FILE *));
@ -6719,40 +6717,23 @@ compute_frame_size (size)
#define BITSET_P(VALUE,BIT) (((VALUE) & (1L << (BIT))) != 0)
/* Emit instructions to load the value (SP + OFFSET) into MIPS_TEMP2_REGNUM
and return an rtl expression for the register. Write the assembly
instructions directly to FILE if it is not null, otherwise emit them as
rtl.
and return an rtl expression for the register.
This function is a subroutine of save_restore_insns. It is used when
OFFSET is too large to add in a single instruction. */
static rtx
mips_add_large_offset_to_sp (offset, file)
mips_add_large_offset_to_sp (offset)
HOST_WIDE_INT offset;
FILE *file;
{
rtx reg = gen_rtx_REG (Pmode, MIPS_TEMP2_REGNUM);
if (file == 0)
{
rtx offset_rtx = GEN_INT (offset);
rtx offset_rtx = GEN_INT (offset);
emit_move_insn (reg, offset_rtx);
if (Pmode == DImode)
emit_insn (gen_adddi3 (reg, reg, stack_pointer_rtx));
else
emit_insn (gen_addsi3 (reg, reg, stack_pointer_rtx));
}
emit_move_insn (reg, offset_rtx);
if (Pmode == DImode)
emit_insn (gen_adddi3 (reg, reg, stack_pointer_rtx));
else
{
fprintf (file, "\tli\t%s,0x%.08lx\t# ",
reg_names[MIPS_TEMP2_REGNUM], (long) offset);
fprintf (file, HOST_WIDE_INT_PRINT_DEC, offset);
fprintf (file, "\n\t%s\t%s,%s,%s\n",
Pmode == DImode ? "daddu" : "addu",
reg_names[MIPS_TEMP2_REGNUM],
reg_names[MIPS_TEMP2_REGNUM],
reg_names[STACK_POINTER_REGNUM]);
}
emit_insn (gen_addsi3 (reg, reg, stack_pointer_rtx));
return reg;
}
@ -6818,11 +6799,10 @@ mips_emit_frame_related_store (mem, reg, offset)
}
static void
save_restore_insns (store_p, large_reg, large_offset, file)
save_restore_insns (store_p, large_reg, large_offset)
int store_p; /* true if this is prologue */
rtx large_reg; /* register holding large offset constant or NULL */
long large_offset; /* large constant offset value */
FILE *file; /* file to write instructions instead of making RTL */
{
long mask = current_frame_info.mask;
long fmask = current_frame_info.fmask;
@ -6886,26 +6866,17 @@ save_restore_insns (store_p, large_reg, large_offset, file)
{
base_reg_rtx = gen_rtx_REG (Pmode, MIPS_TEMP2_REGNUM);
base_offset = large_offset;
if (file == 0)
{
if (Pmode == DImode)
insn = emit_insn (gen_adddi3 (base_reg_rtx, large_reg,
stack_pointer_rtx));
else
insn = emit_insn (gen_addsi3 (base_reg_rtx, large_reg,
stack_pointer_rtx));
}
if (Pmode == DImode)
insn = emit_insn (gen_adddi3 (base_reg_rtx, large_reg,
stack_pointer_rtx));
else
fprintf (file, "\t%s\t%s,%s,%s\n",
Pmode == DImode ? "daddu" : "addu",
reg_names[MIPS_TEMP2_REGNUM],
reg_names[REGNO (large_reg)],
reg_names[STACK_POINTER_REGNUM]);
insn = emit_insn (gen_addsi3 (base_reg_rtx, large_reg,
stack_pointer_rtx));
}
else
{
base_offset = gp_offset;
base_reg_rtx = mips_add_large_offset_to_sp (base_offset, file);
base_reg_rtx = mips_add_large_offset_to_sp (base_offset);
}
/* When we restore the registers in MIPS16 mode, then if we are
@ -6922,99 +6893,57 @@ save_restore_insns (store_p, large_reg, large_offset, file)
base_offset += current_function_outgoing_args_size;
for (regno = GP_REG_LAST; regno >= GP_REG_FIRST; regno--)
if (BITSET_P (mask, regno - GP_REG_FIRST))
{
if (file == 0)
{
rtx reg_rtx;
rtx mem_rtx
= gen_rtx (MEM, gpr_mode,
gen_rtx (PLUS, Pmode, base_reg_rtx,
GEN_INT (gp_offset - base_offset)));
{
if (BITSET_P (mask, regno - GP_REG_FIRST))
{
rtx reg_rtx;
rtx mem_rtx
= gen_rtx (MEM, gpr_mode,
gen_rtx (PLUS, Pmode, base_reg_rtx,
GEN_INT (gp_offset - base_offset)));
if (! current_function_calls_eh_return)
RTX_UNCHANGING_P (mem_rtx) = 1;
if (! current_function_calls_eh_return)
RTX_UNCHANGING_P (mem_rtx) = 1;
/* The mips16 does not have an instruction to load
$31, so we load $7 instead, and work things out
in mips_expand_epilogue. */
if (TARGET_MIPS16 && ! store_p && regno == GP_REG_FIRST + 31)
reg_rtx = gen_rtx (REG, gpr_mode, GP_REG_FIRST + 7);
/* The mips16 sometimes needs to save $18. */
else if (TARGET_MIPS16
&& regno != GP_REG_FIRST + 31
&& ! M16_REG_P (regno))
{
if (! store_p)
reg_rtx = gen_rtx (REG, gpr_mode, 6);
else
{
reg_rtx = gen_rtx (REG, gpr_mode, 3);
emit_move_insn (reg_rtx,
gen_rtx (REG, gpr_mode, regno));
}
}
else
reg_rtx = gen_rtx (REG, gpr_mode, regno);
/* The mips16 does not have an instruction to load
$31, so we load $7 instead, and work things out
in mips_expand_epilogue. */
if (TARGET_MIPS16 && ! store_p && regno == GP_REG_FIRST + 31)
reg_rtx = gen_rtx (REG, gpr_mode, GP_REG_FIRST + 7);
/* The mips16 sometimes needs to save $18. */
else if (TARGET_MIPS16
&& regno != GP_REG_FIRST + 31
&& ! M16_REG_P (regno))
{
if (! store_p)
reg_rtx = gen_rtx (REG, gpr_mode, 6);
else
{
reg_rtx = gen_rtx (REG, gpr_mode, 3);
emit_move_insn (reg_rtx,
gen_rtx (REG, gpr_mode, regno));
}
}
else
reg_rtx = gen_rtx (REG, gpr_mode, regno);
if (store_p)
mips_emit_frame_related_store (mem_rtx, reg_rtx, gp_offset);
else
{
emit_move_insn (reg_rtx, mem_rtx);
if (TARGET_MIPS16
&& regno != GP_REG_FIRST + 31
&& ! M16_REG_P (regno))
emit_move_insn (gen_rtx (REG, gpr_mode, regno),
reg_rtx);
}
}
else
{
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
{
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]);
}
if (store_p)
mips_emit_frame_related_store (mem_rtx, reg_rtx, gp_offset);
else
{
emit_move_insn (reg_rtx, mem_rtx);
if (TARGET_MIPS16
&& regno != GP_REG_FIRST + 31
&& ! M16_REG_P (regno))
emit_move_insn (gen_rtx (REG, gpr_mode, regno),
reg_rtx);
}
}
/* If the restore is being supressed, still take into account
the offset at which it is stored. */
if (BITSET_P (real_mask, regno - GP_REG_FIRST))
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;
@ -7046,27 +6975,17 @@ save_restore_insns (store_p, large_reg, large_offset, file)
{
base_reg_rtx = gen_rtx_REG (Pmode, MIPS_TEMP2_REGNUM);
base_offset = large_offset;
if (file == 0)
{
if (Pmode == DImode)
insn = emit_insn (gen_adddi3 (base_reg_rtx, large_reg,
stack_pointer_rtx));
else
insn = emit_insn (gen_addsi3 (base_reg_rtx, large_reg,
stack_pointer_rtx));
}
if (Pmode == DImode)
insn = emit_insn (gen_adddi3 (base_reg_rtx, large_reg,
stack_pointer_rtx));
else
fprintf (file, "\t%s\t%s,%s,%s\n",
Pmode == DImode ? "daddu" : "addu",
reg_names[MIPS_TEMP2_REGNUM],
reg_names[REGNO (large_reg)],
reg_names[STACK_POINTER_REGNUM]);
insn = emit_insn (gen_addsi3 (base_reg_rtx, large_reg,
stack_pointer_rtx));
}
else
{
base_offset = fp_offset;
base_reg_rtx = mips_add_large_offset_to_sp (fp_offset, file);
base_reg_rtx = mips_add_large_offset_to_sp (fp_offset);
}
/* This loop must iterate over the same space as its companion in
@ -7076,34 +6995,19 @@ save_restore_insns (store_p, large_reg, large_offset, file)
regno -= FP_INC)
if (BITSET_P (fmask, regno - FP_REG_FIRST))
{
if (file == 0)
{
enum machine_mode sz
= TARGET_SINGLE_FLOAT ? SFmode : DFmode;
rtx reg_rtx = gen_rtx (REG, sz, regno);
rtx mem_rtx = gen_rtx (MEM, sz,
gen_rtx (PLUS, Pmode, base_reg_rtx,
GEN_INT (fp_offset
- base_offset)));
if (! current_function_calls_eh_return)
RTX_UNCHANGING_P (mem_rtx) = 1;
enum machine_mode sz = TARGET_SINGLE_FLOAT ? SFmode : DFmode;
rtx reg_rtx = gen_rtx (REG, sz, regno);
rtx mem_rtx = gen_rtx (MEM, sz,
gen_rtx (PLUS, Pmode, base_reg_rtx,
GEN_INT (fp_offset
- base_offset)));
if (! current_function_calls_eh_return)
RTX_UNCHANGING_P (mem_rtx) = 1;
if (store_p)
mips_emit_frame_related_store (mem_rtx, reg_rtx, fp_offset);
else
emit_move_insn (reg_rtx, mem_rtx);
}
if (store_p)
mips_emit_frame_related_store (mem_rtx, reg_rtx, fp_offset);
else
{
fprintf (file, "\t%s\t%s,",
(TARGET_SINGLE_FLOAT
? (store_p ? "s.s" : "l.s")
: (store_p ? "s.d" : "l.d")),
reg_names[regno]);
fprintf (file, HOST_WIDE_INT_PRINT_DEC,
fp_offset - base_offset);
fprintf (file, "(%s)\n", reg_names[REGNO(base_reg_rtx)]);
}
emit_move_insn (reg_rtx, mem_rtx);
fp_offset -= UNITS_PER_FPVALUE;
}
@ -7593,7 +7497,7 @@ mips_expand_prologue ()
}
if (! mips_entry)
save_restore_insns (1, tmp_rtx, tsize, (FILE *)0);
save_restore_insns (1, tmp_rtx, tsize);
else if (reg_18_save != NULL_RTX)
emit_insn (reg_18_save);
@ -7862,7 +7766,7 @@ mips_expand_epilogue ()
& (1L << (PIC_OFFSET_TABLE_REGNUM - GP_REG_FIRST))))
emit_insn (gen_blockage ());
save_restore_insns (0, tmp_rtx, orig_tsize, (FILE *)0);
save_restore_insns (0, tmp_rtx, orig_tsize);
/* In mips16 mode with a large frame, we adjust the stack
pointer before restoring the registers. In this case, we
@ -9743,7 +9647,7 @@ highpart_shift_operator (x, mode)
int
mips_register_move_cost (mode, to, from)
enum machine_mode mode;
enum machine_mode mode ATTRIBUTE_UNUSED;
enum reg_class to, from;
{
if (from == M16_REGS && GR_REG_CLASS_P (to))