sparc.c (sparc_va_arg): When the required alignment is more than that provided, copy to a temporary.
* config/sparc/sparc.c (sparc_va_arg): When the required alignment is more than that provided, copy to a temporary. From-SVN: r37344
This commit is contained in:
parent
1caa7aba31
commit
9a0662b4d5
2 changed files with 36 additions and 6 deletions
|
@ -1,3 +1,8 @@
|
|||
2000-11-08 Geoffrey Keating <geoffk@redhat.com>
|
||||
|
||||
* config/sparc/sparc.c (sparc_va_arg): When the required alignment
|
||||
is more than that provided, copy to a temporary.
|
||||
|
||||
2000-11-09 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* mklibgcc.in (EXTRA_MULTILIB_PARTS): Prevent `make' from
|
||||
|
|
|
@ -4793,12 +4793,6 @@ sparc_va_arg (valist, type)
|
|||
indirect = 1;
|
||||
size = rsize = UNITS_PER_WORD;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ??? The old va-sparc.h implementation, for 8 byte objects
|
||||
copied stuff to a temporary -- I don't see that that
|
||||
provides any more alignment than the stack slot did. */
|
||||
}
|
||||
}
|
||||
|
||||
incr = valist;
|
||||
|
@ -4825,6 +4819,37 @@ sparc_va_arg (valist, type)
|
|||
|
||||
addr_rtx = expand_expr (addr, NULL, Pmode, EXPAND_NORMAL);
|
||||
|
||||
/* If the address isn't aligned properly for the type,
|
||||
we may need to copy to a temporary.
|
||||
FIXME: This is inefficient. Usually we can do this
|
||||
in registers. */
|
||||
if (align == 0
|
||||
&& TYPE_ALIGN (type) > BITS_PER_WORD
|
||||
&& !indirect)
|
||||
{
|
||||
/* FIXME: We really need to specify that the temporary is live
|
||||
for the whole function because expand_builtin_va_arg wants
|
||||
the alias set to be get_varargs_alias_set (), but in this
|
||||
case the alias set is that for TYPE and if the memory gets
|
||||
reused it will be reused with alias set TYPE. */
|
||||
rtx tmp = assign_temp (type, 0, 1, 0);
|
||||
rtx dest_addr;
|
||||
|
||||
addr_rtx = force_reg (Pmode, addr_rtx);
|
||||
addr_rtx = gen_rtx_MEM (BLKmode, addr_rtx);
|
||||
MEM_ALIAS_SET (addr_rtx) = get_varargs_alias_set ();
|
||||
tmp = shallow_copy_rtx (tmp);
|
||||
PUT_MODE (tmp, BLKmode);
|
||||
MEM_ALIAS_SET (tmp) = 0;
|
||||
|
||||
dest_addr = emit_block_move (tmp, addr_rtx, GEN_INT (rsize),
|
||||
BITS_PER_WORD);
|
||||
if (dest_addr != NULL_RTX)
|
||||
addr_rtx = dest_addr;
|
||||
else
|
||||
addr_rtx = XCEXP (tmp, 0, MEM);
|
||||
}
|
||||
|
||||
if (indirect)
|
||||
{
|
||||
addr_rtx = force_reg (Pmode, addr_rtx);
|
||||
|
|
Loading…
Add table
Reference in a new issue