From 4af46a327e490e1a24a353bc55f0d64631ba85de Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Thu, 28 Oct 2004 12:29:36 +0000 Subject: [PATCH] * function.c (assign_parm_setup_block): Handle parallels correctly. From-SVN: r89750 --- gcc/ChangeLog | 4 ++++ gcc/function.c | 24 ++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c770da34170..4eb71fbc149 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2004-10-28 Aldy Hernandez + + * function.c (assign_parm_setup_block): Handle parallels correctly. + 2004-10-28 Kaz Kojima * final.c (shorten_branches): Initialize flags structure. diff --git a/gcc/function.c b/gcc/function.c index d6fe2f5f4af..82776e7cd7a 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; } -- 2.30.2