IA64 alignment problem / how to fix?
Steve Ellcey
sje@cup.hp.com
Thu Jan 20 18:16:00 GMT 2005
> From: Richard Henderson <rth@redhat.com>
> On Wed, Jan 19, 2005 at 09:46:39AM -0800, Steve Ellcey wrote:
> > The other way I think I can fix it is to have ia64_function_arg return a
> > PARALLEL instead of a regular REG for it's argument. However when I
> > tried this (removed the size check in ia64_function_arg and always
> > returned a PARALLEL for structures on big-endian machines) my bootstrap
> > broke. This also generates less efficient code because assumes the
> > memory location is not aligned and does more stores and has other code
> > to compensate for that fact.
>
> Yes. And I think that move_block_from_reg should be fixed so that
> it generates this same less efficient code. Anything less is leaving
> this latent bug for someone else to fix later.
OK, maybe you could help me on a couple of points. Currently it looks
like ia64_function_arg returns a single register when it has an
aggregate argument that is larger then one register. I need to return a
parallel for HP-UX to handle the alignment issue, should I also return a
parallel for such aggregates on IA64 Linux? It seems to be working
without it but returning a parallel seems like it is the right thing to
do for aggregates larger then one register on both OS's.
As to move_block_from_reg, it looks like the only places it gets called
from are in function.c and I *think* that if ia64_function_arg and
ia64_function_value always return PARALLEL's for aggregates then
move_block_from_reg will never get called to copy aggregates (or for
anything else as near as I can tell).
Steve Ellcey
sje@cup.hp.com
More information about the Gcc
mailing list