changeset 108:bf8aef292216

- mips clarifications in doc
author cslag
date Sat, 11 Jun 2016 21:38:46 +0200
parents f5453308ff36
children 9e677d4c0b6b
files doc/manual/callconvs/callconv_mips.tex
diffstat 1 files changed, 41 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- 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