I'm producing MIPS code with gcc 4.3.3, specifically on the PSP.

When I started looking over the output, I started noticing a strange
pattern: the code is often using the s registers which need to be saved
rather than the t registers which don't. This produces code that constantly
needs to save and load the s registers for no discernible reason -- a huge
waste of cycles!

This happens regardless of the optimization level (though I haven't tried
O0)

Here's an example. Notice that only t0 is used, and the compiler chooses to
use all the s registers instead. Notice how inefficient the code becomes:

089033e4 <_ZN9PspMemory8testCopyEPKhS1_j>:
 89033e4:       27bdffd8        addiu   sp,sp,-40
 89033e8:       afb60018        sw      s6,24(sp)
 89033ec:       00a0b021        move    s6,a1
 89033f0:       3c0508ac        lui     a1,0x8ac
 89033f4:       afb7001c        sw      s7,28(sp)
 89033f8:       afb40010        sw      s4,16(sp)
 89033fc:       0080b821        move    s7,a0
 8903400:       00c0a021        move    s4,a2
 8903404:       24a595c8        addiu   a1,a1,-27192
 8903408:       24040001        li      a0,1
 890340c:       afbf0024        sw      ra,36(sp)
 8903410:       afbe0020        sw      s8,32(sp)
 8903414:       afb50014        sw      s5,20(sp)
 8903418:       afb3000c        sw      s3,12(sp)
 890341c:       afb20008        sw      s2,8(sp)
 8903420:       afb10004        sw      s1,4(sp)
 8903424:       0e242f24        jal     890bc90 <_Z13PspDebugTracebPKcz>
 8903428:       afb00000        sw      s0,0(sp)
 890342c:       12800036        beqz    s4,8903508 
<_ZN9PspMemory8testCopyEPKhS1_j+0x124>
 8903430:       3c0208ac        lui     v0,0x8ac
 8903434:       2455961c        addiu   s5,v0,-27108
 8903438:       3c0208ac        lui     v0,0x8ac
 890343c:       245e95fc        addiu   s8,v0,-27140
 8903440:       02e09021        move    s2,s7
 8903444:       02c08821        move    s1,s6
 8903448:       00009821        move    s3,zero
 890344c:       0a240d1e        j       8903478 
<_ZN9PspMemory8testCopyEPKhS1_j+0x94>
 8903450:       00008021        move    s0,zero
 8903454:       02003021        move    a2,s0
 8903458:       24040001        li      a0,1
 890345c:       0e242f24        jal     890bc90 <_Z13PspDebugTracebPKcz>
 8903460:       02a02821        move    a1,s5
 8903464:       26100001        addiu   s0,s0,1
 8903468:       0214102b        sltu    v0,s0,s4
 890346c:       26520001        addiu   s2,s2,1
 8903470:       10400015        beqz    v0,89034c8 
<_ZN9PspMemory8testCopyEPKhS1_j+0xe4>
 8903474:       26310001        addiu   s1,s1,1
 8903478:       92480000        lbu     t0,0(s2)
 890347c:       92270000        lbu     a3,0(s1)
 8903480:       5107fff9        beql    t0,a3,8903468 
<_ZN9PspMemory8testCopyEPKhS1_j+0x84>
 8903484:       26100001        addiu   s0,s0,1
 8903488:       1660fff3        bnez    s3,8903458 
<_ZN9PspMemory8testCopyEPKhS1_j+0x74>
 890348c:       02003021        move    a2,s0
 8903490:       3c0508ac        lui     a1,0x8ac
 8903494:       24040001        li      a0,1
 8903498:       0e242f24        jal     890bc90 <_Z13PspDebugTracebPKcz>
 890349c:       24a595dc        addiu   a1,a1,-27172
 89034a0:       02c03821        move    a3,s6
 89034a4:       02804021        move    t0,s4
 89034a8:       24040001        li      a0,1
 89034ac:       03c02821        move    a1,s8
 89034b0:       0e242f24        jal     890bc90 <_Z13PspDebugTracebPKcz>
 89034b4:       02e03021        move    a2,s7
 89034b8:       24130001        li      s3,1
 89034bc:       92270000        lbu     a3,0(s1)
 89034c0:       0a240d15        j       8903454 
<_ZN9PspMemory8testCopyEPKhS1_j+0x70>
 89034c4:       92480000        lbu     t0,0(s2)
 89034c8:       1260000f        beqz    s3,8903508 
<_ZN9PspMemory8testCopyEPKhS1_j+0x124>
 89034cc:       3c0508ac        lui     a1,0x8ac
 89034d0:       8fbf0024        lw      ra,36(sp)
 89034d4:       8fbe0020        lw      s8,32(sp)
 89034d8:       8fb7001c        lw      s7,28(sp)
 89034dc:       8fb60018        lw      s6,24(sp)
 89034e0:       8fb50014        lw      s5,20(sp)
 89034e4:       8fb40010        lw      s4,16(sp)
 89034e8:       8fb3000c        lw      s3,12(sp)
 89034ec:       8fb20008        lw      s2,8(sp)
 89034f0:       8fb10004        lw      s1,4(sp)
 89034f4:       8fb00000        lw      s0,0(sp)
 89034f8:       24a59c8c        addiu   a1,a1,-25460
 89034fc:       24040001        li      a0,1
 8903500:       0a242f24        j       890bc90 <_Z13PspDebugTracebPKcz>
 8903504:       27bd0028        addiu   sp,sp,40
 8903508:       3c0508ac        lui     a1,0x8ac
 890350c:       8fbf0024        lw      ra,36(sp)
 8903510:       8fbe0020        lw      s8,32(sp)
 8903514:       8fb7001c        lw      s7,28(sp)
 8903518:       8fb60018        lw      s6,24(sp)
 890351c:       8fb50014        lw      s5,20(sp)
 8903520:       8fb40010        lw      s4,16(sp)
 8903524:       8fb3000c        lw      s3,12(sp)
 8903528:       8fb20008        lw      s2,8(sp)
 890352c:       8fb10004        lw      s1,4(sp)
 8903530:       8fb00000        lw      s0,0(sp)
 8903534:       24a59628        addiu   a1,a1,-27096
 8903538:       24040001        li      a0,1
 890353c:       0a242f24        j       890bc90 <_Z13PspDebugTracebPKcz>
 8903540:       27bd0028        addiu   sp,sp,40



-- 
View this message in context: 
http://old.nabble.com/GCC-for-MIPS-not-using-the-right-registers--tp29293261p29293261.html
Sent from the gcc - bugs mailing list archive at Nabble.com.

Reply via email to