aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2003-08-06 03:26:17 +0000
committerAlan Modra <amodra@gcc.gnu.org>2003-08-06 12:56:17 +0930
commit980f6e8eaa6c9b50ab1649c0393be49223d1e2cd (patch)
tree0aa64ae9fcc6a0d1c0d433ffd189dbcf5f2c30cb
parente7cca7f486e436239d55228fd2ff26ee96871a07 (diff)
downloadgcc-980f6e8eaa6c9b50ab1649c0393be49223d1e2cd.zip
gcc-980f6e8eaa6c9b50ab1649c0393be49223d1e2cd.tar.gz
gcc-980f6e8eaa6c9b50ab1649c0393be49223d1e2cd.tar.bz2
calls.c (load_register_parameters): Arrange for call_fusage to report the whole register as used when...
* calls.c (load_register_parameters): Arrange for call_fusage to report the whole register as used when shifting to the msb. From-SVN: r70201
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/calls.c15
2 files changed, 15 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ac596b0..e3774ae 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2003-08-06 Alan Modra <amodra@bigpond.net.au>
+
+ * calls.c (load_register_parameters): Arrange for call_fusage to
+ report the whole register as used when shifting to the msb.
+
2003-08-05 Roger Sayle <roger@eyesopen.com>
* builtins.c (expand_builtin): When not optimizing, call the library
diff --git a/gcc/calls.c b/gcc/calls.c
index 26937c3..bdb4288 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -1633,13 +1633,18 @@ load_register_parameters (struct arg_data *args, int num_actuals,
&& (args[i].locate.where_pad
== (BYTES_BIG_ENDIAN ? upward : downward)))
{
- rtx ri = gen_rtx_REG (word_mode, REGNO (reg));
rtx x;
int shift = (UNITS_PER_WORD - size) * BITS_PER_UNIT;
- x = expand_binop (word_mode, ashl_optab, ri,
- GEN_INT (shift), ri, 1, OPTAB_WIDEN);
- if (x != ri)
- emit_move_insn (ri, x);
+
+ /* Assigning REG here rather than a temp makes CALL_FUSAGE
+ report the whole reg as used. Strictly speaking, the
+ call only uses SIZE bytes at the msb end, but it doesn't
+ seem worth generating rtl to say that. */
+ reg = gen_rtx_REG (word_mode, REGNO (reg));
+ x = expand_binop (word_mode, ashl_optab, reg,
+ GEN_INT (shift), reg, 1, OPTAB_WIDEN);
+ if (x != reg)
+ emit_move_insn (reg, x);
}
#endif
}