diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f6252266aa..40af8d49a27 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-02-10 Nick Clifton + + * config/mn10300/mn10300.c (popcount): New function. + (mn10300_expand_prologue): Include saved registers in stack usage + count. + 2014-02-10 Jeff Law PR middle-end/52306 diff --git a/gcc/config/mn10300/mn10300.c b/gcc/config/mn10300/mn10300.c index a2133f21783..eb000776750 100644 --- a/gcc/config/mn10300/mn10300.c +++ b/gcc/config/mn10300/mn10300.c @@ -741,16 +741,31 @@ mn10300_gen_multiple_store (unsigned int mask) F (emit_insn (x)); } +static inline unsigned int +popcount (unsigned int mask) +{ + unsigned int count = 0; + + while (mask) + { + ++ count; + mask &= ~ (mask & - mask); + } + return count; +} + void mn10300_expand_prologue (void) { HOST_WIDE_INT size = mn10300_frame_size (); + unsigned int mask; + + mask = mn10300_get_live_callee_saved_regs (NULL); + /* If we use any of the callee-saved registers, save them now. */ + mn10300_gen_multiple_store (mask); if (flag_stack_usage_info) - current_function_static_stack_size = size; - - /* If we use any of the callee-saved registers, save them now. */ - mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs (NULL)); + current_function_static_stack_size = size + popcount (mask) * 4; if (TARGET_AM33_2 && fp_regs_to_save ()) { @@ -767,6 +782,9 @@ mn10300_expand_prologue (void) unsigned int strategy_size = (unsigned)-1, this_strategy_size; rtx reg; + if (flag_stack_usage_info) + current_function_static_stack_size += num_regs_to_save * 4; + /* We have several different strategies to save FP registers. We can store them using SP offsets, which is beneficial if there are just a few registers to save, or we can use `a0' in