diff options
author | Nick Clifton <nickc@redhat.com> | 2012-07-26 14:23:51 +0000 |
---|---|---|
committer | Nick Clifton <nickc@gcc.gnu.org> | 2012-07-26 14:23:51 +0000 |
commit | e902c2664729f6f4c624c01b2261b4963e7a72ef (patch) | |
tree | 926ec22e906c5b74ad2932f58ac01b54f9967243 /gcc/config/mn10300 | |
parent | d38933a0032bf9b04639575267bcb25e8c6a4463 (diff) | |
download | gcc-e902c2664729f6f4c624c01b2261b4963e7a72ef.zip gcc-e902c2664729f6f4c624c01b2261b4963e7a72ef.tar.gz gcc-e902c2664729f6f4c624c01b2261b4963e7a72ef.tar.bz2 |
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
Diffstat (limited to 'gcc/config/mn10300')
-rw-r--r-- | gcc/config/mn10300/mn10300-protos.h | 2 | ||||
-rw-r--r-- | gcc/config/mn10300/mn10300.c | 54 | ||||
-rw-r--r-- | gcc/config/mn10300/mn10300.md | 2 |
3 files changed, 33 insertions, 25 deletions
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 ""; }) |