diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-11-15 04:04:03 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-11-15 04:04:03 +0000 |
commit | b600a907cb4f311591d2fef1de01fdacbe855b9e (patch) | |
tree | d05dc008468c762c2853856bd22d3a9a9b7a7b40 /gcc/calls.c | |
parent | faab57e3cef4a6034b2336ac1a015b11733a370d (diff) | |
download | gcc-b600a907cb4f311591d2fef1de01fdacbe855b9e.tar.gz |
PR 18480
* calls.c (struct arg_data): Add parallel_value.
(precompute_register_parameters): Set it.
(load_register_parameters): Use it.
(store_one_arg): Also set it here.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@90649 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/calls.c')
-rw-r--r-- | gcc/calls.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/calls.c b/gcc/calls.c index e66181e9f9f..720ffb7de76 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -64,6 +64,9 @@ struct arg_data This is not the same register as for normal calls on machines with register windows. */ rtx tail_call_reg; + /* If REG is a PARALLEL, this is a copy of VALUE pulled into the correct + form for emit_group_move. */ + rtx parallel_value; /* If REG was promoted from the actual mode of the argument expression, indicates whether the promotion is sign- or zero-extended. */ int unsignedp; @@ -686,7 +689,7 @@ precompute_register_parameters (int num_actuals, struct arg_data *args, if (GET_CODE (args[i].reg) == PARALLEL) { tree type = TREE_TYPE (args[i].tree_value); - args[i].value + args[i].parallel_value = emit_group_load_into_temps (args[i].reg, args[i].value, type, int_size_in_bytes (type)); } @@ -1466,7 +1469,7 @@ load_register_parameters (struct arg_data *args, int num_actuals, locations. The Irix 6 ABI has examples of this. */ if (GET_CODE (reg) == PARALLEL) - emit_group_move (reg, args[i].value); + emit_group_move (reg, args[i].parallel_value); /* If simple case, just do move. If normal partial, store_one_arg has already loaded the register for us. In all other cases, @@ -4187,6 +4190,14 @@ store_one_arg (struct arg_data *arg, rtx argblock, int flags, arg->value = arg->stack_slot; } + if (arg->reg && GET_CODE (arg->reg) == PARALLEL) + { + tree type = TREE_TYPE (arg->tree_value); + arg->parallel_value + = emit_group_load_into_temps (arg->reg, arg->value, type, + int_size_in_bytes (type)); + } + /* Mark all slots this store used. */ if (ACCUMULATE_OUTGOING_ARGS && !(flags & ECF_SIBCALL) && argblock && ! variable_size && arg->stack) |