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