Mercurial > pub > dyncall > dyncall
comparison doc/manual/callconvs/callconv_mips.tex @ 108:bf8aef292216
- mips clarifications in doc
author | cslag |
---|---|
date | Sat, 11 Jun 2016 21:38:46 +0200 |
parents | dbca6763f2be |
children | 9aa75a74614c |
comparison
equal
deleted
inserted
replaced
107:f5453308ff36 | 108:bf8aef292216 |
---|---|
45 | 45 |
46 \paragraph{Register usage} | 46 \paragraph{Register usage} |
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\\ | 55 {\bf \$4-\$11} & {\bf \$a0-\$a7} & Integer arguments\\ |
56 {\bf \$12-\$15,\$24,\$25} & {\bf \$t4-\$t7,\$t8,\$t9} & Integer temporaries \\ | 56 {\bf \$12-\$15,\$24} & {\bf \$t4-\$t7,\$t8} & Integer temporaries \\ |
57 {\bf \$25} & {\bf \$t9} & Integer temporary, hold the address of the called function for all PIC calls (by convention) \\ | 57 {\bf \$25} & {\bf \$t9} & Integer temporary, hold the address of the called function for all 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 \\ | 60 {\bf \$28} & {\bf \$gp} & Global pointer, preserve \\ |
61 {\bf \$29} & {\bf \$sp} & Stack pointer \\ | 61 {\bf \$29} & {\bf \$sp} & Stack pointer, preserve \\ |
62 {\bf \$30} & {\bf \$s8} & Frame pointer \\ | 62 {\bf \$30} & {\bf \$s8} & Frame pointer, preserve \\ |
63 {\bf \$31} & {\bf \$ra} & Return address \\ | 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} & & Float arguments \\ | 67 {\bf \$f12-\$f19} & & 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} |
74 \begin{itemize} | 74 \begin{itemize} |
75 \item Stack grows down | 75 \item Stack grows down |
76 \item Stack parameter order: right-to-left | 76 \item Stack parameter order: right-to-left |
77 \item Caller cleans up the stack | 77 \item Caller cleans up the stack |
78 \item Stack always aligned to 8 bytes. | 78 \item Stack always aligned to 8 bytes. |
79 \item first 8 integers and floats are passed independently in registers using \$a0-\$a7 and \$f12-\$f19, respectively. | 79 \item first 8 integers or floats are passed independently in registers using \$a0-\$a7 and \$f12-\$f19, respectively. |
80 \item if either integer or float registers are consumed up, the stack is used. | 80 \item if either integer or float registers are used up, the stack is used |
81 \item 64-bit floats and integers are passed on two integer registers starting at an even register number, probably skipping one odd register. | 81 \item 64-bit integers or floats are passed on two integer registers starting at an even register number, skipping one odd register. |
82 \item \$a0-\$a7 and \$f12-\$f19 are not required to be preserved. | 82 \item \$a0-\$a7 and \$f12-\$f19 are not required to be preserved. |
83 \item results are returned in \$v0 (32-bit), \$v0 and \$v1 (64-bit), \$f0 (32 bit float) and \$f0 and \$f2 (2 $\times$ 32 bit float e.g. complex). | 83 \item results are returned in \$v0 (32-bit), \$v0 and \$v1 (64-bit), \$f0 or \$f0 and \$f2 (2 $\times$ 32 bit float e.g. complex). |
84 \end{itemize} | 84 \end{itemize} |
85 | 85 |
86 \paragraph{Stack layout} | 86 \paragraph{Stack layout} |
87 | 87 |
88 Stack directly after function prolog:\\ | 88 Stack directly after function prolog:\\ |
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 integer 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} & {\bf \$t0-\$t7,\$t8} & temporaries, scratch \\ |
130 {\bf \$16-\$23} & {\bf \$s0-\$s7} & preserved \\ | 130 {\bf \$25} & {\bf \$t9} & temporary, hold the address of the called function for all PIC calls (by convention) \\ |
131 {\bf \$26,\$27} & {\bf \$k0,\$k1} & reserved for kernel \\ | 131 {\bf \$16-\$23} & {\bf \$s0-\$s7} & preserved \\ |
132 {\bf \$28} & {\bf \$gp} & global pointer, preserve \\ | 132 {\bf \$26,\$27} & {\bf \$k0,\$k1} & reserved for kernel \\ |
133 {\bf \$29} & {\bf \$sp} & stack pointer, preserve \\ | 133 {\bf \$28} & {\bf \$gp} & global pointer, preserve \\ |
134 {\bf \$30} & {\bf \$fp} & frame pointer, preserve \\ | 134 {\bf \$29} & {\bf \$sp} & stack pointer, preserve \\ |
135 {\bf \$31} & {\bf \$ra} & return address \\ | 135 {\bf \$30} & {\bf \$fp} & frame pointer, preserve \\ |
136 {\bf hi, lo} & & multiply/divide special registers \\ | 136 {\bf \$31} & {\bf \$ra} & return address, preserve \\ |
137 {\bf \$f0-\$f3} & & float return value, scratch \\ | 137 {\bf hi, lo} & & multiply/divide special registers \\ |
138 {\bf \$f4-\$f11,\$f16-\$f19} & & float temporaries, scratch \\ | 138 {\bf \$f0-\$f3} & & float return value, scratch \\ |
139 {\bf \$f12-\$f15} & & first floating point arguments, scratch \\ | 139 {\bf \$f4-\$f11,\$f16-\$f19} & & float temporaries, scratch \\ |
140 {\bf \$f20-\$f31} & & preserved \\ | 140 {\bf \$f12-\$f15} & & first floating point arguments, scratch \\ |
141 {\bf \$f20-\$f31} & & preserved \\ | |
141 \end{tabular*} | 142 \end{tabular*} |
142 \caption{Register usage on MIPS O32 calling convention} | 143 \caption{Register usage on MIPS O32 calling convention} |
143 \end{table} | 144 \end{table} |
144 | 145 |
145 \paragraph{Parameter passing} | 146 \paragraph{Parameter passing} |
146 | 147 |
147 \begin{itemize} | 148 \begin{itemize} |
148 \item Stack grows down | 149 \item Stack grows down |
149 \item Stack parameter order: right-to-left | 150 \item Stack parameter order: right-to-left |
150 \item Caller cleans up the stack | 151 \item Caller cleans up the stack |
152 \item Caller is required to always leave a 16-byte spill area for\$a0-\$a3 at the and of {\bf its} frame, to be used and spilled to by the callee, if needed | |
151 \item The different stack areas (local data, register save area, parameter area) are each aligned to 8 bytes. | 153 \item The different stack areas (local data, register save area, parameter area) are each aligned to 8 bytes. |
152 \item generally, first four 32bit arguments are passed in registers \$a0-\$a3, respectively (see below for exceptions if first arg is a float) | 154 \item generally, first four 32bit arguments are passed in registers \$a0-\$a3, respectively (see below for exceptions if first arg is a float) |
153 \item subsequent parameters are passed vie the stack | 155 \item subsequent parameters are passed vie the stack |
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 | 156 \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 |
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 | 157 \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 |