diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/calls.c | 15 |
2 files changed, 21 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c26b57c..7c2e32d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-11-14 Richard Henderson <rth@redhat.com> + + 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. + 2004-11-14 Zdenek Dvorak <dvorakz@suse.cz> PR tree-optimization/18431 diff --git a/gcc/calls.c b/gcc/calls.c index e66181e..720ffb7d 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) |