aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1996-06-06 16:13:24 -0700
committerJim Wilson <wilson@gcc.gnu.org>1996-06-06 16:13:24 -0700
commit5c4cdc9fdf288148cc63bd30e37c49a5b147b6a0 (patch)
treec22d262c57fc1917a45a0536b80b4058208d2555 /gcc/function.c
parentae73d3bec564a5bcc12c558bd61fa8c3fa85c47c (diff)
downloadgcc-5c4cdc9fdf288148cc63bd30e37c49a5b147b6a0.zip
gcc-5c4cdc9fdf288148cc63bd30e37c49a5b147b6a0.tar.gz
gcc-5c4cdc9fdf288148cc63bd30e37c49a5b147b6a0.tar.bz2
(assign_parms): Handle PARALLEL parameter in ENTRY_PARM.
From-SVN: r12191
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/gcc/function.c b/gcc/function.c
index 909b695..e4d73d0 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3495,9 +3495,17 @@ assign_parms (fndecl, second_time)
* (PARM_BOUNDARY / BITS_PER_UNIT));
if (! second_time)
- move_block_from_reg (REGNO (entry_parm),
- validize_mem (stack_parm), nregs,
- int_size_in_bytes (TREE_TYPE (parm)));
+ {
+ /* Handle calls that pass values in multiple non-contiguous
+ locations. The Irix 6 ABI has examples of this. */
+ if (GET_CODE (entry_parm) == PARALLEL)
+ emit_group_store (validize_mem (stack_parm),
+ entry_parm);
+ else
+ move_block_from_reg (REGNO (entry_parm),
+ validize_mem (stack_parm), nregs,
+ int_size_in_bytes (TREE_TYPE (parm)));
+ }
entry_parm = stack_parm;
}
}
@@ -3621,10 +3629,13 @@ assign_parms (fndecl, second_time)
Set DECL_RTL to that place. */
- if (nominal_mode == BLKmode)
+ if (nominal_mode == BLKmode || GET_CODE (entry_parm) == PARALLEL)
{
- /* If a BLKmode arrives in registers, copy it to a stack slot. */
- if (GET_CODE (entry_parm) == REG)
+ /* If a BLKmode arrives in registers, copy it to a stack slot.
+ Handle calls that pass values in multiple non-contiguous
+ locations. The Irix 6 ABI has examples of this. */
+ if (GET_CODE (entry_parm) == REG
+ || GET_CODE (entry_parm) == PARALLEL)
{
int size_stored
= CEIL_ROUND (int_size_in_bytes (TREE_TYPE (parm)),
@@ -3655,10 +3666,15 @@ assign_parms (fndecl, second_time)
if (TREE_READONLY (parm))
RTX_UNCHANGING_P (stack_parm) = 1;
- move_block_from_reg (REGNO (entry_parm),
- validize_mem (stack_parm),
- size_stored / UNITS_PER_WORD,
- int_size_in_bytes (TREE_TYPE (parm)));
+ /* Handle calls that pass values in multiple non-contiguous
+ locations. The Irix 6 ABI has examples of this. */
+ if (GET_CODE (entry_parm) == PARALLEL)
+ emit_group_store (validize_mem (stack_parm), entry_parm);
+ else
+ move_block_from_reg (REGNO (entry_parm),
+ validize_mem (stack_parm),
+ size_stored / UNITS_PER_WORD,
+ int_size_in_bytes (TREE_TYPE (parm)));
}
DECL_RTL (parm) = stack_parm;
}