diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-11-14 06:22:56 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-11-14 06:22:56 +0000 |
commit | e2ff5c1ba465ca4c67eb34bf81d8c13e9056cfd8 (patch) | |
tree | 289c94268246a21e58d4318a10556bfb945f4896 /gcc/function.c | |
parent | 7218e5a93faa86e9a4f24e84d60e9b19fa49053b (diff) | |
download | ppe42-gcc-e2ff5c1ba465ca4c67eb34bf81d8c13e9056cfd8.tar.gz ppe42-gcc-e2ff5c1ba465ca4c67eb34bf81d8c13e9056cfd8.zip |
* calls.c (precompute_register_parameters): Force all PARALLELs
into pseudo registers.
(load_register_parameters): Copy PARALLELs into hard registers.
* function.c (assign_parm_setup_block): Copy PARALLELS into
pseudo registers. Do emit_group_store in conversion_insns.
* expr.c (emit_group_load_1): Rename from emit_group_load, take
tmps as an argument. Move final copy loop ...
(emit_group_load): ... here. New function.
(emit_group_load_into_temps, emit_group_move_into_temps): New.
* expr.h: Declare them.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@90613 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/gcc/function.c b/gcc/function.c index 18829019e51..e4e04d2a53d 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2536,11 +2536,15 @@ assign_parm_setup_block_p (struct assign_parm_data_one *data) present and valid in DATA->STACK_RTL. */ static void -assign_parm_setup_block (tree parm, struct assign_parm_data_one *data) +assign_parm_setup_block (struct assign_parm_data_all *all, + tree parm, struct assign_parm_data_one *data) { rtx entry_parm = data->entry_parm; rtx stack_parm = data->stack_parm; + if (GET_CODE (entry_parm) == PARALLEL) + entry_parm = emit_group_move_into_temps (entry_parm); + /* If we've a non-block object that's nevertheless passed in parts, reconstitute it in register operations rather than on the stack. */ if (GET_CODE (entry_parm) == PARALLEL @@ -2550,6 +2554,8 @@ assign_parm_setup_block (tree parm, struct assign_parm_data_one *data) { rtx parmreg = gen_reg_rtx (data->nominal_mode); + push_to_sequence (all->conversion_insns); + /* For values returned in multiple registers, handle possible incompatible calls to emit_group_store. @@ -2572,6 +2578,10 @@ assign_parm_setup_block (tree parm, struct assign_parm_data_one *data) else emit_group_store (parmreg, entry_parm, data->nominal_type, int_size_in_bytes (data->nominal_type)); + + all->conversion_insns = get_insns (); + end_sequence (); + SET_DECL_RTL (parm, parmreg); return; } @@ -2609,7 +2619,12 @@ assign_parm_setup_block (tree parm, struct assign_parm_data_one *data) /* Handle values in multiple non-contiguous locations. */ if (GET_CODE (entry_parm) == PARALLEL) - emit_group_store (mem, entry_parm, data->passed_type, size); + { + push_to_sequence (all->conversion_insns); + emit_group_store (mem, entry_parm, data->passed_type, size); + all->conversion_insns = get_insns (); + end_sequence (); + } else if (size == 0) ; @@ -2648,7 +2663,7 @@ assign_parm_setup_block (tree parm, struct assign_parm_data_one *data) { rtx tem, x; int by = (UNITS_PER_WORD - size) * BITS_PER_UNIT; - rtx reg = gen_rtx_REG (word_mode, REGNO (data->entry_parm)); + rtx reg = gen_lowpart (word_mode, entry_parm); x = expand_shift (LSHIFT_EXPR, word_mode, reg, build_int_cst (NULL_TREE, by), @@ -2657,11 +2672,11 @@ assign_parm_setup_block (tree parm, struct assign_parm_data_one *data) emit_move_insn (tem, x); } else - move_block_from_reg (REGNO (data->entry_parm), mem, + move_block_from_reg (REGNO (entry_parm), mem, size_stored / UNITS_PER_WORD); } else - move_block_from_reg (REGNO (data->entry_parm), mem, + move_block_from_reg (REGNO (entry_parm), mem, size_stored / UNITS_PER_WORD); } @@ -2782,7 +2797,7 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm, emit_move_insn (tempreg, DECL_RTL (parm)); tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p); emit_move_insn (parmreg, tempreg); - all->conversion_insns = get_insns(); + all->conversion_insns = get_insns (); end_sequence (); did_conversion = true; @@ -3083,7 +3098,7 @@ assign_parms (tree fndecl) assign_parm_adjust_stack_rtl (&data); if (assign_parm_setup_block_p (&data)) - assign_parm_setup_block (parm, &data); + assign_parm_setup_block (&all, parm, &data); else if (data.passed_pointer || use_register_for_decl (parm)) assign_parm_setup_reg (&all, parm, &data); else |