diff doc/manual/callconvs/callconv_ppc32.tex @ 328:276eb8c87aa0

- review and fixes, cleanup, amendments to calling convention appendix of manual
author Tassilo Philipp
date Fri, 22 Nov 2019 23:11:56 +0100
parents cde7b1f3b8f2
children 74c056b597b7
line wrap: on
line diff
--- a/doc/manual/callconvs/callconv_ppc32.tex	Fri Nov 22 23:08:59 2019 +0100
+++ b/doc/manual/callconvs/callconv_ppc32.tex	Fri Nov 22 23:11:56 2019 +0100
@@ -1,6 +1,6 @@
 %//////////////////////////////////////////////////////////////////////////////
 %
-% Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>, 
+% Copyright (c) 2007-2019 Daniel Adler <dadler@uni-goettingen.de>, 
 %                         Tassilo Philipp <tphilipp@potion-studios.com>
 %
 % Permission to use, copy, modify, and distribute this software for any
@@ -20,7 +20,7 @@
 % ==================================================
 % PowerPC 32
 % ==================================================
-\subsection{PowerPC (32bit) Calling Convention}
+\subsection{PowerPC (32bit) Calling Conventions}
 
 \paragraph{Overview}
 
@@ -35,7 +35,7 @@
 
 \paragraph{\product{dyncall} support}
 
-\product{Dyncall} and \product{dyncallback} are supported for PowerPC (32bit) Big Endian (MSB) on Darwin (tested on Apple Mac OS X) and Linux, however, fail for *BSD.
+\product{Dyncall} and \product{dyncallback} are supported for PowerPC (32bit) Big Endian (MSB), for Darwin's and System V's calling convention.
 
 
 \subsubsection{Mac OS X/Darwin}
@@ -49,24 +49,22 @@
 {\bf gpr0}          & scratch\\
 {\bf gpr1}          & stack pointer\\
 {\bf gpr2}          & scratch\\
-{\bf gpr3,gpr4}     & return value, parameter 0 and 1 for integer or pointer\\
-{\bf gpr5-gpr10}    & parameter 2-7 for integer or pointer parameters\\
-{\bf gpr11}         & permanent\\
+{\bf gpr3,gpr4}     & return value, parameter 0 and 1 for integer or pointer, scratch\\
+{\bf gpr5-gpr10}    & parameter 2-7 for integer or pointer parameters, scratch\\
+{\bf gpr11}         & preserve\\
 {\bf gpr12}         & branch target for dynamic code generation\\
-{\bf gpr13-31}      & permanent\\
+{\bf gpr13-31}      & preserve\\
 {\bf fpr0}          & scratch\\
 {\bf fpr1}          & floating point return value, floating point parameter 0 (always double precision)\\
 {\bf fpr2-fpr13}    & floating point parameters 1-12 (always double precision)\\
-{\bf fpr14-fpr31}   & permanent\\
+{\bf fpr14-fpr31}   & preserve\\
 {\bf v0-v1}         & scratch\\
 {\bf v2-v13}        & vector parameters\\
 {\bf v14-v19}       & scratch\\
-{\bf v20-v31}       & permanent\\
-{\bf lr}            & scratch, link-register\\
-{\bf ctr}           & scratch, count-register\\
-{\bf cr0-cr1}       & scratch\\
-{\bf cr2-cr4}       & permanent\\
-{\bf cr5-cr7}       & scratch\\
+{\bf v20-v31}       & preserve\\
+{\bf lr}            & link-register, scratch\\
+{\bf ctr}           & count-register, scratch\\
+{\bf cr0-cr7}       & conditional register fields, each 4-bit wide (cr0-cr1 and cr5-cr7 are scratch)\\
 \end{tabular*}
 \caption{Register usage on Darwin PowerPC 32-Bit}
 \end{table}
@@ -74,10 +72,12 @@
 \paragraph{Parameter passing}
 
 \begin{itemize}
+\item stack grows down
 \item stack parameter order: right-to-left
 \item caller cleans up the stack
 \item the first 8 integer parameters are passed in registers gpr3-gpr10
 \item the first 12 floating point parameters are passed in registers fpr1-fpr13
+\item 64 bit arguments are passed as if they were two 32 bit arguments, without skipping registers for alignment (this means passing half via a register and half via the stack is allowed)
 \item if a float parameter is passed via a register, gpr registers are skipped for subsequent integer parameters (based on the size of
 the float - 1 register for single precision and 2 for double precision floating point values)
 \item the caller pushes subsequent parameters onto the stack
@@ -104,51 +104,53 @@
 \item for types \textgreater\ 64 bits, a secret first parameter with an address to the return value is passed
 \end{itemize}
 
-\pagebreak
 
 \paragraph{Stack layout}
 
-Stack frame is always 16-byte aligned. Stack directly after function prolog:\\
+% verified/amended: TP nov 2019 (see also doc/disas_examples/ppc.darwin.disas)
+Stack frame is always 16-byte aligned. Prolog opens frame with additional, fixed space for a linkage area, to hold a number of values (not all of them are required to be saved, though). Stack directly after function prolog:\\
 
 \begin{figure}[h]
 \begin{tabular}{5|3|1 1}
+                                  & \vdots                        &                                      &                               \\
+\hhline{~=~~}
+register save area                & \hspace{4cm}                  &                                      & \mrrbrace{14}{caller's frame} \\
 \hhline{~-~~}
-                                  & \vdots              &                                      &                               \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}        &                                      & \mrrbrace{13}{caller's frame} \\
+local data                        &                               &                                      &                               \\
 \hhline{~-~~}
-\mrlbrace{6}{parameter area}      & \ldots              & \mrrbrace{3}{stack parameters}       &                               \\
-                                  & \ldots              &                                      &                               \\
-                                  & \ldots              &                                      &                               \\
-                                  & \ldots              & \mrrbrace{3}{spill area (as needed)} &                               \\
-                                  & \ldots              &                                      &                               \\
-                                  & gpr3 or fpr1        &                                      &                               \\
+\mrlbrace{6}{parameter area}      & last arg                      & \mrrbrace{3}{stack parameters}       &                               \\
+                                  & \ldots                        &                                      &                               \\
+                                  & 9th word of arg data          &                                      &                               \\
+                                  & gpr10                         & \mrrbrace{3}{spill area (as needed)} &                               \\
+                                  & \ldots                        &                                      &                               \\
+                                  & gpr3                          &                                      &                               \\
 \hhline{~-~~}
-\mrlbrace{6}{linkage area}        & reserved            &                                      &                               \\
-                                  & reserved            &                                      &                               \\
-                                  & reserved            &                                      &                               \\
-                                  & return address      &                                      &                               \\
-                                  & reserved for callee &                                      &                               \\
-                                  & saved by callee     &                                      &                               \\
+\mrlbrace{6}{linkage area}        & reserved                      &                                      &                               \\
+                                  & reserved                      &                                      &                               \\
+                                  & reserved                      &                                      &                               \\
+                                  & return address (callee saved) &                                      &                               \\
+                                  & condition reg (callee saved)  &                                      &                               \\
+                                  & parent stack frame pointer    &                                      &                               \\
 \hhline{~=~~}
-local data                        &                     &                                      & \mrrbrace{3}{current frame}   \\
+register save area                &                               &                                      & \mrrbrace{4}{current frame}   \\
+\hhline{~-~~}
+local data                        &                               &                                      &                               \\
 \hhline{~-~~}
-parameter area                    &                     &                                      &                               \\
+parameter area                    &                               &                                      &                               \\
 \hhline{~-~~}
-linkage area                      & \vdots              &                                      &                               \\
-\hhline{~-~~}
+linkage area                      & \vdots                        &                                      &                               \\
 \end{tabular}
 \caption{Stack layout on ppc32 Darwin}
 \end{figure}
 
+
+\newpage
+
+
 \subsubsection{System V PPC 32-bit}
 
 \paragraph{Status}
 
-\begin{itemize}
-\item C++ this calls do not work.
-\end{itemize}
-
 \paragraph{Registers and register usage}
 
 \begin{table}[h]
@@ -156,24 +158,24 @@
 Name              & Brief description\\
 \hline
 {\bf r0}          & scratch\\
-{\bf r1}          & stack pointer\\
+{\bf r1}          & stack pointer, preserve\\
 {\bf r2}          & system-reserved\\
-{\bf r3-r4}       & parameter passing and return value\\
-{\bf r5-r10}      & parameter passing\\
+{\bf r3-r4}       & parameter passing and return value, scratch\\
+{\bf r5-r10}      & parameter passing, scratch\\
 {\bf r11-r12}     & scratch\\
-{\bf r13}         & Small data area pointer register\\
-{\bf r14-r30}     & Local variables\\
-{\bf r31}         & Used for local variables or \emph{environment pointer}\\
+{\bf r13}         & small data area pointer register\\
+{\bf r14-r30}     & local variables, preserve\\
+{\bf r31}         & used for local variables or \emph{environment pointer}, preserve\\
 {\bf f0}          & scratch\\
-{\bf f1}          & parameter passing and return value\\
-{\bf f2-f8}       & parameter passing\\
+{\bf f1}          & parameter passing and return value, scratch\\
+{\bf f2-f8}       & parameter passing, scratch\\
 {\bf f9-13}       & scratch\\
-{\bf f14-f31}     & Local variables\\
-{\bf cr0-cr7}     & Conditional register fields, each 4-bit wide (cr0-cr1 and   cr5-cr7 are scratch)\\
-{\bf lr}          & Link register (scratch)\\
-{\bf ctr}         & Count register (scratch) \\
-{\bf xer}         & Fixed-point exception register (scratch)\\
-{\bf fpscr}       & Floating-point Status and Control Register\\
+{\bf f14-f31}     & local variables, preserve\\
+{\bf cr0-cr7}     & conditional register fields, each 4-bit wide (cr0-cr1 and cr5-cr7 are scratch)\\
+{\bf lr}          & link register, scratch\\
+{\bf ctr}         & count register, scratch \\
+{\bf xer}         & fixed-point exception register, scratch\\
+{\bf fpscr}       & floating-point Status and Control Register\\
 % {\bf v0-v1}         & scratch\\
 % {\bf v2-v13}        & vector parameters\\
 % {\bf v14-v19}       & scratch\\
@@ -195,10 +197,11 @@
 \item 8 floating-pointer registers (f1-f8) for float (promoted to double) and double types.
 \item Additional arguments are passed on the stack directly after the back-chain and saved return address (8 bytes structure) on the callers stack frame.
 \item 64-bit integer data types are passed in general-purpose registers as a whole in two
- 32-bit general purpose registers (an odd and an even e.g. r3 and r4), probably skipping an even integer register.
- or passed on the stack. They are never splitted into a register and stack part.
+ 32-bit general purpose registers (an odd and an even e.g. r3 and r4), skipping an even integer register
+ or passed on the stack; they are never splitted into a register and stack part
 \item Ellipse calls set CR bit 6 
 \item integer parameters \textless\ 32 bit are right-justified (meaning occupy high-order bytes) in their 4-byte area, requiring extra-care for big-endian targets
+\item no spill area is used on stack, iterating over varargs requires a specific va\_list implementation
 \end{itemize}
 
 \paragraph{Return values}
@@ -208,36 +211,36 @@
 \item floating-point values are returned using register f1.
 \end{itemize}
 
-\pagebreak
 
 \paragraph{Stack layout}
 
+% verified/amended: TP nov 2019 (see also doc/disas_examples/ppc.sysv.disas)
 Stack frame is always 16-byte aligned. Stack directly after function prolog:\\
 
 \begin{figure}[h]
 \begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots                     &                                &                              \\
+                                  & \vdots                        &                                &                              \\
 \hhline{~=~~}
-local data                        & \hspace{4cm}               &                                & \mrrbrace{6}{caller's frame} \\
+register save area                & \hspace{4cm}                  &                                & \mrrbrace{7}{caller's frame} \\
 \hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots                     & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots                     &                                &                              \\
-                                  & \ldots                     &                                &                              \\
+local data                        &                               &                                &                              \\
 \hhline{~-~~}
-                                  & saved return address (for callee) &                                &                              \\
+\mrlbrace{3}{parameter area}      & last arg                      & \mrrbrace{3}{stack parameters} &                              \\
+                                  & \ldots                        &                                &                              \\
+                                  & first arg passed via stack    &                                &                              \\
 \hhline{~-~~}
-                                  & parent stack frame pointer &                                &                              \\
+                                  & return address (callee saved) &                                &                              \\
+\hhline{~-~~}
+                                  & parent stack frame pointer    &                                &                              \\
 \hhline{~=~~}
-local data                        &                            &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                            &                                &                              \\
+register save area                &                               &                                & \mrrbrace{4}{current frame}  \\
 \hhline{~-~~}
-                                  & \vdots                     &                                &                              \\
+local data                        &                               &                                &                              \\
 \hhline{~-~~}
+parameter area                    &                               &                                &                              \\
+\hhline{~-~~}
+                                  & \vdots                        &                                &                              \\
 \end{tabular}
-\\
-\\
-\\
 \caption{Stack layout on System V ABI for PowerPC 32-bit calling convention}
 \end{figure}
+