Gabriel Paubert wrote:
On Thu, Jan 17, 2008 at 05:48:10PM +0300, Sergei Poselenov wrote:
Hello Andrew,
Preprocessed and assembler code generated by the GCC 4.2.2 ppc-linux
cross-compiler:
http://www.emcraft.com/codesize/gcc-4.2.2/interrupts.i
http://www.emcraft.com/codesize/gcc-4.2.2/interrupts.s
The same code built with gcc-4.0.0 cross-compiler:
http://www.emcraft.com/codesize/gcc-4.0.0/interrupts.i
http://www.emcraft.com/codesize/gcc-4.0.0/interrupts.s
The functions do not appear in the same order in both files, it's a
bit surprising! Anyway look for example at irq_install_handler:
- gcc-4.0 saves all registers using stmw r24,xx(r1) and restores them
with lmw r24,xx(r1) however this means that r29 is overwritten in
the epilogue.
- gcc-4.2.2 saves and restores registers individually which
means that it takes 12 more instructions. There go 48 bytes.
This is especially visible in the epilogue (in the prologue
the saves are interspersed with other instructions).
In this case -ffixed-r29 hurts, but gcc4.2.2 looks more correct.
OK, so the code here is bigger, partly because a bug has been fixed.
Not a bad thing, in general.
I suspect that the real reason for the change in save/restore is because
not using lmw/stmw is faster. That's just a guess though. gcc could probably
be fixed to use ldmw/stmw if -Os is used.
Anyway, now we've found something specific this is for the ppc maintainer to
comment.
Andrew.