[fpc-devel] avr-port: register usage and calling convention?
georg at ghgrp.com
Tue Mar 31 02:14:50 CEST 2015
I am about to implement some rtl procedures in avr - assembler, and of
course register usage and calling conventions are important for that.
The fpc wiki says concerning avr, "It uses the GCC AVR tool chain and
will be compatible with GCC regarding calling conventions etc.". That
would be passing arguments in registers r25 - r8 downwards (first
argument in r24, r25 if 16 byte, 2nd below that etc.). High bytes are in
high and low bytes in low register no.
Function results are returned in r22 - r25 (32byte), r24-r25 (16 byte).
According to GCC documentation, R0, R18-R27, R30, R31 are call used, R
2-R17, R28 and R29 are call saved. R1 has always to be 0.
Actual code produced by the compiler looks different. It is the same
sequence of arguments (first in highest registers, second below that
...), but the byte order is reversed, lowest byte in highest register no.
After noting this discrepancy, I am of course unsure about the whole
matter. Could somebody tell me what convention is actually used by the
A word to register R1: it shall be 0 at all times according to GCC
specs. In some occasions, the compiler uses this to set other registers
to 0, by MOV reg, R0. On other occasions the compiler uses the CLR Reg
instruction (which is actually a pseudo opcode that translates to EOR
reg, reg). On the other hand, R0 and R1 are used by the MUL / MULS /
MULSU instructions to return the multiplication result. Forgetting to
clear R0 again after a multiplication (i.e. in an assembler routine)
will thus lead to errors at some later time.
As long as the MOV is not used because it does not change any status
flags, It might be a good idea if the compiler always used the CLR
Thanks in advance for some info on the register stuff,
More information about the fpc-devel