subreg pass
Roman Zippel
zippel@linux-m68k.org
Mon Mar 5 13:29:00 GMT 2007
Hi,
The new subreg lowering pass seems to generate a bit worse code on m68k
than before, let's take simple example:
unsigned long long f(unsigned long long a, unsigned long long b)
{
return a + b;
}
where currently gcc generates code like this:
move.l 16(%sp),%d1
move.l 20(%sp),%d2
move.l 8(%sp),%d0
add.l 12(%sp),%d2
addx.l %d0,%d1
move.l %d1,%d0
move.l %d2,%d1
whereas with -fno-split-wide-types it generates this:
move.l 16(%sp),%d0
move.l 20(%sp),%d1
move.l 8(%sp),%d2
add.l 12(%sp),%d1
addx.l %d2,%d0
How can I get rid of these extra move instructions?
Another more general question would be how should be wide registers
handled in general. In the past I tried to avoid splitting instructions
before reload, exactly because the extra subregs caused worse code. Has
this changed? AFAICT this would mean in the back end to split DI values as
early as possible, which could have its advantages, but also its
challenges, as m68k is still a cc0 target and with instructions like
addx.l above, so far I avoided splitting these at all.
bye, Roman
More information about the Gcc
mailing list