Mercurial > pub > dyncall > dyncall
comparison doc/manual/callconvs/callconv_mips.tex @ 104:dbca6763f2be
- complete, working mips o32 callback (using hardware fp); fixes error from last commit, which ignored first 2 float args
* currently tested on little endian, only
* todo update, manual update, cleanups
author | cslag |
---|---|
date | Thu, 09 Jun 2016 15:13:53 +0200 |
parents | 1ce60358fbad |
children | bf8aef292216 |
comparison
equal
deleted
inserted
replaced
103:b15d814ba274 | 104:dbca6763f2be |
---|---|
118 | 118 |
119 \paragraph{Register usage} | 119 \paragraph{Register usage} |
120 | 120 |
121 \begin{table}[h] | 121 \begin{table}[h] |
122 \begin{tabular*}{0.95\textwidth}{lll} | 122 \begin{tabular*}{0.95\textwidth}{lll} |
123 Name & Alias & Brief description\\ | 123 Name & Alias & Brief description\\ |
124 \hline | 124 \hline |
125 {\bf \$0} & {\bf \$zero} & Hardware zero \\ | 125 {\bf \$0} & {\bf \$zero} & hardware zero \\ |
126 {\bf \$1} & {\bf \$at} & Assembler temporary \\ | 126 {\bf \$1} & {\bf \$at} & assembler temporary \\ |
127 {\bf \$2-\$3} & {\bf \$v0-\$v1} & return value, scratch \\ | 127 {\bf \$2-\$3} & {\bf \$v0-\$v1} & return value, scratch \\ |
128 {\bf \$4-\$7} & {\bf \$a0-\$a3} & first four word-arguments, scratch\\ | 128 {\bf \$4-\$7} & {\bf \$a0-\$a3} & first integer arguments, scratch\\ |
129 {\bf \$8-\$15,\$24,\$25} & {\bf \$t0-\$t7,\$t8,\$t9} & temporaries, scratch \\ | 129 {\bf \$8-\$15,\$24,\$25} & {\bf \$t0-\$t7,\$t8,\$t9} & temporaries, scratch \\ |
130 {\bf \$16-\$23} & {\bf \$s0-\$s7} & Preserved \\ | 130 {\bf \$16-\$23} & {\bf \$s0-\$s7} & preserved \\ |
131 {\bf \$26,\$27} & {\bf \$k0,\$k1} & Reserved for kernel \\ | 131 {\bf \$26,\$27} & {\bf \$k0,\$k1} & reserved for kernel \\ |
132 {\bf \$28} & {\bf \$gp} & Global pointer, preserve \\ | 132 {\bf \$28} & {\bf \$gp} & global pointer, preserve \\ |
133 {\bf \$29} & {\bf \$sp} & Stack pointer, preserve \\ | 133 {\bf \$29} & {\bf \$sp} & stack pointer, preserve \\ |
134 {\bf \$30} & {\bf \$fp} & Frame pointer, preserve \\ | 134 {\bf \$30} & {\bf \$fp} & frame pointer, preserve \\ |
135 {\bf \$31} & {\bf \$ra} & Return address \\ | 135 {\bf \$31} & {\bf \$ra} & return address \\ |
136 | 136 {\bf hi, lo} & & multiply/divide special registers \\ |
137 | 137 {\bf \$f0-\$f3} & & float return value, scratch \\ |
138 {\bf \$f4-\$f11,\$f16-\$f19} & & float temporaries, scratch \\ | |
139 {\bf \$f12-\$f15} & & first floating point arguments, scratch \\ | |
140 {\bf \$f20-\$f31} & & preserved \\ | |
138 \end{tabular*} | 141 \end{tabular*} |
139 \caption{Register usage on MIPS O32 calling convention} | 142 \caption{Register usage on MIPS O32 calling convention} |
140 \end{table} | 143 \end{table} |
141 | 144 |
142 \paragraph{Parameter passing} | 145 \paragraph{Parameter passing} |
143 | 146 |
144 \begin{itemize} | 147 \begin{itemize} |
145 \item Stack grows down | 148 \item Stack grows down |
146 \item Stack parameter order: right-to-left | 149 \item Stack parameter order: right-to-left |
147 \item Caller cleans up the stack | 150 \item Caller cleans up the stack |
148 \item The different stack areas (e.g. parameter area, register save area, ...) are always aligned to 8 bytes. | 151 \item The different stack areas (local data, register save area, parameter area) are each aligned to 8 bytes. |
149 \item first four 32bit arguments are passed in registers \$a0-\$a3, respectively | 152 \item generally, first four 32bit arguments are passed in registers \$a0-\$a3, respectively (see below for exceptions if first arg is a float) |
150 \item subsequent parameters are passed vie the stack | 153 \item subsequent parameters are passed vie the stack |
151 \item 64-bit params passed via registers are passed using two registers, starting at an even register number (skipping one odd register if necessary) | 154 \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 |
152 \item 64-bit params passed via the stack are always 8-byte aligned | 155 \item 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 |
153 \item results are returned in \$v0 (32-bit return values), \$v0 and \$v1 (64-bit) | 156 \item if any arguments are passed via float registers, skip \$a0-\$a3 for subsequent arguments as if the values were passed via them |
154 \item note that only s? registers that are modified by the function are required to be preserved on save area | 157 \item note that if the first argument is not a float, but the second, it'll get passed via the \$a? registers |
158 \item results are returned in \$v0 (32-bit int return values), \$f0 (32-bit float), \$v0 and \$v1 (64-bit int), \$f0 and \$f3 (64bit float) | |
155 \end{itemize} | 159 \end{itemize} |
156 | 160 |
157 \paragraph{Stack layout} | 161 \paragraph{Stack layout} |
158 | 162 |
159 Stack directly after function prolog:\\ | 163 Stack directly after function prolog:\\ |