This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
subreg pass
- From: Roman Zippel <zippel at linux-m68k dot org>
- To: gcc at gcc dot gnu dot org
- Date: Mon, 5 Mar 2007 14:29:05 +0100 (CET)
- Subject: subreg pass
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