# Computer Architecture Lab/Winter2006/KammPuffBili/ThreeMicroDiscussion
## SPEAR

16-Bit Load/Store-Architektur mit 32 Integer-Registern und einer dreistufigen Pipeline, die jeweils bis zu 128 kB Code- und Datenspeicher unterstützt. Arithmetische Befehle wie Addition und Subtraktion haben zwei Operanden, Shift/Rotate-Operationen verschieben den Operanden um jeweils 1 Bit. Speicherzugriffe ohne Offset sind mit jedem Register möglich, Speicherzugriffe mit konstantem Offset sind mit den Registern r26-r28 möglich.

### Besonderheiten

* Eine Reihe von Befehlen gibt es auch als konditionales Befehle, die in Abhängigkeit von einem "condition flag" ausgeführt werden. Der Hintergedanke dabei ist, die möglichen Ausführungspfade zu verringern bzw. idealerweise mit einem einzigen auszukommen und so die Ausführungszeit konstant zu halten.
* Jeder Befehl benötigt genau einen Zyklus, was natürlich die Analysierbarkeit in Sachen "worst case execution time" erleichtert.
* Es sind zwei (anstatt wie üblich nur einem) Register für Rücksprungadressen vorgesehen, sowie eines für die Rücksprungadressen von Interrupts.
* Die Register r26 bis r28 unterstützen Speicherzugriffe mit konstantem Offset und sind daher für Stack- bzw. Framepointer prädestiniert.
* Nur 16-Bit Speicherzugriffe werden unterstützt ("char" ist anstatt der üblichen 8 also 16 Bit weit).
* Zur Erweiterung der Funktionalität des Prozessors können Hardware-Module in den Speicher gemappt werden (z.B. zur Implementation von Multiplikation und Division).

### Branches

Für bedingte Sprünge wird zuerst die Bedingung getestet und das condition flag entsprechend gesetzt, und danch der Sprung in Abhängigkeit von diesem Flag (Bedingung wahr oder falsch) ausgeführt. Diese Vorgehensweise hat den Vorteil, weniger Opcodes für bedingte Befehle zu verbrauchen, allerdings werden 32- oder 64-Bit Vergleiche komplizierter (mann benötigt für jedes Register zwei Vergleichs- und zwei Sprungbefehle, anstatt einem Vergleichs- und zwei Sprungbefehlen).

## Alpha 21264/EV6

64-Bit Load/Store-Architektur mit 32 Integer- und 32 Floating-Point-Registern. Die Bezeichnung als "RISC"-Architektur ist etwas irreführend, da eine relativ große Anzahl von Befehlen implementiert sind. Arithmetische Befehle wie Addition und Subtraktion haben drei Operanden, Speicherzugriffe mit konstantem Offset werden mit jedem (Integer-)Register unterstützt. Die Architektur nützt - neben einer 7-stufigen Pipeline - weitere fortgeschrittene Techniken wie die parallele Abarbeitung von bis zu vier Befehlen, Caching und Out-of-Order Execution.

### Besonderheiten

* teilweise sind stark spezialisierte Befehle wie "cttz" (count trailing zeros) teil des Befehlssatzes, die Divisions-Operation (und eine Reihe weiterer Operationen) wird jedoch vom Assembler in entsprechende Befehlssequenzen übersetzt, da der Prozessor die Operation nicht in Hardware implementiert.
* Speicherzugriffe können prinzipiell nur "aligned" i.e. an 64-Bit Grenzen erfolgen; "unaligned" Zugriffe werden - wenn entsprechend deklariert - vom Assembler entsprechend umgesetzt, oder aber - wenn sie eben nicht als solche deklariert wurden - sie führen zu Laufzeitfehlern.
* Die Architektur lesitet sich den "Luxus" eines eigenen Registers für die Konstante Null (r31).

### Branches

Bei bedingten Sprüngen wird die Sprungbedingung in den Sprungbefehl kodiert, was in kompaktem Code und - da keine Flags geschrieben werden müssen - besserer Parallelisierbarkeit resultiert. Andererseits bringt das aber einen in Hardware vergleichsweise komplexen Befehl mit sich bringt. Subtraktion (bei größer/kleiner/gleich-Vergleichen), Auswertung der Flags und Laden des Sprungziels sind hier ein einziger Befehl.

## ATmega 16

Hierbei handelt es sich um eine 8-Bit "RISC"-Architektur mit 32 General-Purpose-Registern. Das Instruction-Set besteht aus 131 Befehlen wovon die meisten in einem Zyklus durchgeführt werden können. In der mir vorliegenden Version kann der CPU mit bis zu 16 MHz getacktet werden. Er besitzt 16K Byte Flashspeicher, 512 Byte EEPROM und 1K Byte SRAM. Arithmentische und Logische Anweisungen haben entweder einen oder zwei Operanden. Klassische Befehle wie "ADD", "SUB", "AND" und dergleichen haben zwei, während "NEG" nur ein Register als Argument annimmt. Die Pipeline ist beim ATmega 16 nur einstufig.

### Besonderheiten

* Alle 32 Register sind direkt mit der ALU verbunden, wodurch eine Anweisung die auf zwei verschiedene Register zugreift, in einem Zyklus ausgeführt werden kann.
* Der Chip besitzt einen eigenen on-board Multiplikator, der die Berechnung in 2 Zyklen durchführen kann.
* Es gibt 6 Register, die als drei von einander getrennte 16-Bit Register angesprochen werden köennen (X,Y,Z). Sie dienen zum indirekten adressieren des Datenspeichers.
* Mehrere Modi um Strom zu sparen. Bei "Power-Down" werden die Register gespeichert und der Oszillator eingefrohren. Bei "Power-Save" läuft der asynchrone Timer weiter. Insgesamt kann der ATmega 16 mit sechs Stromsparmodi aufwarten.
* Konditionale Befehle die in Abhängigkeit von verschiedenen Flags ausgeführt werden (Zero, Carry, Halfcarry, Negative, T, Overflow).

### Branches

Das Instruction-Set des ATmega 16 unterstützt bedingte Sprünge durch eine Vielzahl an Befehlen. Stellvertretend sei hier "BRCC" genannt, der den Sprung durchführt, wenn das Carry-Flage nicht gesetzt ist (Branch if Carry Cleared). Des Weiteren gibt es noch Befehle die auf das Zero-, Carry-, Halfcarry-, Negative-, T- beziehungswiese das Overflowflag Rücksicht nehmen.