This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: IA64 alignment problem / how to fix?


> 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]