+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>
PR regression/54084
/* Selected processor type for tuning. */
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_N 2
#define CC_FLAG_C 4
/* Returns the set of live, callee-saved registers as a bitmask. The
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
-mn10300_get_live_callee_saved_regs (void)
+unsigned int
+mn10300_get_live_callee_saved_regs (unsigned int * bytes_saved)
{
int mask;
int i;
+ unsigned int count;
- mask = 0;
+ count = mask = 0;
for (i = 0; i <= LAST_EXTENDED_REGNUM; i++)
if (df_regs_ever_live_p (i) && ! call_really_used_regs[i])
- mask |= (1 << i);
+ {
+ mask |= (1 << i);
+ ++ count;
+ }
+
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;
}
HOST_WIDE_INT size = mn10300_frame_size ();
/* 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 ())
{
mn10300_expand_epilogue (void)
{
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 ())
{
int num_regs_to_save = fp_regs_to_save (), i;
if (mn10300_can_use_rets_insn ())
emit_jump_insn (ret_rtx);
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().
is the size of the callee register save area. */
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 ();
}