123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- IQ2000 ABI
- =========
- Sizes and alignments
- --------------------
- Type Size (bytes) Alignment (bytes)
- char 1 1
- short 2 2
- int 4 4
- unsigned 4 4
- long 4 4
- long long 8 8
- float 4 4
- double 8 8
- pointers 4 4
- * alignment within aggregates (structs and unions) is as above, with
- padding added if needed
- * aggregates have alignment equal to that of their most aligned
- member
- * aggregates have sizes which are a multiple of their alignment
- Floating point
- --------------
- All emulated using IEEE floating point conventions.
- Registers
- ----------------
- %0 always zero
- %1 call clobbered
- %2 return value
- %3 return value
- %4 argument register 1
- %5 argument register 2
- %6 argument register 3
- %7 argument register 4
- %8 argument register 5
- %9 argument register 6
- %10 argument register 7
- %11 argument register 8
- %12 call clobbered
- %13 call clobbered
- %14 call clobbered
- %15 call clobbered
- %16 call saved
- %17 call saved
- %18 call saved
- %19 call saved
- %20 call saved
- %21 call saved
- %22 call saved
- %23 call saved
- %24 call clobbered
- %25 call clobbered
- %26 reserved
- %27 frame ptr
- %28 global ptr
- %29 stack ptr
- %30 reserved
- %31 return address
- Stack alignment 8 bytes
- Structures passed <= 32 bits as values, else as pointers
- The IQ2000 Stack
- ---------------
- Space is allocated as needed in the stack frame for the following at compile
- time:
- * Outgoing parameters beyond the eighth
- * All automatic arrays, automatic data aggregates, automatic
- scalars which must be addressable, and automatic scalars for
- which there is no room in registers
- * Compiler-generated temporary values (typically when there are
- too many for the compiler to keep them all in registers)
- Space can be allocated dynamically (at runtime) in the stack frame for the
- following:
- * Memory allocated using the alloca() function of the C library
- Addressable automatic variables on the stack are addressed with positive
- offsets relative to %27; dynamically allocated space is addressed with positive
- offsets from the pointer returned by alloca().
- Stack Frame
- -----------
- +-----------------------+
- | Caller memory args |
- +-----------------------+ <-sp
- | Return address |
- +-----------------------+
- | Previous FP |
- +-----------------------+
- | Saved Registers |
- +-----------------------+
- | ... |
- +-----------------------+
- | Local Variables |
- +-----------------------+ <-fp
- | Alloca |
- +-----------------------+
- | ... |
- +-----------------------+
- | Parameter Word 2 |
- +-----------------------+
- | Parameter Word 1 |
- +-----------------------+ <-sp
- Parameter Assignment to Registers
- ---------------------------------
- Consider the parameters in a function call as ordered from left (first
- parameter) to right. GR contains the number of the next available
- general-purpose register. STARG is the address of the next available stack
- parameter word.
- INITIALIZE:
- Set GR=r4 and STARG to point to parameter word 1.
- SCAN:
- If there are no more parameters, terminate.
- Otherwise, select one of the following depending on the type
- of the next parameter:
- SIMPLE ARG:
- A SIMPLE ARG is one of the following:
- * One of the simple integer types which will fit into a
- general-purpose register,
- * A pointer to an object of any type,
- * A struct or union small enough to fit in a register (<= 32 bits)
- * A larger struct or union, which shall be treated as a
- pointer to the object or to a copy of the object.
- (See below for when copies are made.)
- If GR > r11, go to STACK. Otherwise, load the parameter value into
- general-purpose register GR and advance GR to the next general-purpose
- register. Values shorter than the register size are sign-extended or
- zero-extended depending on whether they are signed or unsigned. Then
- go to SCAN.
- DOUBLE or LONG LONG
- If GR > r10, go to STACK. Otherwise, if GR is odd, advance GR to the
- next register. Load the 64-bit long long or double value into register
- pair GR and GR+1. Advance GR to GR+2 and go to SCAN.
- STACK:
- Parameters not otherwise handled above are passed in the parameter
- words of the caller's stack frame. SIMPLE ARGs, as defined above, are
- considered to have size and alignment equal to the size of a
- general-purpose register, with simple argument types shorter than this
- sign- or zero-extended to this width. Round STARG up to a multiple of
- the alignment requirement of the parameter and copy the argument
- byte-for-byte into STARG, STARG+1, ... STARG+size-1. Set STARG to
- STARG+size and go to SCAN.
- Structure passing
- -----------------
- As noted above, code which passes structures and unions by value is implemented
- specially. (In this section, "struct" will refer to structs and unions
- inclusively.) Structs small enough to fit in a register are passed by value in
- a single register or in a stack frame slot the size of a register. Structs
- containing a single double or long long component are passed by value in two
- registers or in a stack frame slot the size of two registers. Other structs
- are handled by passing the address of the structure. In this case, a copy of
- the structure will be made if necessary in order to preserve the pass-by-value
- semantics.
- Copies of large structs are made under the following rules:
- ANSI mode K&R Mode
- --------- --------
- Normal param Callee copies if needed Caller copies
- Varargs (...) param Caller copies Caller copies
- In the case of normal (non-varargs) large-struct parameters in ANSI mode, the
- callee is responsible for producing the same effect as if a copy of the
- structure were passed, preserving the pass-by-value semantics. This may be
- accomplished by having the callee make a copy, but in some cases the callee may
- be able to determine that a copy is not necessary in order to produce the same
- results. In such cases, the callee may choose to avoid making a copy of the
- parameter.
- Varargs handling
- ----------------
- No special changes are needed for handling varargs parameters other than the
- caller knowing that a copy is needed on struct parameters larger than a
- register (see above).
- The varargs macros set up a register save area for the general-purpose
- registers to be saved. Because the save area lies between the caller and
- callee stack frames, the saved register parameters are contiguous with
- parameters passed on the stack. A pointer advances from the register save area
- into the caller's stack frame.
- Function return values
- ----------------------
- Type Register
- ---- --------
- int r2
- short r2
- long r2
- long long r2-r3
- float r2
- double r2-r3
- struct/union see below
- Structs/unions which will fit into two general-purpose registers are returned
- in r2, or in r2-r3 if necessary. Larger structs/unions are handled by the
- caller passing as a "hidden" first argument a pointer to space allocated to
- receive the return value.
- Copyright (C) 2003-2015 Free Software Foundation, Inc.
- Copying and distribution of this file, with or without modification,
- are permitted in any medium without royalty provided the copyright
- notice and this notice are preserved.
|