% vim: spelllang=nl:
\documentclass{beamer}

\usepackage[dutch]{babel}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{pgfplots}

\title{Codegeneratie voor de Thumb-2 instructieset}
\author[Camil Staps]{
	Camil Staps\\[1em]\small{
		\emph{Begeleiders:}\\
		prof. dr. dr.h.c. ir. M.J. Plasmeijer\\
		drs. J.H.G. van Groningen}}
\date{Dinsdag 24 januari 2017}

\begin{document}

\maketitle

\section{Inleiding}

\begin{frame}{ARM en Thumb}
	\begin{itemize}
		\item Veel gebruikt in embedded systems
		\item Drie instructiesets:
			\begin{itemize}
				\item ARM (32-bit)
				\item Thumb (16-bit)
				\item Thumb-2 (combinatie)
			\end{itemize}
		\item Meeste processoren ondersteunen alledrie
		\item Voordelen van Thumb-2:
			\begin{itemize}
				\item Kleinere code dan ARM
				\item Simpelere systemen dan ARM
				\item Sneller dan Thumb
			\end{itemize}
		\item Interessante eigenschappen voor codegeneratie:
			\begin{itemize}
				\item Wat te doen met instructies die niet bestaan in Thumb-2?
				\item Hoe kunnen we het aantal 16-bit instructies maximaliseren?
			\end{itemize}
	\end{itemize}
\end{frame}

\begin{frame}{Clean}
	\begin{minipage}{.65\linewidth}
		\begin{itemize}
			\item Pure functionele luie programmeertaal
			\item Compilatie gaat in meerdere stappen
			\item Codegenerator voor ARM bestond al
			\item \emph{Case study}: aanpassen voor Thumb-2
		\end{itemize}
	\end{minipage}%
	\hfill
	\begin{minipage}{.3\linewidth}
		\centering
		\footnotesize
		\begin{tikzpicture}[every node/.style={rectangle,draw},every path/.style={draw},->]
			\node (clean) {Clean};
			\node[below of=clean] (core) {Core Clean};
			\node[below of=core] (abc) {ABC-code};
			\node[below of=abc] (abstr) {Abstracte Von-Neumann};
			\node[below of=abstr] (target) {Target machine};
			\path (clean) -- (core) -- (abc) -- (abstr) -- (target);
		\end{tikzpicture}
	\end{minipage}
\end{frame}

\section{Problemen oplossen}

\begin{frame}{Problemen oplossen}
	\begin{itemize}
		\item Program counter opslaan voor functieaanroepen
		\item Informatie in de laagste twee bits
		\item Kleinere constanten (memory load instructies)
	\end{itemize}
\end{frame}

\section{Registerallocatie}

\begin{frame}{Registerallocatie --- inleiding}
	\begin{itemize}
		\item ARM heeft 16 registers; Thumb kan alleen bij de laagste 8
		\item Hogere registers worden benaderd met 32-bit instructies in Thumb-2
		\item Zet veelgebruikte registers in de laagste helft
	\end{itemize}
\end{frame}

\begin{frame}{Registerallocatie --- data}
	\begin{itemize}
		\item Registergebruik in de Clean compiler:
	\end{itemize}

	\begin{center}
	\begin{tikzpicture}
		\scriptsize
		\begin{axis}
			[ xbar
			, bar width=.5em
			, xmin=0
			, height=0.6\textheight
			, symbolic y coords={Scratch 0,A-stack pointer,A-stack 0,Heap pointer,A-stack 1,B-stack 0,A-stack 2,B-stack pointer,B-stack 1,Scratch 1,B-stack 2,B-stack 3,B-stack 4,Heap counter,A-stack 3}
			, ytick=data
			, scaled x ticks=real:1
			, xtick scale label code/.code={}
			, axis lines*=left
			, compat={1.3}
			]
			\addplot coordinates {
				(378618,Scratch 0)
				(270274,A-stack pointer)
				(218018,A-stack 0)
				(166284,Heap pointer)
				(152821,A-stack 1)
				(110390,B-stack 0)
				(107481,A-stack 2)
				(102640,B-stack pointer)
				( 64496,B-stack 1)
				( 55526,Scratch 1)
				( 41092,B-stack 2)
				( 25924,B-stack 3)
				( 15699,B-stack 4)
				( 14930,Heap counter)
				(  9413,A-stack 3)
			};
			\draw ($({axis cs:85000,Scratch 0})-(0,2em)$) -- ($({axis cs:85000,A-stack 3})+(0,2em)$);
		\end{axis}
	\end{tikzpicture}
\end{center}
\end{frame}

\begin{frame}{Registerallocatie --- de foreign function interface}
	\begin{itemize}
		\item ARM, Inc. beschrijft hoe functieaanroepen plaatsvinden
		\item We moeten hieraan voldoen om met C te kunnen linken
		\item Laagste vier registers zijn functieargumenten
		\item Meeste functieargumenten komen van de B-stack
		\item Vier elementen van de B-stack in de laagste acht registers is te veel
		\item Trade-off: programmagrootte vs. effici\"ente foreign function interface
		\item Registerallocatie voor ARM optimaliseert de FFI
	\end{itemize}
\end{frame}

\begin{frame}{Registerallocatie --- resultaten}
	\begin{center}
		\begin{tikzpicture}
			\begin{axis}
				[ xbar
				, width=.7\textwidth
				, height=.5\textheight
				, xmin=0, xmax=6000000
				, xlabel={Bytes}
				, ytick=\empty
				, reverse stacked plots
				, ymin=-1, ymax=1
				, axis lines*=left
				, nodes near coords, nodes near coords align=west
				, reverse legend
				, every axis plot/.append style={point meta=explicit symbolic}
				, legend style={at={(0.5,-0.5)},anchor=north,legend columns=-1}
				]
				\addplot coordinates { (3827868,0) [81.6\%] };
				\addplot coordinates { (4385964,0) [93.5\%] };
				\addplot coordinates { (4692628,0) [100\%] };
				\legend{Thumb (programmagrootte), Thumb (FFI), ARM}
			\end{axis}
		\end{tikzpicture}
	\end{center}
\end{frame}

\section{Resultaten}

\begin{frame}{Results}
	\begin{itemize}
		\item Benchmarks met Clean's \emph{small examples}
		\item Winst op programmagrootte: $\overline{x}=17.3\%, \sigma=6.3\text{pp.}$\\
			Zonder kleine programma's: $\overline{x}=21.0\%, \sigma=2.6\text{pp.}$
		\item Verlies op snelheid: $\overline{x}=4.8\%, \sigma=3.1\text{pp.}$\\
			Zonder kleine programma's: $\overline{x}=3.7\%, \sigma=2.04\text{pp.}$
		\item Functieaanroepen zijn duur,
			dus Thumb-2 geeft slechte resultaten voor programma's als Fibonacci
	\end{itemize}
\end{frame}

\begin{frame}{Programma's en instructiesets matchen?}
	\begin{center}
		\begin{tikzpicture}
			\begin{axis}
				[ width=.8\textwidth
				, xlabel={Winst programmagrootte (\%)}
				, ylabel={Verlies snelheid (\%)}
				, mark options={scale=2}
				, scatter/classes={%
					a={mark=x,draw=red},
					b={mark=+,draw=black}}
				]
				\addplot[scatter,only marks,scatter src=explicit symbolic]
					table[meta=label,row sep=crcr] {
						x     y    label\\
						12.8  11.9 a\\
						18.6  3.6  b\\
						9.8   5.1  a\\
						18.9  5.9  b\\
						18.9  3.7  b\\
						20.1  5.4  a\\
						22.9  0.9  a\\
						0.0   2.6  a\\
						20.0  5.2  b\\
						22.0  0.0  b\\
						12.1  8.0  a\\
					};
			\end{axis}
		\end{tikzpicture}
	\end{center}
\end{frame}

\section{Vooruit denken}

\begin{frame}{Vooruit denken}
	\begin{itemize}
		\item Branchoptimalisatie (tot 2.2pp. winst programmagrootte)
		\item Optimaliseer functieaanroepen voor tot $\approx4$pp. winst programmagrootte
		\item Thumb-2-\emph{only} instructies voor snelheidswinst
	\end{itemize}

	Uiteindelijke winst programmagrootte (schatting): $\approx$25\%

	\begin{itemize}
		\item Copying collector moet nog wat bijgeschaafd worden
		\item Andere garbage collectors zijn nog niet bekeken
		\item Foreign function interface moet verder getest worden
	\end{itemize}
\end{frame}

\end{document}
