Mercurial > pub > dyncall > dyncall
comparison doc/manual/callconvs/callconv_mips32.tex @ 322:a1fcb3e02270
- doc: stack layout fix for mips/o32
author | Tassilo Philipp |
---|---|
date | Sat, 16 Nov 2019 00:12:32 +0100 |
parents | b104c5beec8b |
children | 276eb8c87aa0 |
comparison
equal
deleted
inserted
replaced
321:72b450cc3be8 | 322:a1fcb3e02270 |
---|---|
47 | 47 |
48 \begin{table}[h] | 48 \begin{table}[h] |
49 \begin{tabular*}{0.95\textwidth}{lll} | 49 \begin{tabular*}{0.95\textwidth}{lll} |
50 Name & Alias & Brief description\\ | 50 Name & Alias & Brief description\\ |
51 \hline | 51 \hline |
52 {\bf \$0} & {\bf \$zero} & Hardware zero \\ | 52 {\bf \$0} & {\bf \$zero} & hardware zero \\ |
53 {\bf \$1} & {\bf \$at} & Assembler temporary \\ | 53 {\bf \$1} & {\bf \$at} & assembler temporary \\ |
54 {\bf \$2-\$3} & {\bf \$v0-\$v1} & Integer results \\ | 54 {\bf \$2-\$3} & {\bf \$v0-\$v1} & integer results \\ |
55 {\bf \$4-\$11} & {\bf \$a0-\$a7} & Integer arguments, or double precision float arguments\\ | 55 {\bf \$4-\$11} & {\bf \$a0-\$a7} & integer arguments, or double precision float arguments\\ |
56 {\bf \$12-\$15,\$24} & {\bf \$t4-\$t7,\$t8} & Integer temporaries \\ | 56 {\bf \$12-\$15,\$24} & {\bf \$t4-\$t7,\$t8} & integer temporaries \\ |
57 {\bf \$25} & {\bf \$t9} & Integer temporary, holds address of called function for PIC calls (by convention) \\ | 57 {\bf \$25} & {\bf \$t9} & integer temporary, holds address of called function for PIC calls (by convention) \\ |
58 {\bf \$16-\$23} & {\bf \$s0-\$s7} & Preserved \\ | 58 {\bf \$16-\$23} & {\bf \$s0-\$s7} & preserved \\ |
59 {\bf \$26,\$27} & {\bf \$kt0,\$kt1} & Reserved for kernel \\ | 59 {\bf \$26,\$27} & {\bf \$kt0,\$kt1} & reserved for kernel \\ |
60 {\bf \$28} & {\bf \$gp} & Global pointer, preserve \\ | 60 {\bf \$28} & {\bf \$gp} & global pointer, preserve \\ |
61 {\bf \$29} & {\bf \$sp} & Stack pointer, preserve \\ | 61 {\bf \$29} & {\bf \$sp} & stack pointer, preserve \\ |
62 {\bf \$30} & {\bf \$s8} & Frame pointer, preserve \\ | 62 {\bf \$30} & {\bf \$s8} & frame pointer, preserve \\ |
63 {\bf \$31} & {\bf \$ra} & Return address, preserve \\ | 63 {\bf \$31} & {\bf \$ra} & return address, preserve \\ |
64 {\bf hi, lo} & & Multiply/divide special registers \\ | 64 {\bf hi, lo} & & multiply/divide special registers \\ |
65 {\bf \$f0,\$f2} & & Float results \\ | 65 {\bf \$f0,\$f2} & & float results \\ |
66 {\bf \$f1,\$f3,\$f4-\$f11,\$f20-\$f23} & & Float temporaries \\ | 66 {\bf \$f1,\$f3,\$f4-\$f11,\$f20-\$f23} & & float temporaries \\ |
67 {\bf \$f12-\$f19} & & Single precision float arguments \\ | 67 {\bf \$f12-\$f19} & & single precision float arguments \\ |
68 \end{tabular*} | 68 \end{tabular*} |
69 \caption{Register usage on MIPS32 EABI calling convention} | 69 \caption{Register usage on MIPS32 EABI calling convention} |
70 \end{table} | 70 \end{table} |
71 | 71 |
72 \paragraph{Parameter passing} | 72 \paragraph{Parameter passing} |
156 \item subsequent parameters are passed vie the stack | 156 \item subsequent parameters are passed vie the stack |
157 \item 64-bit params passed via registers are passed using either two registers (starting at an even register number, skipping an odd one if necessary), or via the stack using an 8-byte alignment | 157 \item 64-bit params passed via registers are passed using either two registers (starting at an even register number, skipping an odd one if necessary), or via the stack using an 8-byte alignment |
158 \item only on hard-float targets: if the very first call argument is a float, up to 2 floats or doubles can be passed via \$f12 and \$f14, respectively, for first and second argument | 158 \item only on hard-float targets: if the very first call argument is a float, up to 2 floats or doubles can be passed via \$f12 and \$f14, respectively, for first and second argument |
159 \item only on hard-float targets: if any arguments are passed via float registers, skip \$a0-\$a3 for subsequent arguments as if the values were passed via them | 159 \item only on hard-float targets: if any arguments are passed via float registers, skip \$a0-\$a3 for subsequent arguments as if the values were passed via them |
160 \item only on hard-float targets: note that if the first argument is not a float, but the second, it'll get passed via the \$a? registers | 160 \item only on hard-float targets: note that if the first argument is not a float, but the second, it'll get passed via the \$a? registers |
161 \item results are returned in \$v0 and \$v1, with \$v0 for all values < 64bit (only integer on hard-float targets) | 161 \item results are returned in \$v0 and \$v1, with \$v0 for all values \textless\ 64bit (only integer on hard-float targets) |
162 \item only on hard-float targets: floating point results are returned in \$f0 (32-bit float), or \$f0 and \$f3 (64bit float) | 162 \item only on hard-float targets: floating point results are returned in \$f0 (32-bit float), or \$f0 and \$f3 (64bit float) |
163 \item single precision float parameters (32 bit) are right-justified in their 8-byte slot on the stack on big endian targets, as they aren't promoted @@@ | 163 \item single precision float parameters (32 bit) are right-justified in their 8-byte slot on the stack on big endian targets, as they aren't promoted @@@ |
164 \end{itemize} | 164 \end{itemize} |
165 | 165 |
166 \paragraph{Stack layout} | 166 \paragraph{Stack layout} |
168 Stack directly after function prolog:\\ | 168 Stack directly after function prolog:\\ |
169 | 169 |
170 \begin{figure}[h] | 170 \begin{figure}[h] |
171 \begin{tabular}{5|3|1 1} | 171 \begin{tabular}{5|3|1 1} |
172 \hhline{~-~~} | 172 \hhline{~-~~} |
173 & \vdots & & \\ | 173 & \vdots & & \\ |
174 \hhline{~=~~} | 174 \hhline{~=~~} |
175 local data & \hspace{4cm} & & \mrrbrace{12}{caller's frame} \\ | 175 register save area (and padding) & \hspace{4cm} & & \\ |
176 \hhline{~-~~} | 176 \hhline{~-~~} |
177 register save area & return address & & \\ | 177 local data (and padding) & & & \mrrbrace{10}{caller's frame} \\ |
178 & s7 & & \\ | 178 \hhline{~-~~} |
179 & \vdots & & \\ | 179 \mrlbrace{8}{parameter area} & padding (if needed) & & \\ |
180 & s0 & & \\ | 180 & \ldots & \mrrbrace{3}{stack parameters} & \\ |
181 \hhline{~-~~} | 181 & \ldots & & \\ |
182 \mrlbrace{7}{parameter area} & \ldots & \mrrbrace{3}{stack parameters} & \\ | 182 & \ldots & & \\ |
183 & \ldots & & \\ | 183 & \$a3 & \mrrbrace{4}{spill area} & \\ |
184 & \ldots & & \\ | 184 & \$a2 & & \\ |
185 & a3 & \mrrbrace{4}{spill area} & \\ | 185 & \$a1 & & \\ |
186 & a2 & & \\ | 186 & \$a0 & & \\ |
187 & a1 & & \\ | 187 \hhline{~-~~} |
188 & a0 & & \\ | 188 register save area (with return address) & & & \\ |
189 \hhline{~=~~} | 189 \hhline{~=~~} |
190 local data & & & \mrrbrace{5}{current frame} \\ | 190 local data & & & \mrrbrace{5}{current frame} \\ |
191 \hhline{~-~~} | 191 \hhline{~-~~} |
192 register save area (with return address) & & & \\ | 192 parameter area & & & \\ |
193 \hhline{~-~~} | 193 & \vdots & & \\ |
194 parameter area & & & \\ | |
195 & \vdots & & \\ | |
196 \hhline{~-~~} | 194 \hhline{~-~~} |
197 \end{tabular} | 195 \end{tabular} |
198 \caption{Stack layout on MIPS O32 calling convention} | 196 \caption{Stack layout on MIPS O32 calling convention} |
199 \end{figure} | 197 \end{figure} |
200 | 198 |