![]() |
Specifying Registers for Function Parameters |
Previous | Variables in Specified Registers |
In TIGCC, it is possible to specify explictly where the parameters to a function a stored, in a syntax similar to global and local register variables.
TIGCC can pass function parameters either on the stack or through registers.
You can use the regparm
attribute or the '-mregparm'
compiler switch to let the compiler automatically choose registers for the parameters, but you can
also tell TIGCC to put a parameter into a specific register. This can be very handy when
interfacing with assembly code. For example, the following assembly function expects its 2
parameters in the d1
and d2
registers:
asm(".globl add add: move.l %d2,%d0 add.l %d1,%d0 rts");Therefore, its prototype would be:
unsigned long add (unsigned long a asm("d1"), unsigned long b asm("d2"));Explicit register specifications for function parameters are also supported in function headers (not only in prototypes). Therefore, the assembly function above could be replaced by the following C equivalent:
unsigned long add (unsigned long a asm("d1"), unsigned long b asm("d2")) { return a + b; }to pass a register parameter. The registers do not necessarily need to be call-clobbered. You can also use a2-a5/d3-d7 to pass a register parameter. But note that the called function still has to save and restore those registers, even if they are used as arguments! In C code, TIGCC takes care of that automatically for you, but in assembly code, it is something you need to remember.