Mercurial > pub > dyncall > dyncall
diff doc/manual/callconvs/callconv_sparc.tex @ 0:3e629dc19168
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:24:28 +0100 |
parents | |
children | 7ca46969e0ad |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/manual/callconvs/callconv_sparc.tex Thu Mar 19 22:24:28 2015 +0100 @@ -0,0 +1,103 @@ +%////////////////////////////////////////////////////////////////////////////// +% +% Copyright (c) 2012 Daniel Adler <dadler@uni-goettingen.de>, +% Tassilo Philipp <tphilipp@potion-studios.com> +% +% Permission to use, copy, modify, and distribute this software for any +% purpose with or without fee is hereby granted, provided that the above +% copyright notice and this permission notice appear in all copies. +% +% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +% +%////////////////////////////////////////////////////////////////////////////// + +\subsection{SPARC Calling Convention} + +\paragraph{Overview} + +The SPARC family of processors is based on the SPARC instruction set architecture, which comes in basically tree revisions, +V7, V8 and V9. The former two are 32-bit whereas the latter refers to the 64-bit SPARC architecture (see next chapter). SPARC is big endian. + +\paragraph{\product{dyncall} support} + +\product{dyncall} fully supports the SPARC 32-bit instruction set (V7 and V8), \product{dyncallback} support is missing, though. + +\subsubsection{SPARC (32-bit) Calling Convention} + +\paragraph{Register usage} + +\begin{itemize} +\item 32 32-bit integer/pointer registers +\item 32 floating point registers (usable as 8 quad precision, 16 double precision or 32 single precision registers) +\item 32 registers are accessible at a time (8 are global ones (g*), whereas the rest forms a register window with 8 input (i*), 8 output (o*) and 8 local (l*) ones) +\item invoking a function shifts the register window, the old output registers become the new input registers (old local and input ones are not accessible anymore) +\end{itemize} + +\begin{table}[h] +\begin{tabular}{lll} +\hline +Name & Alias & Brief description\\ +\hline +{\bf \%g0} & & Read-only, hardwired to 0 \\ +{\bf \%g1-\%g7} & & Global \\ +{\bf \%o0 and \%i0} & & Output and input argument 0, return value \\ +{\bf \%o1-\%o5 and \%i1-\%i5} & & Output and input argument registers \\ +{\bf \%o6 and \%i6} & & Stack and frame pointer \\ +{\bf \%o7 and \%i7} & & Return address (caller writes to o7, callee uses i7) \\ +\end{tabular} +\caption{Register usage on sparc calling convention} +\end{table} + +\paragraph{Parameter passing} +\begin{itemize} +\item Stack parameter order: right-to-left @@@ really? +\item Caller cleans up the stack @@@ really? +\item Stack always aligned to 8 bytes. +\item first 6 integers and floats are passed independently in registers using \%o0-\%o5 +\item for every other argument the stack is used +\item @@@ what about floats, 64bit integers, etc.? +\item results are returned in \%i0, and structs/unions pass a pointer to them as a hidden stack parameter (see below) +\end{itemize} + +\paragraph{Stack layout} + +Stack directly after function prolog:\\ + +\begin{figure}[h] +\begin{tabular}{5|3|1 1} +\hhline{~-~~} + & \vdots & & \\ +\hhline{~=~~} +local data & & & \mrrbrace{10}{caller's frame} \\ +\hhline{~-~~} +padding & & & \\ +\hhline{~-~~} +\mrlbrace{7}{parameter area} & argument x & \mrrbrace{3}{stack parameters} & \\ + & \ldots & & \\ + & argument 6 & & \\ + & input argument 5 spill & \mrrbrace{3}{spill area} & \\ + & \ldots & & \\ + & input argument 0 spill & & \\ + & struct/union return pointer & & \\ +\hhline{~-~~} +register save area (\%i* and \%l*) & & & \\ +\hhline{~=~~} +local data and padding & & & \mrrbrace{3}{current frame} \\ +\hhline{~-~~} +parameter area & & & \\ +\hhline{~-~~} + & \vdots & & \\ +\hhline{~-~~} +\end{tabular} +\\ +\\ +\\ +\caption{Stack layout on sparc calling convention} +\end{figure} +