diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2004-10-28 12:29:36 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2004-10-28 12:29:36 +0000 |
commit | 4af46a327e490e1a24a353bc55f0d64631ba85de (patch) | |
tree | 54dc9e1493a74735f8202d93c489ce24b19e01a3 /gcc | |
parent | 5921f276c7e038adb243e7e3145b6bb899e60ef6 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/function.c | 24 |
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; } |