diff options
author | Nick Clifton <nickc@redhat.com> | 2014-02-10 17:23:40 +0000 |
---|---|---|
committer | Nick Clifton <nickc@gcc.gnu.org> | 2014-02-10 17:23:40 +0000 |
commit | 3a22ad890b654fae0dc7cdd1a7c304059fb48a19 (patch) | |
tree | 06dd8ac1dbfda4aff2b93dd83128bba0d8e2db5f | |
parent | a596d94005f783cb6b0f274b2e17c2454b912277 (diff) | |
download | gcc-3a22ad890b654fae0dc7cdd1a7c304059fb48a19.zip gcc-3a22ad890b654fae0dc7cdd1a7c304059fb48a19.tar.gz gcc-3a22ad890b654fae0dc7cdd1a7c304059fb48a19.tar.bz2 |
mn10300.c (popcount): New function.
* config/mn10300/mn10300.c (popcount): New function.
(mn10300_expand_prologue): Include saved registers in stack usage
count.
From-SVN: r207665
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/mn10300/mn10300.c | 26 |
2 files changed, 28 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f62522..40af8d4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-02-10 Nick Clifton <nickc@redhat.com> + + * config/mn10300/mn10300.c (popcount): New function. + (mn10300_expand_prologue): Include saved registers in stack usage + count. + 2014-02-10 Jeff Law <law@redhat.com> PR middle-end/52306 diff --git a/gcc/config/mn10300/mn10300.c b/gcc/config/mn10300/mn10300.c index a2133f2..eb00077 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; - if (flag_stack_usage_info) - current_function_static_stack_size = size; - + mask = mn10300_get_live_callee_saved_regs (NULL); /* If we use any of the callee-saved registers, save them now. */ - mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs (NULL)); + mn10300_gen_multiple_store (mask); + + if (flag_stack_usage_info) + 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 |