Commit a8b4881f by Richard Sandiford Committed by Richard Sandiford

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