aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@nildram.co.uk>2007-09-23 19:08:56 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2007-09-23 19:08:56 +0000
commit208996c7d704f5f6f8454bf44d90377097ed8837 (patch)
tree9293268eac64e17a465440936726ccb35d7c0668 /gcc/function.c
parent4c4717752abbed17c278b44ba9891128a5c14e0d (diff)
downloadgcc-208996c7d704f5f6f8454bf44d90377097ed8837.zip
gcc-208996c7d704f5f6f8454bf44d90377097ed8837.tar.gz
gcc-208996c7d704f5f6f8454bf44d90377097ed8837.tar.bz2
function.c (assign_parm_setup_block): Explicitly convert BLKmode parameters from word_mode to the subword type if...
gcc/ * function.c (assign_parm_setup_block): Explicitly convert BLKmode parameters from word_mode to the subword type if such a truncation is not a no-op. From-SVN: r128696
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/gcc/function.c b/gcc/function.c
index ffee598..5f2dd48 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -2591,7 +2591,21 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
#endif
)
{
- rtx reg = gen_rtx_REG (mode, REGNO (entry_parm));
+ rtx reg;
+
+ /* We are really truncating a word_mode value containing
+ SIZE bytes into a value of mode MODE. If such an
+ operation requires no actual instructions, we can refer
+ to the value directly in mode MODE, otherwise we must
+ start with the register in word_mode and explicitly
+ convert it. */
+ if (TRULY_NOOP_TRUNCATION (size * BITS_PER_UNIT, BITS_PER_WORD))
+ reg = gen_rtx_REG (mode, REGNO (entry_parm));
+ else
+ {
+ reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
+ reg = convert_to_mode (mode, copy_to_reg (reg), 1);
+ }
emit_move_insn (change_address (mem, mode, 0), reg);
}