diff --git a/doc/vbccppc.texi b/doc/vbccppc.texi
new file mode 100644
index 0000000..9d7fe3e
--- /dev/null
+++ b/doc/vbccppc.texi
@@ -0,0 +1,349 @@
+This chapter documents the Backend for the PowerPC processor family.
+
+@section Additional options for this version
+
+This backend provides the following additional options:
+
+@table @option
+
+    @item -amiga-align
+
+                Do not require any alignments greater than 2 bytes.
+                This is needed when accessing Amiga system-structures, but
+                can cause a performance penalty.
+
+    @item -baserel32mos
+
+                Use 32bit base-relative addressing as used by MorphOS.
+
+    @item -baserel32os4
+
+                Use 32bit base-relative addressing as used by AmigaOS 4.
+
+    @item -const-in-data
+
+                By default constant data will be placed in the @code{.rodata}
+                section. Using this option it will be placed in the 
+                @code{.data} section.
+                Note that on operating systems with memory protection this
+                option will disable write-protection of constant data.
+
+    @item -eabi
+               Use the PowerPC Embedded ABI (eabi).
+
+    @item -elf
+
+                Do not prefix symbols with '_'. Prefix labels with '.'.
+
+    @item -fsub-zero
+
+                Use fsub to load a floating-point-register with zero.
+                This is faster but requires all registers to always contain
+                valid values (i.e. no NaNs etc.) which may not be the case
+                depending on startup-code, libraries etc.
+
+    @item -gas
+                Create code suitable for the GNU assembler.
+
+    @item -madd
+               Use the @code{fmadd/fmsub} instructions for combining
+                multiplication with addition/subtraction in one instruction.
+                As these instructions do not round between the operations,
+                they have increased precision over separate addition and
+                multiplication.
+
+                While this usually does no harm, it is not ISO conforming
+                and therefore not the default behaviour.
+
+    @item -merge-constants
+
+                Place identical floating point constants at the same
+                memory location. This can reduce program size.
+
+    @item -no-align-args
+
+                Do not align function arguments on the stack stricter
+                than 4 bytes. Default with @option{-poweropen}.
+
+    @item -no-peephole
+
+                Do not perform several peephole optimizations.
+                Currently includes:
+                @itemize @minus
+                 @item better use of d16(r) addressing
+                 @item use of indexed addressing modes
+                 @item use of update-flag
+                 @item use of record-flag
+                 @item use of condition-code-registers to avoid certain branches
+                @end itemize
+
+    @item -no-regnames
+
+                Do not use register names but only numbers in the assembly
+                output. This is necessary
+                to avoid name-conflicts when using @option{-elf}.
+
+    @item -poweropen
+
+                Generate code for the PowerOpen ABI like used in AIX.
+                This does not work correctly yet.
+
+    @item -sc
+
+                Generate code for the modified PowerOpen ABI used in the
+                StormC compiler (aka WarpOS ABI).
+
+    @item -sd
+                 Place all objects in small data-sections.
+
+    @item -setccs
+
+                The V.4 ABI requires signalling (in a bit of the condition code
+                register) when arguments to varargs-functions
+                are passed in floating-point registers.
+                vbcc usually does not make use of this and
+                therefore does not set that bit by default.
+                This may lead to problems when linking objects compiled by
+                vbcc to objects/libraries created by other
+                compilers and calling varargs-functions with floating-point
+                arguments.
+                @option{-setccs} will fix this problem.
+
+    @item -use-commons
+
+                Use real common symbols instead of bss symbols for
+                non-initialized external variables.
+
+    @item -use-lmw
+
+                Use @code{lmw/stmw}-instructions. This can significantly reduce
+                code-size. However these instructions may be slower on
+                certain PPCs.
+
+@end table
+
+@section ABI
+
+        This backend supports the following registers:
+
+        @itemize @minus
+        @item @code{r0} through @code{r31} for the general purpose registers,
+        @item @code{f0} through @code{f31} for the floating point registers and
+        @item @code{cr0} through @code{cr7} for the condition-code registers.
+        @end itemize
+
+        Additionally, the register pairs @code{r3/r4, r5/r6, r7/r8, r9/r10,
+        r14/r15, r16/r17, r18/r19,
+        r20/r21, r22/r23, r24/r25, r26/r27, r28/r29} and @code{r30/r31} are
+        available.
+
+        @code{r0, r11, r12, f0, f12} and @code{f13} are reserved by the
+        backend.
+
+        
+
+    The current version generates assembly output for use with @file{vasmppc}
+    or the GNU assembler. The generated code should
+    work on 32bit systems based on a PowerPC CPU using the V.4 ABI or the
+    PowerPC Embedded ABI (eabi).
+
+
+    The registers r0, r3-r12, f0-f13 and cr0-cr1 are used as scratch registers
+    (i.e. they can be destroyed in function calls), all other registers are
+    preserved. r1 is the stack-pointer and r13 is the small-data-pointer if
+    small-data-mode is used.
+
+    The first 8 function arguments which have integer or pointer types
+    are passed in registers r3 through r10 and the first 8 floating-point
+    arguments are passed in registers f1 through f8. All other arguments
+    are passed on the stack.
+
+    Integers and pointers are returned in r3 (and r4 for long long),
+    floats and doubles in f1.
+    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 (-amiga-align)
+
+    char                8                       1 (1)
+    short              16                       2 (2)
+    int                32                       4 (2)
+    long               32                       4 (2)
+    long long          64                       8 (2)
+    all pointers       32                       4 (2)
+    float              32                       4 (2)
+    double             64                       8 (2)
+    @end example
+
+@section Target-specific variable-attributes
+
+    The PPC-backend offers the following variable-attributes:
+
+@table @code
+
+    @item __saveds
+                    Load the pointer to the small data segment at
+                 function-entry. Applicable only to functions.
+
+    @item __chip
+                      Place variable in chip-memory. Only applicable on
+                 AmigaOS to variables with static storage-duration.
+
+    @item __far
+                       Do not place this variable in the small-data segment
+                 in small-data-mode. No effect in large-data-mode.
+                 Only applicable to variables with static storage-
+                 duration.
+
+    @item __near
+              Currently ignored.
+
+    @item __saveall
+                Make sure all registers are saved by this function. On lower
+                optimization levels, all volatile registers will be saved
+                additionally. On higher levels, only the ones that may be
+                destroyed, are saved.
+
+    @item __interrupt
+                Return with en @code{rfi}-instruction rather than @code{blr}.
+
+    @item __section("name","attr")
+                 Place this function/object in section "name" with
+                 attributes "attr".
+@end table
+
+
+@section Target-specific pragmas
+
+    The PPC-backend offers the following #pragmas:
+
+@table @code
+
+    @item #pragma amiga-align
+             Set alignment like -amiga-alignment option.
+
+    @item #pragma natural-align
+           Align every type to its own size.
+
+    @item #pragma default-align
+           Set alignment according to command-line options.
+
+@end table
+
+@section Predefined Macros
+
+        This backend defines the following macros:
+
+@table @code
+        @item __PPC__
+        
+        @item __AMIGADATE__
+                This is set to current date as @code{"(DD.MM.YYYY)"},
+                useful with version strings.
+@end table
+
+@section Stack
+
+    If the @option{-stack-check} option is used, every function-prologue will
+    call the function @code{__stack_check} with the stacksize needed by this
+    function in register r12. This function has to consider its own
+    stacksize and must restore all registers.
+
+@section Stdarg
+
+    A possible <stdarg.h> for V.4 ABI could look like this:
+
+@example
+
+typedef struct @{
+  int gpr;
+  int fpr;
+  char *regbase;
+  char *membase;
+@} va_list;
+
+char *__va_start(void);
+char *__va_regbase(void);
+int __va_fixedgpr(void);
+int __va_fixedfpr(void);
+
+#define va_start(vl,dummy) \
+  ( \
+    vl.gpr=__va_fixedgpr(), \
+    vl.fpr=__va_fixedfpr(), \
+    vl.regbase=__va_regbase(), \
+    vl.membase=__va_start() \
+  )
+
+#define va_end(vl) ((vl).regbase=(vl).membase=0)
+
+#define va_copy(new,old) ((new)=(old))
+
+#define __va_align(type) (__alignof(type)>=4?__alignof(type):4)
+
+#define __va_do_align(vl,type) ((vl).membase=(char *)((((unsigned int)((vl).membase))+__va_align(type)-1)/__va_align(type)*__va_align(type)))
+
+#define __va_mem(vl,type) (__va_do_align((vl),type),(vl).membase+=sizeof(type),((type*)((vl).membase))[-1])
+
+#define va_arg(vl,type) \
+ ( \
+  (__typeof(type)&127)>10? \
+    __va_mem((vl),type) \
+  : \
+   ( \
+    (((__typeof(type)&127)>=6&&(__typeof(type)&127)<=8)) ? \
+     ( \
+      ++(vl).fpr<=8 ? \
+        ((type*)((vl).regbase+32))[(vl).fpr-1] \
+      : \
+        __va_mem((vl),type) \
+     ) \
+    : \
+     ( \
+      ++(vl).gpr<=8 ? \
+        ((type*)((vl).regbase+0))[(vl).gpr-1] \
+      : \
+        __va_mem((vl),type) \
+     ) \
+   ) \
+ )
+
+@end example
+
+    A possible <stdarg.h> for PowerOpen ABI could look like this:
+
+@example
+
+typedef unsigned char *va_list;
+
+#define __va_align(type) (4)
+
+#define __va_do_align(vl,type) ((vl)=(char *)((((unsigned int)(vl))+__va_align(type)-1)/__va_align(type)*__va_align(type)))
+
+#define __va_mem(vl,type) (__va_do_align((vl),type),(vl)+=sizeof(type),((type*)(vl))[-1])
+
+#define va_start(ap, lastarg) ((ap)=(va_list)(&lastarg+1))
+ 
+#define va_arg(vl,type) __va_mem(vl,type)
+ 
+#define va_end(vl) ((vl)=0)
+
+#define va_copy(new,old) ((new)=(old))
+
+@end example
+
+
+@section Known problems
+
+@itemize @minus
+  @item  composite types are put on the stack rather than passed via pointer
+  @item indication of fp-register-args with bit 6 of cr is not done well
+@end itemize
+
+
+
+
