annotate doc/manual/callconvs/callconv_sparc64.tex @ 200:e07fb0bbddae

- manual cleanup
author Tassilo Philipp
date Sun, 19 Mar 2017 20:09:59 +0100
parents 53c42b1d9f8b
children dd1d0b0fd896
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 %//////////////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2 %
186
e210193f6cf1 - doc cleanups and correction about support, added bibitems, etc.
Tassilo Philipp
parents: 95
diff changeset
3 % Copyright (c) 2012-2017 Daniel Adler <dadler@uni-goettingen.de>,
e210193f6cf1 - doc cleanups and correction about support, added bibitems, etc.
Tassilo Philipp
parents: 95
diff changeset
4 % Tassilo Philipp <tphilipp@potion-studios.com>
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 % Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 % purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8 % copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 % THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 % WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 % MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 % ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 % WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 % ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 % OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 %//////////////////////////////////////////////////////////////////////////////
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 \subsection{SPARC64 Calling Convention}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 \paragraph{Overview}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 The SPARC family of processors is based on the SPARC instruction set architecture, which comes in basically tree revisions,
193
600bd90afdb7 - sparc manual changes
Tassilo Philipp
parents: 190
diff changeset
25 V7, V8\cite{SPARCV8}\cite{SPARCSysV} and V9\cite{SPARCV9}\cite{SPARCV9SysV}. The former two are 32-bit (see previous chapter) whereas the latter refers to the 64-bit SPARC architecture.
600bd90afdb7 - sparc manual changes
Tassilo Philipp
parents: 190
diff changeset
26 SPARC uses big endian byte order, however, V9 supports also little endian byte order, but for data access only, not instruction access.\\
194
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
27 \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
28 There are two probosals, one from Sun and one from Hal, which disagree on how to handle some aspects of this calling convention.\\
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 \paragraph{\product{dyncall} support}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
190
06ee88ce4962 - doc and comment fixes
Tassilo Philipp
parents: 186
diff changeset
32 \product{dyncall} fully supports the SPARC 64-bit instruction set (V9), for calls and callbacks.
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 \subsubsection{SPARC (64-bit) Calling Convention}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
194
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
36 \begin{itemize}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
37 \item 32 double precision floating point registers (d0,d2,d4,...,d62, usable as 16 quad precision ones q0,q4,q8,...g60, and also first half of them are usable as 32 single precision registers f0-f31)
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
38 \item 32 64-bit integer/pointer registers out of a bigger (vendor/model dependent) number that are accessible at a time (8 are global ones (g*), whereas the remaining 24 form a register window with 8 input (i*), 8 output (o*) and 8 local (l*) ones)
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
39 \item calling a function shifts the register window, the old output registers become the new input registers (old local and input ones are not accessible anymore)
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
40 \item stack and frame pointer are offset by a BIAS of 2047 (see official doc for reasons)
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
41 \end{itemize}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
42
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
43 \begin{table}[h]
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
44 \begin{tabular*}{0.95\textwidth}{lll}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
45 Name & Alias & Brief description\\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
46 \hline
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
47 {\bf \%g0} & \%r0 & Read-only, hardwired to 0 \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
48 {\bf \%g1-\%g7} & \%r1-\%r7 & Global \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
49 {\bf \%o0-\%o3 and \%i0-\%i3} & \%r8-\%r11 and \%r24-\%r27 & Output and input argument registers, return value \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
50 {\bf \%o4,\%o5 and \%i4,\%i5} & \%r12,\%r13 and \%r28,\%r29 & Output and input argument registers \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
51 {\bf \%o6 and \%i6} & \%r14 and \%r30, \%sp and \%fp & Stack and frame pointer (NOTE, value is pointing to stack/frame minus a BIAS of 2047) \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
52 {\bf \%o7 and \%i7} & \%r15 and \%r31 & Return address (caller writes to o7, callee uses i7) \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
53 {\bf \%l0-\%l7} & \%r16-\%r23 & preserve \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
54 {\bf \%d0,\%d2,\%d4,\%d6} & & Floating point arguments, return value \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
55 {\bf \%d8,\%d10,...,\%d30} & & Floating point arguments \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
56 {\bf \%d32,\%d36,...,\%d62} & & scratch (but, according do Hal, \%d16,...,\%d46 are preserved) \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
57 \end{tabular*}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
58 \caption{Register usage on sparc64 calling convention}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
59 \end{table}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
60
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
61 \paragraph{Parameter passing}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
62 \begin{itemize}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
63 \item stack grows down
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
64 \item stack parameter order: right-to-left
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
65 \item caller cleans up the stack
197
53c42b1d9f8b - sparc doc improvements for both, 32 and 64
Tassilo Philipp
parents: 194
diff changeset
66 \item stack frame is always aligned to 16 bytes
194
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
67 \item first 6 integers are passed in registers using \%o0-\%o5
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
68 \item first 8 quad precision floating point args (or 16 double precision, or 32 single precision) are passed in floating point registers (\%q0,\%q4,...,\%q28 or \%d0,\%d2,...,\%d30 or \%f0-\%f32, respectively)
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
69 \item for every other argument the stack is used
197
53c42b1d9f8b - sparc doc improvements for both, 32 and 64
Tassilo Philipp
parents: 194
diff changeset
70 \item single precision floating point args are passed in odd \%f* registers, and are "right aligned" in their 8-byte space on the stack
53c42b1d9f8b - sparc doc improvements for both, 32 and 64
Tassilo Philipp
parents: 194
diff changeset
71 \item for every argument passed, corresponding \%o*, \%f* register or stack space is skipped (e.g. passing a doube as 3rd call argument, \%d4 is used and \%o2 is skipped)
194
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
72 \item all arguments \textless=\ 64 bit are passed as 64 bit values
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
73 \item minimum stack size is 128 bytes, b/c stack pointer must always point at enough space to store all \%i* and \%l* registers, used when running out of register windows
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
74 \item if needed, register spill area (for integer arguments passed via \%o0-\%o5) is adjacent to parameters
197
53c42b1d9f8b - sparc doc improvements for both, 32 and 64
Tassilo Philipp
parents: 194
diff changeset
75 \item results are expected by caller to be returned in \%o0-\%o3 (after reg window restore, meaning callee writes to \%i0-\%i3) for integers, \%d0,\%d2,\%d4,\%d6 for floats
53c42b1d9f8b - sparc doc improvements for both, 32 and 64
Tassilo Philipp
parents: 194
diff changeset
76 \item structs/unions up to 32b, the fields are returned via the respective registers mentioned in the previous bullet point
53c42b1d9f8b - sparc doc improvements for both, 32 and 64
Tassilo Philipp
parents: 194
diff changeset
77 \item for structs/unions \textgreater= 32b, the caller allocates the space and a pointer to it is passed as hidden first parameter to the function called (meaning in \%o0)
194
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
78 \end{itemize}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
79
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
80 \paragraph{Stack layout}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
81
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
82 Stack directly after function prolog:\\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
83
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
84 \begin{figure}[h]
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
85 \begin{tabular}{5|3|1 1}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
86 \hhline{~-~~}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
87 & \vdots & & \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
88 \hhline{~=~~}
197
53c42b1d9f8b - sparc doc improvements for both, 32 and 64
Tassilo Philipp
parents: 194
diff changeset
89 local data (and padding) & \hspace{4cm} & & \mrrbrace{8}{caller's frame} \\
194
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
90 \hhline{~-~~}
200
e07fb0bbddae - manual cleanup
Tassilo Philipp
parents: 197
diff changeset
91 \mrlbrace{6}{parameter area} & argument x & \mrrbrace{3}{stack parameters} & \\
194
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
92 & \ldots & & \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
93 & argument 6 & & \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
94 & input argument 5 spill & \mrrbrace{3}{spill area} & \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
95 & \ldots & & \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
96 & input argument 0 spill & & \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
97 \hhline{~-~~}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
98 register save area (\%i* and \%l*) & & & \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
99 \hhline{~=~~}
197
53c42b1d9f8b - sparc doc improvements for both, 32 and 64
Tassilo Philipp
parents: 194
diff changeset
100 local data (and padding) & & & \mrrbrace{3}{current frame} \\
194
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
101 \hhline{~-~~}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
102 parameter area & & & \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
103 \hhline{~-~~}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
104 & \vdots & & \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
105 \hhline{~-~~}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
106 \end{tabular}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
107 \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
108 \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
109 \\
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
110 \caption{Stack layout on sparc64 calling convention}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
111 \end{figure}
41d6945f5858 - sparc doc improvements (esp. for sparc64)
Tassilo Philipp
parents: 193
diff changeset
112