aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2014-02-10 17:23:40 +0000
committerNick Clifton <nickc@gcc.gnu.org>2014-02-10 17:23:40 +0000
commit3a22ad890b654fae0dc7cdd1a7c304059fb48a19 (patch)
tree06dd8ac1dbfda4aff2b93dd83128bba0d8e2db5f
parenta596d94005f783cb6b0f274b2e17c2454b912277 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/mn10300/mn10300.c26
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