aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2004-10-28 12:29:36 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2004-10-28 12:29:36 +0000
commit4af46a327e490e1a24a353bc55f0d64631ba85de (patch)
tree54dc9e1493a74735f8202d93c489ce24b19e01a3 /gcc
parent5921f276c7e038adb243e7e3145b6bb899e60ef6 (diff)
downloadgcc-4af46a327e490e1a24a353bc55f0d64631ba85de.zip
gcc-4af46a327e490e1a24a353bc55f0d64631ba85de.tar.gz
gcc-4af46a327e490e1a24a353bc55f0d64631ba85de.tar.bz2
* function.c (assign_parm_setup_block): Handle parallels correctly.
From-SVN: r89750
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/function.c24
2 files changed, 26 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c770da3..4eb71fb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2004-10-28 Aldy Hernandez <aldyh@redhat.com>
+
+ * function.c (assign_parm_setup_block): Handle parallels correctly.
+
2004-10-28 Kaz Kojima <kkojima@gcc.gnu.org>
* final.c (shorten_branches): Initialize flags structure.
diff --git a/gcc/function.c b/gcc/function.c
index d6fe2f5..82776e7 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -2550,8 +2550,28 @@ assign_parm_setup_block (tree parm, struct assign_parm_data_one *data)
{
rtx parmreg = gen_reg_rtx (data->nominal_mode);
- emit_group_store (parmreg, entry_parm, data->nominal_type,
- int_size_in_bytes (data->nominal_type));
+ /* For values returned in multiple registers, handle possible
+ incompatible calls to emit_group_store.
+
+ For example, the following would be invalid, and would have to
+ be fixed by the conditional below:
+
+ emit_group_store ((reg:SF), (parallel:DF))
+ emit_group_store ((reg:SI), (parallel:DI))
+
+ An example of this are doubles in e500 v2:
+ (parallel:DF (expr_list (reg:SI) (const_int 0))
+ (expr_list (reg:SI) (const_int 4))). */
+ if (data->nominal_mode != data->passed_mode)
+ {
+ rtx t = gen_reg_rtx (GET_MODE (entry_parm));
+ emit_group_store (t, entry_parm, NULL_TREE,
+ GET_MODE_SIZE (GET_MODE (entry_parm)));
+ convert_move (parmreg, t, 0);
+ }
+ else
+ emit_group_store (parmreg, entry_parm, data->nominal_type,
+ int_size_in_bytes (data->nominal_type));
SET_DECL_RTL (parm, parmreg);
return;
}