blob: 64430c6352efe29e4fbfed71fa6bffeb858c899f [file] [log] [blame]
This chapter documents the Backend for the VideoCore IV processor family.
The backend is in a very early stage, it is not complete, and it can not
yet be considered useful!
Also note that it is based on freely available, unofficial, and possibly
incorrect information on the target processor.
@section Additional options for this version
This backend provides the following additional options:
@table @option
@item -short-double
Use native 32bit floating point for double and long double.
This is much more efficient, but not ISO C conforming.
@item -one-section
Put all code and data in the same section (.text).
@item -no-delayed-popping
By default arguments of function calls are not always popped
from the stack immediately after the call, so that the
arguments of several calls may be popped at once.
With this option @command{vbcc} can be forced to pop them after every
function call.
This may simplify debugging and reduce the
stack size needed by the compiled program.
@item -no-peephole
Disable most backend peephole optimizations.
Just for testing.
@item -noext-regs
Do not use registers r16-r23. Just for testing.
@item -cond-limit=<n>
Set the limit (in number of intermediate code instructions)
for the length of code-sequences considered for conditional
execution (default: 2).
@end table
@section ABI
This backend supports the following registers:
@itemize @minus
@item @code{r0} through @code{r31} for the general purpose registers
@end itemize
Additionally, the register pairs @code{r0/r1} @code{r2/r3, r4/r5, r6/r7, r8/r9,
r10/r11, r12/r13, r14/r15,
r16/r17, r18/r19, r20/r21, r22/r23} are
available.
@code{r14, r15, r24-r31} are currently reserved by the
backend.
The current version generates assembly output for use with @file{vasm}.
The registers r0-r5 and r14-r15 are used as scratch registers
(i.e. they can be destroyed in function calls), all other registers are
preserved. r25 is the stack-pointer.
The first 6 function arguments which have integer, float32 or pointer types
are passed in registers r0 through r5. All other arguments
are passed on the stack.
Integers, float32 and pointers are returned in r0.
All other types are returned by passing the function the address
of the result as a hidden argument - so when you call such a function
without a proper declaration in scope you can expect a crash.
The elementary data types are represented like:
@example
type size in bits alignment in bytes
char 8 1
short 16 2
int 32 4
long 32 4
long long 64 8 not yet supported
all pointers 32 4
float 32 4
double 64 (32) 4
long double 64 (32) 4
@end example
@section Target-specific variable-attributes
The vidcore-backend offers the following variable-attributes:
@table @code
@item __section("name","attr")
Place this function/object in section "name" with
attributes "attr".
@end table
@section Target-specific pragmas
The vidcore-backend offers the following #pragmas:
@table @code
@item none at the moment...
@end table
@section Predefined Macros
This backend defines the following macros:
@table @code
@item __VIDEOCORE__
@item __SHORT_DOUBLE__ (if -short-double is used)
@end table
@section Stdarg
stdarg-implementation is not yet fully working. One restriction is that
when calling a varargs function, the prototype must be in scope (this is
ISO C conforming). Another one is that the stdarg-macros only work as
long as all fixed arguments are passed in registers.
This will be fixed in the future.
@section Known problems
@itemize @minus
@item no support for long long
@item no support for 64bit floating point
@item stdarg problems mentioned above
@item suboptimal code quality
@item ...
@end itemize