\section{PowerPC}
% Does it describe a CISC or RISC architecture?
Die PowerPC Architektur wurde 1991 durch ein Konsortium aus Apple, IBM und
Motorola spezifiziert. PowerPC steht dabei f\"ur \textit{\textbf{P}erformance
\textbf{o}ptimization \textbf{w}ith \textbf{e}nhanced \textbf{R}ISC
\textbf{P}erformance \textbf{C}hip} und ist, wie der Name schon sagt, eine RISC
% Does the ISA describe an accumulator, a register, or a stack machine?
und eine Load-Store Architektur. Je nach Bedarf kann eine konkrete
Implementierung 32- oder 64-Bit sein; hier wollen wir nur auf 32-Bit eingehen.


% Where are processors that implement the ISA deployed? In embedded systems
% (micro- controllers, communication, multimedia), in servers, in desktop
% computers?
\subsection{Einsatzgebiete und Ziele}
PowerPC wurde mit dem Ziel entwickelt m\"oglichst skalierbar und flexibel zu
sein, da die tats\"achlichen Anwendungsgebiete recht unterschiedlich sind.

Man findet diese Architektur daher in verschiedenen Bereichen:
\begin{description}
\item[Desktop] Apple verwendete PowerPC, aber mittlerweile von \texttt{x86}
verdr\"angt
\item[Embedded] Routern von Cisco, teilweise auf FPGAs von Xilinx und Altera zu
finden
\item[Multimedia] Prominentes Beispiel: d-box 2
\item[Spielekonsolen] GameCube/Wii, Xbox 360 oder PS3\footnote{obwohl die Cell
Architektur weit mehr ist}
\item[Server] Vertreten durch beispielsweise POWER7 oder BlueGene
\end{description}

% What are the goals of the architecture? Performance, die area, energy
% efficiency, code size, . . . ?

% How are these goals reflected in the ISA?


Die PowerPC Architektur ist also recht vielf\"altig und es gibt daher nicht
\textit{das} Einsatzgebiet. Im Speziellen gibt es verschiedene \textit{Books}
die unterschiedliche Bereiche abdecken und je nach den Bed\"urfnissen des CPU
Herstellers implementiert werden k\"onnen.
Darunter fallen verschiedene Bereiche wie Floating Point, Signal Processing oder
Vector Operationen. Weiters gibt eine sogenannte Basiskategorie die von allen
Implementierung umgesetzt werden muss.

\subsection{Beschreibung}
Bei den meisten Befehle der ISA handelt es sich um Register-zu-Register
Operationen im Drei-Register Format. Jede Instruktion ist vier Byte gross.
Durch Load bzw. Store Operationen besteht wie in jeder Load/Store-Architektur
die M\"oglichkeit am Speicher zu operieren -- die Adressierungsarten sind
hierbei \"ausserst eingeschr\"ankt: Zum Beispiel l\"adt die Instruktion
\mbox{\texttt{lwz r3,4(r1)}} den Inhalt an der Speicherstelle \texttt{r1+4} in
das Register \texttt{r3}. Weiters kann man die Basisadresse nach der
Speicheroperationen noch updaten, zum Beispiel: \texttt{stwu r3,4(r1)} speichert
den Inhalt von \texttt{r3} an die Speicherstelle \texttt{r1+4} und setzt weiters
\texttt{r1 := r1 + 4}.

Typische Register plus Erkl\"arung die in einer PowerPC Implementierung
vorhanden sind, findet man in Tabelle \ref{tab:ppcreg}.
\begin{table}[ht!]
	\begin{tabular}{lp{3cm}p{9cm}}
	\textbf{Register} & \textbf{Beschreibung} & \textbf{Kommentar}\\
	\hline
	\texttt{r0-r31} & General Purpose Register & 32 32-Bit Register\\
	\texttt{cr0-cr7} & Condition \mbox{Register} Field & PowerPC besitzt acht
	CRs. Bei einer Instruktion die ein Ergebnis in ein CR ablegt, kann man ein
	gew\"unschtes CR angeben. Vielen Branchbefehlen kann man ebenfalls ein CR
	\"ubergeben.\\
	\texttt{lr} & Link Register & Bei Calls wird die Returnadresse in LR
	hinterlegt. Bei bestimmten Branchbefehlen kann man angeben ob zu LR
	gesprungen werden soll (das kann auch mit einem CR verkn\"upft werden).\\
	\texttt{ctr} & Counter \mbox{Register} & Mit CTR k\"onnen viele Schleifen
	realisiert werden; es gibt spezielle Branchbefehle die am CTR operieren und
	z.B. bei ungleich Null einen Sprung durchf\"uhren. Dadurch k\"onnen
	Spr\"unge sehr gut vorausgesagt werden.\\
	\end{tabular}
\centering
\caption{Register in der PowerPC Architektur}
\label{tab:ppcreg}
\end{table}
% Are latencies handled by the hardware or are they visible at the ISA level?
% For example, branch delay slots expose the latencies of branches at the ISA
% level.

Latenzen sind auf ISA Niveau nicht sichtbar, man kann dem Prozessor aber
Voraussagen mitteilen. Zum Beispiel, ist bei der gegebenen Funktion
\texttt{sum()} die L\"ange auf Null zu pr\"ufen. Da im allgemeinen Fall ein Wert
ungleich Null erwartet wird, kann dem Sprung eine Voraussage mitteilen, wobei
\texttt{-} f\"ur Sprung wird nicht ausgef\"uhrt und \texttt{+} f\"ur das
Gegenteil steht. In manchen F\"allen, wie z.B. Branchoperationen auf das CTR
machen solche Voraussagen nur wenig Sinn, da die Hardware den Sprung ohnehin
sehr fr\"uh berechnen kann.

% Are conditional branches (compute condition and jump) performed in a single
% step, or are testing and branching unbundled?
Weiters k\"onnen Conditional Branches je nach Inhalt eines CR ausgef\"uhrt
werden. Wie bei vielen anderen ISAs k\"onnen CRs mit Befehlen wie \texttt{cmp}
gesetzt werden, aber auch mit dem sogenannten \textit{dot suffix}, der bei
vielen Befehlen wie z.B. \texttt{add}, optional vorhanden ist. Dieser verursacht
implizit ein Update auf ein CR (meistens CR0).

\subsection{Perlen und W\"unsche}
% Which features of the ISA do you like, which features would you change?
\begin{itemize}
\item \textbf{Gute Branchpreditcion}: Durch die schon genannten Feature wie LR und
Counter Register sind Spr\"unge fr\"uh in der Pipeline erkennbar.
\item \textbf{\texttt{rlwinm}}: \textit{Rotate Left Word Immediate then AND with
Mask}. Ein sehr m\"achter und in verschiedensten Variante oft verwendeter
Befehl. Um die Funktionsweise zu demonstrieren: Der Aufruft \mbox{\texttt{rlwinm
rA,rS,SH,MB,ME}}, wobei \mbox{$0 \le \text{SH,MB,ME} \le 31$} gilt, nimmt den
Inhalt aus \texttt{rS} und rotiert diesen um \texttt{SH} nach links. Danach wird
auf das Ergebnis mit einer Maske verundet. Die angesprochene Maske ist 32-Bit
gross und von der Stelle MB bis ME mit 1er und ansonsten 0er belegt. Sollte
% TODO: gutes deutsches Wort?
$\text{MB} > \text{ME}$ sein, so wird ``gewrappt''. Das Ergebnis wird in
\texttt{rD} gespeichert.
\item
\textbf{\texttt{cntlzw}}: \textit{Count Leading Zeros Word}
\item \dots{}
\end{itemize}
% TODO wenn mir noch was einfaellt
W\"unsche: Keine.

\subsection{Listing}
\lstinputlisting[caption=PowerPC Code]{ppc.s}
In der Schleife werden also drei Befehle ausgef\"uhrt, wobei \texttt{lwzu} zwei
Taktzyklen ben\"otigt und \texttt{add} einen Zylus braucht. \texttt{bdnz}
braucht im allgemeinen Fall \textit{keinen} Zyklus, da die Hardware den Sprung
schon sehr fr\"uh in der Pipeline berechnen kann. Die Codegr\"o\ss{}e der
Schleife betr\"agt 12 Byte, da jede Instruktion 4 Byte gross ist.

