From e902c2664729f6f4c624c01b2261b4963e7a72ef Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 26 Jul 2012 14:23:51 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 15 +++++++++++ gcc/config/mn10300/mn10300-protos.h | 2 +- gcc/config/mn10300/mn10300.c | 54 +++++++++++++++++++++---------------- gcc/config/mn10300/mn10300.md | 2 +- 4 files changed, 48 insertions(+), 25 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ec73ade..ab76884 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2012-07-26 Nick Clifton + + * 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 PR regression/54084 diff --git a/gcc/config/mn10300/mn10300-protos.h b/gcc/config/mn10300/mn10300-protos.h index fe0452b..b6760e8 100644 --- a/gcc/config/mn10300/mn10300-protos.h +++ b/gcc/config/mn10300/mn10300-protos.h @@ -25,7 +25,7 @@ extern int mn10300_legitimate_pic_operand_p (rtx); extern rtx mn10300_legitimize_reload_address (rtx, enum machine_mode, int, int, 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_modes_tieable (enum machine_mode, enum machine_mode); extern const char *mn10300_output_add (rtx[3], bool); diff --git a/gcc/config/mn10300/mn10300.c b/gcc/config/mn10300/mn10300.c index b522c2e..a8a4050 100644 --- a/gcc/config/mn10300/mn10300.c +++ b/gcc/config/mn10300/mn10300.c @@ -57,18 +57,6 @@ int mn10300_protect_label; /* 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 @@ -635,20 +623,35 @@ mn10300_can_use_rets_insn (void) /* 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; } @@ -742,7 +745,7 @@ mn10300_expand_prologue (void) 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 ()) { @@ -999,8 +1002,10 @@ void 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; @@ -1220,7 +1225,7 @@ mn10300_expand_epilogue (void) 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(). @@ -1435,7 +1440,10 @@ mn10300_initial_offset (int from, int to) 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 (); } diff --git a/gcc/config/mn10300/mn10300.md b/gcc/config/mn10300/mn10300.md index a1cbc7a..ee92b68a 100644 --- a/gcc/config/mn10300/mn10300.md +++ b/gcc/config/mn10300/mn10300.md @@ -2048,7 +2048,7 @@ { /* The RETF insn is up to 3 cycles faster than RET. */ 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])); return ""; }) -- 2.7.4