isa_cmp: ppc
authorBernhard Urban <lewurm@gmail.com>
Sun, 17 Oct 2010 21:21:39 +0000 (23:21 +0200)
committerBernhard Urban <lewurm@gmail.com>
Sun, 17 Oct 2010 21:21:39 +0000 (23:21 +0200)
1_isacmp/.gitignore
1_isacmp/Makefile
1_isacmp/common.sty
1_isacmp/ppc.s [new file with mode: 0644]
1_isacmp/ppc.tex
1_isacmp/testppc.c [new file with mode: 0644]

index 8454fbb051f65fe21d1bd7f2bd6ece80a04d0ece..3cd2a71d93fe8e9b3c32118e7add276d5c3acbf8 100644 (file)
@@ -9,3 +9,4 @@
 *.blg
 *.lof
 *.lot
+testppc
index 64419cb203688c41b4b692cabf38923f3fb194be..d0bc767c806c59b3d690a571c8666e79945ca3c2 100644 (file)
@@ -1,6 +1,6 @@
 SHELL := bash
 
-FILES = isa_cmp.tex 8051.tex arm.tex avr.tex common.sty Makefile ppc.tex spear2.tex
+FILES = isa_cmp.tex 8051.tex arm.tex avr.tex common.sty Makefile ppc.tex ppc.s spear2.tex
 TARGET = isa_cmp.pdf
 
 PDFGEN = pdflatex --jobname=$(basename $@) $<
@@ -16,4 +16,9 @@ $(TARGET): $(FILES)
 .PHONY: clean html
 
 clean:
-       rm -fr *.aux *.log *.dvi *.pdf *.toc *.out
+       rm -fr *.aux *.log *.dvi *.pdf *.toc *.out *.o testpcc
+
+CC := gcc
+#ppc environment only...
+testppc: ppc.o testppc.o
+       $(CC) -o $@ $^
index 5c42f017e20fd3ddc35cd38001da59654a7bda5f..726344dccaa2ee9dfd0bddda009ebf6cce192db0 100644 (file)
@@ -22,3 +22,7 @@
                \addauthor{Bernhard Urban}{0725771}{lewurm@gmail.com}
        }
 }
+
+\lstset{
+       tabsize=4
+}
diff --git a/1_isacmp/ppc.s b/1_isacmp/ppc.s
new file mode 100644 (file)
index 0000000..0ba4789
--- /dev/null
@@ -0,0 +1,20 @@
+       .text
+       .align 2
+       .globl _sum
+       ; r3 = len
+       ; r4 = addr of arr
+_sum:
+       mr. r0,r3     ; move register: r0 := r3; where '.' enables
+                                 ; a CR0 update
+       blelr- 0      ; branch to LR if "less than or equal" in CR0
+                                 ; is set, where '-' predicts the branch will
+                                 ; not be taken
+       mtctr r0      ; move r0 into CTR
+       li r3,0       ; load immediate: r3 := 0
+       addi r4,r4,-4 ; add immediate: r4 := r4 + (-4)
+.loop:
+       lwzu r0,4(r4) ; load word with update: r0 := mem[r4 + 4];
+                                 ;                        r4 := r4 + 4
+       add r3,r3,r0  ; add to sum: r3 := r3 + r0
+       bdnz .loop    ; decrement CTR and branch to loop if not zero
+       blr           ; branch to LR
index 79cd18dad4a791305277d0155bbb2c7c1df5c300..ab2751433ff41500f30094ce955ad6d504a14518 100644 (file)
@@ -1 +1,130 @@
 \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.
+
diff --git a/1_isacmp/testppc.c b/1_isacmp/testppc.c
new file mode 100644 (file)
index 0000000..f1aafbe
--- /dev/null
@@ -0,0 +1,40 @@
+#include <stdio.h>
+
+int refsum(int len, int arr[])
+{
+       int i;
+       int sum = 0;
+       for (i = 0; i < len; i++) {
+               sum += arr[i];
+       }
+       return sum;
+}
+
+int sum(int len, int arr[]);
+
+int main(void)
+{
+#define LENGTH(x) sizeof(x)/ sizeof(x[0])
+       int a[400] = {0};
+       int alen = LENGTH(a);
+       int b[5] = {5,4,3,2,1};
+       int blen = LENGTH(b);
+
+       int i = alen;
+       while(i--)
+               a[i] = i * b[i%blen];
+
+#define TESTCASE(x,xlen,fkt) \
+       printf("%s @ %4s (%-6s):\t%9d\n", #x, #xlen, #fkt, fkt(xlen,x));
+
+       TESTCASE(a, alen, refsum);
+       TESTCASE(a, alen, sum);
+
+       TESTCASE(b, blen, refsum);
+       TESTCASE(b, blen, sum);
+
+       TESTCASE(b, 0, refsum);
+       TESTCASE(b, 0, sum);
+
+       return 0;
+}