aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-10-20 03:43:31 +0000
committerRichard Stallman <rms@gnu.org>1993-10-20 03:43:31 +0000
commit14aceb299be2800a56ff2800ff5a8ecd345b8e8d (patch)
treeb1b0d0642812eb6afafb6ee784cf29c7d063e2c9
parent4d65300e6b4b414751fa23ccc58cee2d6e39ae99 (diff)
downloadgcc-14aceb299be2800a56ff2800ff5a8ecd345b8e8d.zip
gcc-14aceb299be2800a56ff2800ff5a8ecd345b8e8d.tar.gz
gcc-14aceb299be2800a56ff2800ff5a8ecd345b8e8d.tar.bz2
(assign_parms): Properly set parm_reg_stack_loc for args that are a CONCAT.
From-SVN: r5819
-rw-r--r--gcc/function.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/gcc/function.c b/gcc/function.c
index 60ab0d4..ed6ac06 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3339,6 +3339,7 @@ assign_parms (fndecl, second_time)
may need to do it in a wider mode. */
register rtx parmreg;
+ int regno;
unsignedp = TREE_UNSIGNED (TREE_TYPE (parm));
if (TREE_CODE (TREE_TYPE (parm)) == INTEGER_TYPE
@@ -3461,18 +3462,40 @@ assign_parms (fndecl, second_time)
#endif /* FUNCTION_ARG_CALLEE_COPIES */
/* In any case, record the parm's desired stack location
- in case we later discover it must live in the stack. */
- if (REGNO (parmreg) >= nparmregs)
+ in case we later discover it must live in the stack.
+
+ If it is a COMPLEX value, store the stack location for both
+ halves. */
+
+ if (GET_CODE (parmreg) == CONCAT)
+ regno = MAX (REGNO (XEXP (parmreg, 0)), REGNO (XEXP (parmreg, 1)));
+ else
+ regno = REGNO (parmreg);
+
+ if (regno >= nparmregs)
{
rtx *new;
int old_nparmregs = nparmregs;
- nparmregs = REGNO (parmreg) + 5;
+
+ nparmregs = regno + 5;
new = (rtx *) oballoc (nparmregs * sizeof (rtx));
bcopy (parm_reg_stack_loc, new, old_nparmregs * sizeof (rtx));
- bzero (new + old_nparmregs, (nparmregs - old_nparmregs) * sizeof (rtx));
+ bzero (new + old_nparmregs,
+ (nparmregs - old_nparmregs) * sizeof (rtx));
parm_reg_stack_loc = new;
}
- parm_reg_stack_loc[REGNO (parmreg)] = stack_parm;
+
+ if (GET_CODE (parmreg) == CONCAT)
+ {
+ enum machine_mode submode = GET_MODE (XEXP (parmreg, 0));
+
+ parm_reg_stack_loc[REGNO (gen_lowpart (submode, parmreg))]
+ = gen_lowpart (submode, stack_parm);
+ parm_reg_stack_loc[REGNO (gen_highpart (submode, parmreg))]
+ = gen_highpart (submode, stack_parm);
+ }
+ else
+ parm_reg_stack_loc[REGNO (parmreg)] = stack_parm;
/* Mark the register as eliminable if we did no conversion
and it was copied from memory at a fixed offset,