mirror of git://gcc.gnu.org/git/gcc.git
mn10300.c (REG_SAVE_BYTES): Delete.
* config/mn10300/mn10300.c (REG_SAVE_BYTES): Delete. (mn10300_get_live_callee_saved_regs): If requested return a count of the number of bytes in the mask. (mn10300_expand_prologue): Add argument to invocation of mn10300_get_live_callee_regs. (mn10300_expand_epilogue): Compute reg_save_bytes by calling mn10300_get_live_callee_saved_regs. (mn10300_initial_offset): Likewise. * config/mn10300/mn10300-protos.h (mn10300_get_live_callee_saved_regs): Update prototype. * config/mn10300/mn10300.md (return_ret): Add argument to invocation of mn10300_get_live_callee_saved_regs. From-SVN: r189892
This commit is contained in:
parent
d38933a003
commit
e902c26647
|
|
@ -1,3 +1,18 @@
|
||||||
|
2012-07-26 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* config/mn10300/mn10300.c (REG_SAVE_BYTES): Delete.
|
||||||
|
(mn10300_get_live_callee_saved_regs): If requested return a count
|
||||||
|
of the number of bytes in the mask.
|
||||||
|
(mn10300_expand_prologue): Add argument to invocation of
|
||||||
|
mn10300_get_live_callee_regs.
|
||||||
|
(mn10300_expand_epilogue): Compute reg_save_bytes by calling
|
||||||
|
mn10300_get_live_callee_saved_regs.
|
||||||
|
(mn10300_initial_offset): Likewise.
|
||||||
|
* config/mn10300/mn10300-protos.h (mn10300_get_live_callee_saved_regs):
|
||||||
|
Update prototype.
|
||||||
|
* config/mn10300/mn10300.md (return_ret): Add argument to
|
||||||
|
invocation of mn10300_get_live_callee_saved_regs.
|
||||||
|
|
||||||
2012-07-26 Steven Bosscher <steven@gcc.gnu.org>
|
2012-07-26 Steven Bosscher <steven@gcc.gnu.org>
|
||||||
|
|
||||||
PR regression/54084
|
PR regression/54084
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ extern int mn10300_legitimate_pic_operand_p (rtx);
|
||||||
extern rtx mn10300_legitimize_reload_address (rtx, enum machine_mode,
|
extern rtx mn10300_legitimize_reload_address (rtx, enum machine_mode,
|
||||||
int, int, int);
|
int, int, int);
|
||||||
extern bool mn10300_function_value_regno_p (const unsigned int);
|
extern bool mn10300_function_value_regno_p (const unsigned int);
|
||||||
extern int mn10300_get_live_callee_saved_regs (void);
|
extern unsigned int mn10300_get_live_callee_saved_regs (unsigned int *);
|
||||||
extern bool mn10300_hard_regno_mode_ok (unsigned int, enum machine_mode);
|
extern bool mn10300_hard_regno_mode_ok (unsigned int, enum machine_mode);
|
||||||
extern bool mn10300_modes_tieable (enum machine_mode, enum machine_mode);
|
extern bool mn10300_modes_tieable (enum machine_mode, enum machine_mode);
|
||||||
extern const char *mn10300_output_add (rtx[3], bool);
|
extern const char *mn10300_output_add (rtx[3], bool);
|
||||||
|
|
|
||||||
|
|
@ -57,18 +57,6 @@ int mn10300_protect_label;
|
||||||
/* Selected processor type for tuning. */
|
/* Selected processor type for tuning. */
|
||||||
enum processor_type mn10300_tune_cpu = PROCESSOR_DEFAULT;
|
enum processor_type mn10300_tune_cpu = PROCESSOR_DEFAULT;
|
||||||
|
|
||||||
/* The size of the callee register save area. Right now we save everything
|
|
||||||
on entry since it costs us nothing in code size. It does cost us from a
|
|
||||||
speed standpoint, so we want to optimize this sooner or later. */
|
|
||||||
#define REG_SAVE_BYTES (4 * df_regs_ever_live_p (2) \
|
|
||||||
+ 4 * df_regs_ever_live_p (3) \
|
|
||||||
+ 4 * df_regs_ever_live_p (6) \
|
|
||||||
+ 4 * df_regs_ever_live_p (7) \
|
|
||||||
+ 16 * (df_regs_ever_live_p (14) \
|
|
||||||
|| df_regs_ever_live_p (15) \
|
|
||||||
|| df_regs_ever_live_p (16) \
|
|
||||||
|| df_regs_ever_live_p (17)))
|
|
||||||
|
|
||||||
#define CC_FLAG_Z 1
|
#define CC_FLAG_Z 1
|
||||||
#define CC_FLAG_N 2
|
#define CC_FLAG_N 2
|
||||||
#define CC_FLAG_C 4
|
#define CC_FLAG_C 4
|
||||||
|
|
@ -635,20 +623,35 @@ mn10300_can_use_rets_insn (void)
|
||||||
|
|
||||||
/* Returns the set of live, callee-saved registers as a bitmask. The
|
/* Returns the set of live, callee-saved registers as a bitmask. The
|
||||||
callee-saved extended registers cannot be stored individually, so
|
callee-saved extended registers cannot be stored individually, so
|
||||||
all of them will be included in the mask if any one of them is used. */
|
Also returns the number of bytes in the registers in the mask if
|
||||||
|
BYTES_SAVED is not NULL. */
|
||||||
|
|
||||||
int
|
unsigned int
|
||||||
mn10300_get_live_callee_saved_regs (void)
|
mn10300_get_live_callee_saved_regs (unsigned int * bytes_saved)
|
||||||
{
|
{
|
||||||
int mask;
|
int mask;
|
||||||
int i;
|
int i;
|
||||||
|
unsigned int count;
|
||||||
|
|
||||||
mask = 0;
|
count = mask = 0;
|
||||||
for (i = 0; i <= LAST_EXTENDED_REGNUM; i++)
|
for (i = 0; i <= LAST_EXTENDED_REGNUM; i++)
|
||||||
if (df_regs_ever_live_p (i) && ! call_really_used_regs[i])
|
if (df_regs_ever_live_p (i) && ! call_really_used_regs[i])
|
||||||
mask |= (1 << i);
|
{
|
||||||
|
mask |= (1 << i);
|
||||||
|
++ count;
|
||||||
|
}
|
||||||
|
|
||||||
if ((mask & 0x3c000) != 0)
|
if ((mask & 0x3c000) != 0)
|
||||||
mask |= 0x3c000;
|
{
|
||||||
|
for (i = 0x04000; i < 0x40000; i <<= 1)
|
||||||
|
if ((mask & i) == 0)
|
||||||
|
++ count;
|
||||||
|
|
||||||
|
mask |= 0x3c000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytes_saved)
|
||||||
|
* bytes_saved = count * UNITS_PER_WORD;
|
||||||
|
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
@ -742,7 +745,7 @@ mn10300_expand_prologue (void)
|
||||||
HOST_WIDE_INT size = mn10300_frame_size ();
|
HOST_WIDE_INT size = mn10300_frame_size ();
|
||||||
|
|
||||||
/* If we use any of the callee-saved registers, save them now. */
|
/* If we use any of the callee-saved registers, save them now. */
|
||||||
mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs ());
|
mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs (NULL));
|
||||||
|
|
||||||
if (TARGET_AM33_2 && fp_regs_to_save ())
|
if (TARGET_AM33_2 && fp_regs_to_save ())
|
||||||
{
|
{
|
||||||
|
|
@ -999,8 +1002,10 @@ void
|
||||||
mn10300_expand_epilogue (void)
|
mn10300_expand_epilogue (void)
|
||||||
{
|
{
|
||||||
HOST_WIDE_INT size = mn10300_frame_size ();
|
HOST_WIDE_INT size = mn10300_frame_size ();
|
||||||
int reg_save_bytes = REG_SAVE_BYTES;
|
unsigned int reg_save_bytes;
|
||||||
|
|
||||||
|
mn10300_get_live_callee_saved_regs (& reg_save_bytes);
|
||||||
|
|
||||||
if (TARGET_AM33_2 && fp_regs_to_save ())
|
if (TARGET_AM33_2 && fp_regs_to_save ())
|
||||||
{
|
{
|
||||||
int num_regs_to_save = fp_regs_to_save (), i;
|
int num_regs_to_save = fp_regs_to_save (), i;
|
||||||
|
|
@ -1220,7 +1225,7 @@ mn10300_expand_epilogue (void)
|
||||||
if (mn10300_can_use_rets_insn ())
|
if (mn10300_can_use_rets_insn ())
|
||||||
emit_jump_insn (ret_rtx);
|
emit_jump_insn (ret_rtx);
|
||||||
else
|
else
|
||||||
emit_jump_insn (gen_return_ret (GEN_INT (size + REG_SAVE_BYTES)));
|
emit_jump_insn (gen_return_ret (GEN_INT (size + reg_save_bytes)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Recognize the PARALLEL rtx generated by mn10300_gen_multiple_store().
|
/* Recognize the PARALLEL rtx generated by mn10300_gen_multiple_store().
|
||||||
|
|
@ -1435,7 +1440,10 @@ mn10300_initial_offset (int from, int to)
|
||||||
is the size of the callee register save area. */
|
is the size of the callee register save area. */
|
||||||
if (from == ARG_POINTER_REGNUM)
|
if (from == ARG_POINTER_REGNUM)
|
||||||
{
|
{
|
||||||
diff += REG_SAVE_BYTES;
|
unsigned int reg_save_bytes;
|
||||||
|
|
||||||
|
mn10300_get_live_callee_saved_regs (& reg_save_bytes);
|
||||||
|
diff += reg_save_bytes;
|
||||||
diff += 4 * fp_regs_to_save ();
|
diff += 4 * fp_regs_to_save ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2048,7 +2048,7 @@
|
||||||
{
|
{
|
||||||
/* The RETF insn is up to 3 cycles faster than RET. */
|
/* The RETF insn is up to 3 cycles faster than RET. */
|
||||||
fputs ((mn10300_can_use_retf_insn () ? "\tretf " : "\tret "), asm_out_file);
|
fputs ((mn10300_can_use_retf_insn () ? "\tretf " : "\tret "), asm_out_file);
|
||||||
mn10300_print_reg_list (asm_out_file, mn10300_get_live_callee_saved_regs ());
|
mn10300_print_reg_list (asm_out_file, mn10300_get_live_callee_saved_regs (NULL));
|
||||||
fprintf (asm_out_file, ",%d\n", (int) INTVAL (operands[0]));
|
fprintf (asm_out_file, ",%d\n", (int) INTVAL (operands[0]));
|
||||||
return "";
|
return "";
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue