- •General
- •Introduction
- •Legal
- •Installation
- •Installing for DOS/Windows
- •Installing for AmigaOS
- •Tutorial
- •The Frontend
- •Usage
- •The Compiler
- •General Compiler Options
- •Errors and Warnings
- •Data Types
- •Optimizations
- •Register Allocation
- •Flow Optimizations
- •Common Subexpression Elimination
- •Copy Propagation
- •Constant Propagation
- •Dead Code Elimination
- •Loop-Invariant Code Motion
- •Strength Reduction
- •Induction Variable Elimination
- •Loop Unrolling
- •Function Inlining
- •Intrinsic Functions
- •Unused Object Elimination
- •Alias Analysis
- •Inter-Procedural Analysis
- •Cross-Module Optimizations
- •Instruction Scheduling
- •Debugging Optimized Code
- •Pragmas
- •Register Parameters
- •Inline-Assembly Functions
- •Variable Attributes
- •Type Attributes
- •__typeof
- •__offsetof
- •Known Problems
- •Credits
- •Additional options
- •Small data
- •Small code
- •FPUs
- •Math
- •Stack
- •Known problems
- •PowerPC Backend
- •Additional options for this version
- •Stack
- •Stdarg
- •Known problems
- •DEC Alpha Backend
- •Additional options for this version
- •Stdarg
- •i386 Backend
- •Additional options for this version
- •Stdarg
- •Known Problems
- •c16x Backend
- •Additional options for this version
- •Stdarg
- •Known Problems
- •Additional options for this version
- •Stack
- •Stdarg
- •Known Problems
- •Instruction Scheduler
- •Introduction
- •Usage
- •Known problems
- •C Library
- •Introduction
- •Legal
- •Embedded Systems
- •Startup
- •Heap
- •Input/Output
- •Floating Point
- •Useless Functions
- •Linking/Locating
- •Startup
- •Floating point
- •Stack
- •Small data model
- •Restrictions
- •Minimal startup
- •amiga.lib
- •auto.lib
- •extra.lib
- •ixemul
- •Introduction
- •Legal
- •Usage
- •Startup
- •Floating point
- •Stack
- •Small data model
- •Restrictions
- •libamiga.a
- •libauto.a
- •libextra.a
- •WarpOS/PPC
- •Startup
- •Floating point
- •Stack
- •Restrictions
- •amiga.lib
- •auto.lib
- •extra.lib
- •MorphOS/PPC
- •Floating point
- •Stack
- •Small data model
- •Restrictions
- •libamiga.a
- •libauto.a
- •libextra.a
- •List of Errors
- •Backend Interface
Chapter 6: DEC Alpha Backend |
51 |
6 DEC Alpha Backend
This chapter documents the Backend for the DEC Alpha processor family.
6.1 Additional options for this version
This backend provides the following additional options:
‘-merge-constants’
Place identical floating point constants at the same memory location. This can reduce program size and increase compilation time.
‘-const-in-data’
By default constant data will be placed in the code section (and therefore is accessable with faster pc-relative addressing modes). Using this option it will be placed in the data section. Note that on operating systems with memory protection this option will disable write-protection of constant data.
‘-no-builtins’
Do not replace certain builtin functions by inline code. This may be useful if you use this code generator with another frontend than vbcc. stdarg.h will not work with -no-builtins.
‘-stabs’ Generate stabs debug infos (if -g is specified) rather than DWARF2 which is the default. Consider this obsolete.
6.2 ABI
This backend supports the following registers:
−$0 through $31 for the general purpose registers and
−$f0 through $f31 for the floating point registers.
The current version generates assembly output for use with the GNU assembler. The generated code should work on systems with 21064, 21066, 21164 and higher Alpha CPUs.
The registers $0-$8, $16-$28, $f0, $f1 and $f10-$f30 are used as scratch registers (i.e. they can be destroyed in function calls), all other registers are preserved. Of course $31 and $f31 cannot be used.
The first 6 function arguments which have arithmetic or pointer types are passed in registers $16/$f16 through $21/$f21.
Integers and pointers are returned in $0, floats and doubles in $f0. 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: |
|
|
type |
size in bits |
alignment in bytes |
char |
8 |
1 |
short |
16 |
2 |
52 |
vbcc manual |
int |
32 |
4 |
long |
64 |
8 |
long long |
64 |
8 |
all pointers |
64 |
8 |
float |
32 |
4 |
double |
64 |
8 |
6.3 Predefined Macros
This backend defines the following macros:
__ALPHA__
6.4 Stdarg
A possible <stdarg.h> could look like this:
typedef struct char *regbase; char *membase; int arg; va_list;
char *__va_start(void); int __va_fixargs(void);
#define va_start(vl,dummy) \ (vl.arg=__va_fixargs(),vl.regbase=__va_start(),vl.membase=vl.regbase+(6-vl.arg)*16
#define va_end(vl) (vl.regbase=vl.membase=0)
#define __va_size(type) ((sizeof(type)+7)/8*8) #define va_arg(vl,type) \
( \
((__typeof(type)&15)<=10&&++vl.arg<=6) ? \ ( \
((__typeof(type)&15)>=6&&(__typeof(type)&15)<=8) ? \ (vl.regbase+=16,*(type *)(vl.regbase-8)) \
:\
(vl.regbase+=16,*(type *)(vl.regbase-16)) \
)\
:\
(vl.membase+=__va_size(type),*(type *)(vl.membase-__va_size(type))) \
)
Chapter 6: DEC Alpha Backend |
53 |
6.5 Known problems
−generated code is rather poor
−several other problems
54 |
vbcc manual |