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:\\