RFC: Improve MIPS code generation.

David Daney ddaney@avtrex.com
Fri Oct 3 22:13:00 GMT 2003


Recently I have been thinking about gcc's code generation especially
WRT the MIPS o32 ABI, but I think that the ideas might be relevant to
other architectures as well.

I am not quite sure how to implement this, but wanted to get feedback.


For the MIPS o32 ABI (when compiling most application code) all
non-leaf functions have a prolog generated by the .cpload pseudo-op
which results in code being generated (by as) to set up the $gp (GOT
pointer register) for the rest of the function.

A typical disassembly is something like this:

00400a9c <_Z2f1v>:
  400a9c:    3c1c0fc0     lui    gp,0xfc0
  400aa0:    279c7704     addiu    gp,gp,30468
  400aa4:    0399e021     addu    gp,gp,t9
  400aa8:    27bdffe0     addiu    sp,sp,-32
.
.
.


And a typical calling sequence would be:
.
.
.
  400c88:    8f998084     lw    t9,-32636(gp)
  400c8c:    0320f809     jalr    t9
.
.
.

Now we know (or at least I think we know) that the gp will have the
same value for any code from a single compilation unit (.o input to
ld) because of how ld works WRT creating GOTs.

Here is the big question:

For function calls within a single compilation unit why couldn't the
jalr be replaced by a bal (branch and link) to the 4th instruction of
the target function?

You would save setting up $t9 before the call and setting up $gp in
the called function.  A total savings of 4 instructions for each
intra-compilation-unit call.

There might be even greater savings if conditional branches around
jalr could be replaced by conditional bal of the opposite condition.


Thanks for considering this,

David Daney




More information about the Gcc mailing list