# HG changeset patch # User cslag # Date 1465673926 -7200 # Node ID bf8aef29221692144050073e02db66573c0b6c62 # Parent f5453308ff36d6170658c1b340b9dc356e7dd007 - mips clarifications in doc diff -r f5453308ff36 -r bf8aef292216 doc/manual/callconvs/callconv_mips.tex --- a/doc/manual/callconvs/callconv_mips.tex Sat Jun 11 19:00:25 2016 +0200 +++ b/doc/manual/callconvs/callconv_mips.tex Sat Jun 11 21:38:46 2016 +0200 @@ -47,24 +47,24 @@ \begin{table}[h] \begin{tabular*}{0.95\textwidth}{lll} -Name & Alias & Brief description\\ -\hline -{\bf \$0} & {\bf \$zero} & Hardware zero \\ -{\bf \$1} & {\bf \$at} & Assembler temporary \\ -{\bf \$2-\$3} & {\bf \$v0-\$v1} & Integer results \\ -{\bf \$4-\$11} & {\bf \$a0-\$a7} & Integer arguments\\ -{\bf \$12-\$15,\$24,\$25} & {\bf \$t4-\$t7,\$t8,\$t9} & Integer temporaries \\ -{\bf \$25} & {\bf \$t9} & Integer temporary, hold the address of the called function for all PIC calls (by convention) \\ -{\bf \$16-\$23} & {\bf \$s0-\$s7} & Preserved \\ -{\bf \$26,\$27} & {\bf \$kt0,\$kt1} & Reserved for kernel \\ -{\bf \$28} & {\bf \$gp} & Global pointer \\ -{\bf \$29} & {\bf \$sp} & Stack pointer \\ -{\bf \$30} & {\bf \$s8} & Frame pointer \\ -{\bf \$31} & {\bf \$ra} & Return address \\ -{\bf hi, lo} & & Multiply/divide special registers \\ -{\bf \$f0,\$f2} & & Float results \\ -{\bf \$f1,\$f3,\$f4-\$f11,\$f20-\$f23} & & Float temporaries \\ -{\bf \$f12-\$f19} & & Float arguments \\ +Name & Alias & Brief description\\ +\hline +{\bf \$0} & {\bf \$zero} & Hardware zero \\ +{\bf \$1} & {\bf \$at} & Assembler temporary \\ +{\bf \$2-\$3} & {\bf \$v0-\$v1} & Integer results \\ +{\bf \$4-\$11} & {\bf \$a0-\$a7} & Integer arguments\\ +{\bf \$12-\$15,\$24} & {\bf \$t4-\$t7,\$t8} & Integer temporaries \\ +{\bf \$25} & {\bf \$t9} & Integer temporary, hold the address of the called function for all PIC calls (by convention) \\ +{\bf \$16-\$23} & {\bf \$s0-\$s7} & Preserved \\ +{\bf \$26,\$27} & {\bf \$kt0,\$kt1} & Reserved for kernel \\ +{\bf \$28} & {\bf \$gp} & Global pointer, preserve \\ +{\bf \$29} & {\bf \$sp} & Stack pointer, preserve \\ +{\bf \$30} & {\bf \$s8} & Frame pointer, preserve \\ +{\bf \$31} & {\bf \$ra} & Return address, preserve \\ +{\bf hi, lo} & & Multiply/divide special registers \\ +{\bf \$f0,\$f2} & & Float results \\ +{\bf \$f1,\$f3,\$f4-\$f11,\$f20-\$f23} & & Float temporaries \\ +{\bf \$f12-\$f19} & & Float arguments \\ \end{tabular*} \caption{Register usage on MIPS32 EABI calling convention} \end{table} @@ -76,11 +76,11 @@ \item Stack parameter order: right-to-left \item Caller cleans up the stack \item Stack always aligned to 8 bytes. -\item first 8 integers and floats are passed independently in registers using \$a0-\$a7 and \$f12-\$f19, respectively. -\item if either integer or float registers are consumed up, the stack is used. -\item 64-bit floats and integers are passed on two integer registers starting at an even register number, probably skipping one odd register. +\item first 8 integers or floats are passed independently in registers using \$a0-\$a7 and \$f12-\$f19, respectively. +\item if either integer or float registers are used up, the stack is used +\item 64-bit integers or floats are passed on two integer registers starting at an even register number, skipping one odd register. \item \$a0-\$a7 and \$f12-\$f19 are not required to be preserved. -\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). +\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). \end{itemize} \paragraph{Stack layout} @@ -120,24 +120,25 @@ \begin{table}[h] \begin{tabular*}{0.95\textwidth}{lll} -Name & Alias & Brief description\\ +Name & Alias & Brief description\\ \hline -{\bf \$0} & {\bf \$zero} & hardware zero \\ -{\bf \$1} & {\bf \$at} & assembler temporary \\ -{\bf \$2-\$3} & {\bf \$v0-\$v1} & return value, scratch \\ -{\bf \$4-\$7} & {\bf \$a0-\$a3} & first integer arguments, scratch\\ -{\bf \$8-\$15,\$24,\$25} & {\bf \$t0-\$t7,\$t8,\$t9} & temporaries, scratch \\ -{\bf \$16-\$23} & {\bf \$s0-\$s7} & preserved \\ -{\bf \$26,\$27} & {\bf \$k0,\$k1} & reserved for kernel \\ -{\bf \$28} & {\bf \$gp} & global pointer, preserve \\ -{\bf \$29} & {\bf \$sp} & stack pointer, preserve \\ -{\bf \$30} & {\bf \$fp} & frame pointer, preserve \\ -{\bf \$31} & {\bf \$ra} & return address \\ -{\bf hi, lo} & & multiply/divide special registers \\ -{\bf \$f0-\$f3} & & float return value, scratch \\ -{\bf \$f4-\$f11,\$f16-\$f19} & & float temporaries, scratch \\ -{\bf \$f12-\$f15} & & first floating point arguments, scratch \\ -{\bf \$f20-\$f31} & & preserved \\ +{\bf \$0} & {\bf \$zero} & hardware zero \\ +{\bf \$1} & {\bf \$at} & assembler temporary \\ +{\bf \$2-\$3} & {\bf \$v0-\$v1} & return value, scratch \\ +{\bf \$4-\$7} & {\bf \$a0-\$a3} & first integer arguments, scratch\\ +{\bf \$8-\$15,\$24} & {\bf \$t0-\$t7,\$t8} & temporaries, scratch \\ +{\bf \$25} & {\bf \$t9} & temporary, hold the address of the called function for all PIC calls (by convention) \\ +{\bf \$16-\$23} & {\bf \$s0-\$s7} & preserved \\ +{\bf \$26,\$27} & {\bf \$k0,\$k1} & reserved for kernel \\ +{\bf \$28} & {\bf \$gp} & global pointer, preserve \\ +{\bf \$29} & {\bf \$sp} & stack pointer, preserve \\ +{\bf \$30} & {\bf \$fp} & frame pointer, preserve \\ +{\bf \$31} & {\bf \$ra} & return address, preserve \\ +{\bf hi, lo} & & multiply/divide special registers \\ +{\bf \$f0-\$f3} & & float return value, scratch \\ +{\bf \$f4-\$f11,\$f16-\$f19} & & float temporaries, scratch \\ +{\bf \$f12-\$f15} & & first floating point arguments, scratch \\ +{\bf \$f20-\$f31} & & preserved \\ \end{tabular*} \caption{Register usage on MIPS O32 calling convention} \end{table} @@ -148,6 +149,7 @@ \item Stack grows down \item Stack parameter order: right-to-left \item Caller cleans up the stack +\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 \item The different stack areas (local data, register save area, parameter area) are each aligned to 8 bytes. \item generally, first four 32bit arguments are passed in registers \$a0-\$a3, respectively (see below for exceptions if first arg is a float) \item subsequent parameters are passed vie the stack