From: Bernhard Urban Date: Sun, 17 Oct 2010 21:21:39 +0000 (+0200) Subject: isa_cmp: ppc X-Git-Tag: bootrom_v1~298 X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=calu.git;a=commitdiff_plain;h=78c372230ed9d20d8dbb79b7feb099f5a2acfbf9 isa_cmp: ppc --- diff --git a/1_isacmp/.gitignore b/1_isacmp/.gitignore index 8454fbb..3cd2a71 100644 --- a/1_isacmp/.gitignore +++ b/1_isacmp/.gitignore @@ -9,3 +9,4 @@ *.blg *.lof *.lot +testppc diff --git a/1_isacmp/Makefile b/1_isacmp/Makefile index 64419cb..d0bc767 100644 --- a/1_isacmp/Makefile +++ b/1_isacmp/Makefile @@ -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 $@ $^ diff --git a/1_isacmp/common.sty b/1_isacmp/common.sty index 5c42f01..726344d 100644 --- a/1_isacmp/common.sty +++ b/1_isacmp/common.sty @@ -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 index 0000000..0ba4789 --- /dev/null +++ b/1_isacmp/ppc.s @@ -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 diff --git a/1_isacmp/ppc.tex b/1_isacmp/ppc.tex index 79cd18d..ab27514 100644 --- a/1_isacmp/ppc.tex +++ b/1_isacmp/ppc.tex @@ -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 index 0000000..f1aafbe --- /dev/null +++ b/1_isacmp/testppc.c @@ -0,0 +1,40 @@ +#include + +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; +}