From: Richard Sandiford Date: Sun, 23 Sep 2007 19:08:56 +0000 (+0000) Subject: function.c (assign_parm_setup_block): Explicitly convert BLKmode parameters from... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=208996c7d704f5f6f8454bf44d90377097ed8837;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0227acd0a75..940e6b6b3c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-09-23 Richard Sandiford + + * 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. + 2007-09-23 Jakub Jelinek * configure.ac (MAKEINFO): Handle makeinfo version 4.10 and above. diff --git a/gcc/function.c b/gcc/function.c index ffee5982071..5f2dd480d24 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); }