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