\documentclass[../thesis.tex]{subfiles}

\begin{document}
\ifSubfilesClassLoaded{
	\pagenumbering{arabic}
}{}

\myappendix{chp:bytecode_instruction_set}{Bytecode instruction set}%
\todo[inline]{formatting}

\begin{tabular}{ll}
	$l$ & label\\
	$w_r$ & return width\\
	$w_a$ & argument width\\
	$fp$ & frame pointer\\
	$sp$ & stack pointer\\
	$pc$ & program counter\\
\end{tabular}

Bytecode is byte encoded, stack has 16-bit cells.
Longs and reals are stored with the MSB first.

\footnotesize
\begin{longtable}{lllll}
	\caption{\normalsize Semantics for the bytecode instructions\label{tbl:instr_task}}
	\endfirsthead%
	\caption{\normalsize Semantics for the bytecode instructions (cont.)}
	\endhead%
	\endfoot%
	\endlastfoot%
	\toprule
	Instr. & Args & Semantics & sp & pc\\
	
	\midrule
	\texttt{return}   & $w_r~w_a$           & $st[fp\shortminus{}w_a\shortminus{}3+i] = st[fp+1]$ & $st[fp\shortminus{}w_a\shortminus{}3+w_r]$ & $st[fp\shortminus{}w_a\shortminus{}1]$\\
				      &                     & {\bf for all} $i\in\{0..w_r\}$\\
				      &                     & $fp = st[fp\shortminus{}w_a\shortminus{}2]$\\
	\texttt{jumpF}    & $l$                 & & $sp\shortminus{}1$ & $\left\{\begin{array}{ll} pc+1 & \textrm{\bf if } st[sp\shortminus{}1]\\l & \textrm{\bf otherwise}\end{array}\right.$\\
	\texttt{jump}     & $l$                 & & $sp\shortminus{}1$ & $l$\\
	\texttt{jumpSR}   & $w_a~l$             & $st[sp\shortminus{}w_a\shortminus{}1]=pc+2$ & & $l$\\
	\texttt{tailCall} & $w_{a_1}~w_{a_2}~l$ & $rotate\:(w_{a_1}+3+w_{a_2},w_{a_2})$         & $fp$             & $jl$\\
					  &                     & $fp = fp-w_{a_1}+w_{a_2}$\\
					  &                     & \multicolumn{3}{l}{{\bf where} $w_{a_1}$ is the width of the current function and $w_{a_2}$ the width of the called function}\\
	\texttt{arg}      & $i$                 & $st[sp] = st[fp-1-i]$ & $sp+1$\\
	\texttt{push}     & $n~b_0\ldots b_n$   & $st[sp+i] = s[i]$                             & $sp+n$           & $pc+2+n$\\
				      &                     & {\bf for all} $i\in\{0..n\}$\\
%	\midrule
	\texttt{pop}      & $n$                 & & $sp-n$           & $pc+2$\\
%	\midrule
	\texttt{rot}      & $d~n$               & $rotate\:(d, n)$                              & $sp$             & $pc+3$\\
%	\midrule
	\texttt{dup}      &                     & $st[sp] = st[sp-1]$                           & $sp+1$           & $pc+1$\\
%	\midrule
	\texttt{pushPtrs} &                     & $st[sp] = sp$                                 & $sp+3$           & $pc+1$\\
					  &                     & $st[sp+1] = fp$\\
	                  &                     & $st[sp+2] = 0$\\
%	\midrule
	\texttt{unOp}     &                     & $st[sp-1] = \diamond{}st[sp-1]$                & $sp$             & $pc+1$\\
					  &                     & \multicolumn{3}{l}{{\bf for all} $\diamond\in\{\neg\}$}\\
%	\midrule
	\texttt{binOp}    &                     & $st[sp-2] = st[sp-2] \mathbin{\oplus} st[sp-1]$         & $sp-1$           & $pc+1$\\
					  &                     & \multicolumn{3}{l}{{\bf for all} $\oplus\in\{+, -, *, /, \wedge, \vee, \equiv, \not\equiv, \leq, \geq, <, >\}$}\\
%	\midrule
	\texttt{mkTask}   & \texttt{Stable\textsubscript{n}} & $st[sp-n-1] = node (stable,$              & $sp-n+1$ & $pc+2$\\
					  &                                  & $\qquad\qquad st[sp-1], \ldots, st[sp-n-1])$\\
	\texttt{mkTask}   & \texttt{Unstable\textsubscript{n}} & $st[sp-n-1] = node (unstable,$          & $sp-n+1$ & $pc+2$\\
					  &                                  & $\qquad\qquad st[sp-1], \ldots, st[sp-n-1])$\\
%	\midrule
%		   & \multicolumn{3}{l}{Unstable\textsubscript{n}} & st[sp-n-1] = node (unstable,          & sp-n+1 & pc+2\\
%	       & \multicolumn{3}{l}{} & \qquad\qquad st[sp-1], \textrm{\ldots}, st[sp-n-1])\\
%	\midrule
%
%	       & \multicolumn{3}{l}{ReadD        } & st[sp-1] \ \ = node (readd, st[sp-1])             &        & pc+2\\
%	\midrule
%	       & \multicolumn{3}{l}{ReadA        } & st[sp-1] \ \ = node (reada, st[sp-1])             &        & pc+2\\
%	\midrule
%	       & \multicolumn{3}{l}{Repeat       } & st[sp-1] \ \ = node (repeat, st[sp-1])              &        & pc+2\\
%	\midrule
%	       & \multicolumn{3}{l}{Delay        } & st[sp-1] \ \ = node (delay, st[sp-1])             &        & pc+2\\
%	\midrule
%
%	       & \multicolumn{3}{l}{WriteD       } & st[sp-2] \ \ = node (writed, st[sp-1], st[sp-2])  & sp-1   & pc+2\\
%	\midrule
%	       & \multicolumn{3}{l}{WriteA       } & st[sp-2] \ \ = node (writea, st[sp-1], st[sp-2])  & sp-1   & pc+2\\
%	\midrule
%	       & \multicolumn{3}{l}{And          } & st[sp-2] \ \ = node (and, st[sp-1], st[sp-2])     & sp-1   & pc+2\\
%	\midrule
%	       & \multicolumn{3}{l}{Or           } & st[sp-2] \ \ = node (or, st[sp-1], st[sp-2])      & sp-1   & pc+2\\
%	\midrule
%
%	       & \multicolumn{3}{l}{SdsSet i     } & st[sp-1] \ \ = node (sdsset,i, st[sp-1])          &        & pc+3\\
%	\midrule
%
%	       & \multicolumn{3}{l}{SdsGet i     } & st[sp]\ \ \ \ \ = node (sdsget, i)                & sp+1   & pc+3\\
%	\midrule
%	       & \multicolumn{3}{l}{DHTTemp i    } & st[sp-1] \ \ = node (dhttemp, i)                  & sp+1   & pc+3\\
%	\midrule
%	       & \multicolumn{3}{l}{DHTHumid i   } & st[sp-1] \ \ = node (dhthumid, i)                 & sp+1   & pc+3\\
%	\midrule
%
%	       & \multicolumn{3}{l}{Step aw jl   } & st[sp-1] \ \ = node (step, aw, jl, st[sp-1])      & sp-1   & pc+5\\
	\bottomrule
\end{longtable}

\input{subfilepostamble}
\end{document}
