PowerPC 403 cross
Mike Meissner
meissner@cygnus.com
Thu Apr 17 11:23:00 GMT 1997
root@cicdphx.com (root) writes:
>
> Hello All....
>
>
> I have been working recently on compiling C programs using gcc
> (target: powerpc-elf32), and was interested if anyone had some
> information specific to the PPC403 when using gcc. I am unsure as to
> which registers are used for what, and any compiler flags I need to use.
> Currently I use flags: -mcpu=403, -D_BIG_ENDIAN. I have figured out that
> r1 appears to used as a stack pointer of sorts, but as far as which
> registers are used for scratch, how parameters are passed, etc. I am in
> the dark.
Get the following files via anonymous ftp from cambridge.cygnus.com:
~ftp/pub/ppc-docs/ppc-sysv-1995-09.ps.gz
~ftp/pub/ppc-docs/ppc-eabi-1995-01.ps.gz
The first is the System V ABI that originally came from Sun (for the short
lived Solaris port to PowerPC), and the second is the eABI (embedded
application binary interface) that is a modification of the System V ABI
(changes the stack alignment, removes some relocations and adds others, makes
r2 be a secondary small data register).
In short, the ABI looks like:
SP----> +---------------------------------------+
| back chain to caller | 0
+---------------------------------------+
| saved LR | 4
+---------------------------------------+
| Parameter save area (P) | 8
+---------------------------------------+
| Alloca space (A) | 8+P
+---------------------------------------+
| Local variable space (L) | 8+P+A
+---------------------------------------+
| saved CR (C) | 8+P+A+L
+---------------------------------------+
| Save area for GP registers (G) | 8+P+A+L+C
+---------------------------------------+
| Save area for FP registers (F) | 8+P+A+L+C+G
+---------------------------------------+
old SP->| back chain to caller's caller |
+---------------------------------------+
The registers are used as follows (volatile means that a function does not
have to preserve its value when it returns, saved means that a function must
restore its value before returnning):
r0 volatile, may be used by function linkage
r1 stack pointer
r2 secondary small data area pointer
r3 .. r4 volatile, pass 1st - 2nd int args, return 1st - 2nd ints
r5 .. r10 volatile, pass 3rd - 8th int args
r11 .. r12 volatile, may be used by function linkage
r13 small data area pointer
r14 .. r30 saved
r31 saved, static chain if needed.
f0 volatile
f1 volatile, pass 1st float arg, return 1st float
f2 .. f8 volatile, pass 2nd - 8th float args
f9 .. f13 volatile
f14 .. f31 saved
lr volatile, return address
ctr volatile
xer volatile
fpscr volatile*
cr0 volatile
cr1 volatile**
cr2 .. cr4 saved
cr5 .. cr7 volatile
* The VE, OE, UE, ZE, XE, NI, and RN (rounding mode) bits of the FPSCR may be
changed only by a called function such as fpsetround that has the documented
effect of changing them, the rest of the FPSCR is volatile.
** Bit 6 of the CR (CR1 floating point invalid exception bit) is set to 1 if a
variable argument function is passed floating point arguments in registers.
When alloca is executed, the back chain to the caller's stack frame and the
link register save area must be updated.
The parameter save area does not contain space to store the 8 integer
arguments. If it is desired that they be stored, the callee must allocate
space to save it in the local variable area of the stack. Structures and
unions are copied into temporary slots and an address of the temporary slot is
passed as the argument.
Variable argument functions must store the registers used for passing
arguments that aren't used for fixed arguments into a 96 word area on the stack
in the local variable section. If bit 6 of the CR is not 1, it doesn't have to
save the floating point registers. The va_list type is defined as follows:
typedef struct {
char gpr; /* index to next saved gp register */
char fpr; /* index to next saved fp register */
char *overflow_arg_area; /* ptr to next overflow argument */
char *reg_save_area; /* ptr to reg save area */
} va_list[1];
--
Michael Meissner, Cygnus Solutions (East Coast)
4th floor, 955 Massachusetts Avenue, Cambridge, MA 02139, USA
meissner@cygnus.com, 617-354-5416 (office), 617-354-7161 (fax)
More information about the crossgcc
mailing list