annotate doc/manual/callconvs/callconv_mips.tex @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children 7ca46969e0ad
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 %
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 % Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 % Tassilo Philipp <tphilipp@potion-studios.com>
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{MIPS 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 MIPS family of processors is based on the MIPS processor architecture.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25 Multiple revisions of the MIPS Instruction set exist, namely MIPS I, MIPS II, MIPS III, MIPS IV, MIPS32 and MIPS64.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26 Today, MIPS32 and MIPS64 for 32-bit and 64-bit respectively.\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27 Several add-on extensions exist for the MIPS family:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 \begin{description}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 \item [MIPS-3D] simple floating-point SIMD instructions dedicated to common 3D tasks.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 \item [MDMX] (MaDMaX) more extensive integer SIMD instruction set using 64 bit floating-point registers.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 \item [MIPS16e] adds compression to the instruction stream to make programs take up less room (allegedly a response to the THUMB instruction set of the ARM architecture).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 \item [MIPS MT] multithreading additions to the system similar to HyperThreading.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 \end{description}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 Unfortunately, there is actually no such thing as "The MIPS Calling Convention". Many possible conventions are used
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 by many different environments such as \emph{32}, \emph{O64}, \emph{N32}, \emph{64} and \emph{EABI}.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 \paragraph{\product{dyncall} support}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 Currently, dyncall supports the EABI calling convention which is used on the Homebrew SDK for the Playstation Portable.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 As documentation for this EABI is unofficial, this port is currently experimental.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 \subsubsection{MIPS EABI 32-bit Calling Convention}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 \paragraph{Register usage}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 \begin{table}[h]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 \begin{tabular}{lll}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 Name & Alias & Brief description\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 \hline
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 {\bf \$0} & {\bf \$zero} & Hardware zero \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 {\bf \$1} & {\bf \$at} & Assembler temporary \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 {\bf \$2-\$3} & {\bf \$v0-\$v1} & Integer results \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 {\bf \$4-\$11} & {\bf \$a0-\$a7} & Integer arguments\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 {\bf \$12-\$15,\$24,\$25} & {\bf \$t4-\$t7,\$t8,\$t9} & Integer temporaries \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 {\bf \$25} & {\bf \$t9} & Integer temporary, hold the address of the called function for all PIC calls (by convention) \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 {\bf \$16-\$23} & {\bf \$s0-\$s7} & Preserved \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 {\bf \$26,\$27} & {\bf \$kt0,\$kt1} & Reserved for kernel \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 {\bf \$28} & {\bf \$gp} & Global pointer \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 {\bf \$29} & {\bf \$sp} & Stack pointer \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 {\bf \$30} & {\bf \$s8} & Frame pointer \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 {\bf \$31} & {\bf \$ra} & Return address \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 {\bf hi, lo} & & Multiply/divide special registers \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 {\bf \$f0,\$f2} & & Float results \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 {\bf \$f1,\$f3,\$f4-\$f11,\$f20-\$f23} & & Float temporaries \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 {\bf \$f12-\$f19} & & Float arguments \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 \end{tabular}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 \caption{Register usage on mips32 eabi calling convention}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 \end{table}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 \paragraph{Parameter passing}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 \begin{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 \item Stack parameter order: right-to-left
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 \item Caller cleans up the stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 \item Stack always aligned to 8 bytes.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 \item first 8 integers and floats are passed independently in registers using \$a0-\$a7 and \$f12-\$f19, respectively.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 \item if either integer or float registers are consumed up, the stack is used.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 \item 64-bit floats and integers are passed on two integer registers starting at an even register number, probably skipping one odd register.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 \item \$a0-\$a7 and \$f12-\$f19 are not required to be preserved.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 \item results are returned in \$v0 (32-bit integer), \$v0 and \$v1 (64-bit integer/float), \$f0 (32 bit float) and \$f0 and \$f2 (2 $\times$ 32 bit float e.g. complex).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 \end{itemize}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 \paragraph{Stack layout}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 Stack directly after function prolog:\\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 \begin{figure}[h]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 \begin{tabular}{5|3|1 1}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 \hhline{~-~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 & \vdots & & \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 \hhline{~=~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 register save area & & & \mrrbrace{5}{caller's frame} \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 \hhline{~-~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 local data & & & \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 \hhline{~-~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 \mrlbrace{3}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 & \ldots & & \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 & \ldots & & \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 \hhline{~=~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 register save area (with return address) & & & \mrrbrace{5}{current frame} \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 \hhline{~-~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 local data & & & \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 \hhline{~-~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 parameter area & & & \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 \hhline{~-~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 & \vdots & & \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 \hhline{~-~~}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 \end{tabular}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 \\
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 \caption{Stack layout on mips32 eabi calling convention}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 \end{figure}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117