| Inhaltsverzeichnis
|  | Übersicht Kapitel 2
2.3 Unterbrechungsbehandlung |  | 2.5 Das Adreßwerk

## 2.4 Das Operationswerk

- 2.4.1 Integer-Rechenwerk
- 2.4.2 Der Barrel Shifter
- 2.4.3 Multiplizier-Akkumulier-Rechenwerk
- 2.4.4 Gleitpunkt-Rechenwerk
- 2.4.5 Multimedia-Rechenwerke

Einfache Mikroprozessoren, insbesondere Mikrocontroller, besitzen meist nur ein einziges Rechenwerk, das für die Ausführung aller arithmetischen und logischen Operationen zuständig ist. Im Abschnitt 2.1 wurde bereits darauf hingewiesen, daß moderne Hochleistungsprozessoren hingegen über eine ganze Anzahl von unabhängig arbeitenden Rechenwerken mit speziellen Aufgaben verfügen (auch Verarbeitungseinheiten genannt, Execution Units). Zum Teil sind häufig benutzte Rechenwerke sogar mehrfach vorhanden. Wir werden im weiteren Verlauf des Kurses unter dem Operationswerk eines Mikroprozessors die Zusammenfassung aller seiner Rechenwerke verstehen. Beispiele von Rechenwerken sind

- Rechenwerke für ganze und Gleitpunkt-Zahlen (Integer Unit, Floating-Point Unit),
- schnelle Parallel-Multiplizierer, Dividierer,
- Schiebe- und Rotationseinheiten (Shifter/Rotator Unit),
- Rechenwerke zur Verarbeitung von Einzelbits und Bitfelder (Bit-Field Unit),
- Rechenwerke für graphische und Multimedia-Operationen (Graphic Unit, Multimedia Extension - MMX).

Im Rahmen dieses Abschnitts werden wir einige der genannten Rechenwerke beschreiben.

### 2.4.1 Integer-Rechenwerk |

2.4.1.1 Prinzipieller Aufbau

Im Bild 2.4-1 ist der Aufbau eines Rechenwerks für ganze Zahlen (Integer-Rechenwerk, Integer Unit) und seine Anbindung an die Prozessorkomponenten skizziert. Die Operanden, die vom Rechenwerk verknüpft werden, werden aus dem Registersatz (s. Abschnitt 2.4.3) geladen oder über den internen Prozessor-Datenbus aus dem Speicher geholt. Das Steuerwerk liefert sämtliche Steuersignale zur Aktivierung der Rechenwerksregister und zur Ausführung der gewünschten Operationen.
Das Rechenwerk besteht aus der arithmetisch/logischen Einheit (ALU), einigen Hilfsregistern und dem Statusregister. Wie bereits mehrfach gesagt, deutet der Name ALU bereits an, daß diese Einheit alle arithmetischen und logischen Operationen im Prozessor ausführt. Das im Bild 2.4-1 benutzte Symbol zeigt, daß sie dazu zwei Eingangsbusse und einen Ausgangsbus besitzt. Diese entsprechen in ihrer Breite dem internen (Daten-)Bus und sind mit diesem verbunden. Daten bzw. Operanden, die von der ALU (in einem Schritt) verarbeitet werden können, sind bei Mikrocontrollern 4, 8, 16 oder 32 bit, bei universellen Mikroprozessoren bei 32 oder 64 bit und bei DSPs 16, 24 oder 32 bit breit.
Vor die Eingänge der ALU sind Hilfsregister geschaltet, die der Zwischenspeicherung der zu verknüpfenden Operanden dienen. Sie werden auch als Puffer(-Register) oder temporäre Register (Temporary Registers, Latches) bezeichnet. Die ALU selbst enthält keine Speicherschaltungen, so daß sie ein reines Schaltnetz ist. Neben den Dateneingängen besitzt sie weitere Eingänge, die teils mit den Steuersignalen des Steuerwerkes, teils von bestimmten Bits des Statusregisters belegt sind. Das Ergebnis einer Operation wird über den Ausgangsbus in eines der Register des Prozessors, über den externen Datenbus zu den anderen Komponenten des Systems oder aber in eines der Hilfsregister der ALU übertragen. Liegt aktuell kein Ergebnis an den ALU-Ausgängen an, so werden diese vom Steuerwerk in den hochohmigen Zustand versetzt, so daß der interne Datenbus von anderen Prozessorkomponenten benutzt werden kann. In Abhängigkeit vom Ergebnis werden außerdem bestimmte Bits des Statusregisters modifiziert. (Auf das Statusregister wird weiter unten ausführlich eingegangen.)
Eines der erwähnten Hilfsregister (AC/HR) spielt bei den meisten 8-bit-Prozessoren (und vielen DSPs) eine herausragende Rolle. Es ist das einzige Register, in dem Rechendaten von der ALU prozessorintern abgelegt werden können. Es wird bei jeder arithmetischen oder logischen Operation angesprochen und enthält stets das Ergebnis und, wenn mehr als ein Operand verarbeitet werden sollen, auch einen der Eingabe-Operanden. Von der Eigenschaft, quasi die Ergebnisse "aufzusammeln", trägt dieses Register den Namen Akkumulator (Accumulator - AC).

Bild 2.4-1: Aufbau und Ansteuerung des Rechenwerkes

Einige 8-bit-Prozessoren besitzen zwei Akkumulatoren im Rechenwerk, unter denen durch einen besonderen Zusatz im Befehl einer ausgewählt werden kann. Prozessoren, die mit Akkumulatoren im Rechenwerk arbeiten, werden auch als Akkumulator-Maschinen bezeichnet. Bei modernen 16/32-bit-Prozessoren findet man in der Regel keine ausgewiesenen Akkumulatoren mehr. Ihre Funktion wird von allen oder speziellen Registern des Registersatzes übernommen. Diese speziellen Register werden Datenregister genannt. Häufig sind alle Datenregister auf gleiche Weise in einem Befehl ansprechbar. Der Name "Akkumulator" wird in diesem Fall nur dann für ein Datenregister benutzt, wenn spezielle Befehle ausschließlich auf dieses Register wirken.

Exkurs 2.4-1: Aufbau und Zeitverhalten des Rechenwerks
Bild 2.4-2 zeigt, daß der Akkumulator aus dem eigentlichen Akkumulatorregister AC als Vorspeicherregister und einem Hilfsregister HR aufgebaut ist. Prinzipiell kann der Akkumulator also aus Master-Slave-Flipflops oder aber aus zwei getrennt getakteten Registern aufgebaut werden. Im Bild 2.4-3 ist das Zeitverhalten des Rechenwerkes nach Bild 2.4-2 für die Verknüpfung eines Operanden mit dem Inhalt des Akkumulators und die Übernahme des Ergebnisses in den Akkumulator skizziert. Während der positiven Halbwelle des Taktes T liegen auf den Bussen B1 und B3 die beiden Operanden vor. Sie werden mit der negativen Flanke von T in die Hilfsregister übernommen. Während der negativen Halbwelle von T stehen sie daher über B2 und B4 an den Eingängen der ALU statisch zur Verfügung. Nach einer gewissen Ausführungszeit (t ALU) liefert die ALU das Ergebnis der Operation. Bild 2.4-2: Aufbau des Rechenwerks und des Akkumulators Dieses kann nun mit der positiven Flanke von T über B1 in den Akkumulator AC übernommen werden. Man sieht hier, daß die Eingabe-Information auf dem Bus B4 für die gesamte Rechenzeit der ALU und die Übernahmezeit des Akkumulators stabil vorliegt. Bild 2.4-3: Zeitverhalten des Rechenwerkes Aus dieser Beschreibung wird der Grund für den Einsatz des Hilfsregisters deutlich: Die ALU stellt als Schaltnetz das Ergebnis einer Rechenoperation nach der Durchlaufzeit der Signale durch ihre logischen Gatter an den Ausgängen zur Verfügung. Bis zu diesem Zeitpunkt findet man an den ALU-Ausgängen aber auch unvorhersehbare Zustandsübergänge. Soll nun der Akkumulator das Ergebnis der Operation übernehmen, so könnte es ohne Hilfsregister passieren, daß während seiner (endlich langen) Übernahmezeit die ALU bereits den neuen Akkumulatorzustand verarbeitet. Folglich könnte dann ein geänderter Ausgangszustand der ALU am Akkumulator anliegen und endgültig in diesen übernommen werden. Man spricht in diesem Fall von einem kritischen Wettlauf der Signale (Critical Race). Hersteller von Halbleiterschaltungen verlangen daher, daß die Eingangssignale eines Registers oder Speichers wenigstens für eine bestimmte Zeit nach dem Übernahmetakt noch gültig sind. Diese Zeit ist im Bild 2.4-3 mit thold (Haltezeit) bezeichnet. An den Signalen auf Bus B3 sieht man, daß ohne das zusätzliche Hilfsregister diese Forderung nicht erfüllt ist. Es sei hier nur erwähnt, daß es eine große Vielzahl von Varianten für den Aufbau eines Rechenwerks gibt, auf die wir hier nicht eingehen wollen.

2.4.1.2 Das Statusregister

Das Statusregister (Zustandsregister, Condition Code Register - CCR) besteht aus einzelnen, logisch unabhängigen Bits, die nur aus Gründen der einfacheren Adressierung zu einem Register verkettet werden. Diese Bits werden häufig auch als Marken oder Flags ("Flaggen") bezeichnet. Die Flags werden aus den Operanden und dem Ergebnis einer Operation abgeleitet und reflektieren damit den "Zustand" des Rechenwerkes nach dieser Operation. Sie werden aber nicht nur durch die Ausführung von arithmetischen oder logischen Operationen der ALU verändert, sondern häufig auch durch andere Befehle, bei denen der logische Zusammenhang zwischen der Operation und den Flags nicht zu erkennen ist. Zur Vermeidung von unerwünschten Nebeneffekten muß deshalb der Maschinenprogrammierer stets die Angaben des Herstellers darüber beachten, welche Flags bei einer Operation beeinflußt werden.
Je nach dem momentanen Wert der Flags kann der Ablauf des augenblicklich ausgeführten Befehls geändert werden, was sich dann natürlich auch auf den Ablauf des Maschinenprogramms auswirken kann. Dazu dienen z.B. die Befehle zur bedingten Programmverzweigung. Diese Befehle werten häufig nicht nur ein einzelnes Flag aus, sondern auch bestimmte logische Verknüpfungen mehrerer Flags. Um die Anzahl der benötigten Meldeleitungen vom Statusregister zum Steuerwerk klein zu halten, werden die Bits des Statusregisters über einen Multiplexer selektiv zum Steuerwerk durchgeschaltet. Er wird durch Signale des Steuerwerks gesteuert und gewöhnlich mit Bedingungsmultiplexer oder Testmultiplexer bezeichnet (vgl. Selbsttestaufgabe 2.2-1.)
Das Statusregister kann, wie jedes andere Register des Prozessors auch, in einem Programm gelesen, ausgewertet und verändert werden. Bei der Abarbeitung von Unterprogrammaufrufen oder Programmunterbrechungen kann es somit in den Arbeitsspeicher gerettet werden und bewahrt dadurch den Prozessorzustand bis zur Wiederaufnahme des unterbrochenen Programms.
Zur Erleichterung der Adressierung werden übrigens bei einfachen Prozessoren häufig die Bits des Statusregisters und des Steuerregisters (s. Abschnitt 2.2) in einem einzigen Register zusammengefaßt. Für dieses Register wird dann häufig unpräziserweise ebenfalls der Ausdruck Statusregister benutzt. Bild 2.4-4 zeigt die typischerweise im Statusregister vorhandenen Flags. Sehr häufig sind einige Bits des Statusregisters nicht belegt (frei) oder für spätere Erweiterungen des Herstellers reserviert (res).

Bild 2.4-4: Typische Flags eines Statusregisters

2.4.1.3 Erklärung der Statusflags

CF | Das Übertragsbit(Carry Flag) zeigt bei der Addition an, ob ein Übertrag (Carry) aus dem höchstwertigen Bit auftritt, bei der Subtraktion, ob dort ein Übertrag (Borrow) aus höherwertigen Teiloperanden benötigt wird. Die Berechnung von Summen und Differenzen mit einer Wortbreite, die ein Vielfaches der ALU-Breite ausmacht, muß durch die ALU sequentiell in gleichartigen Teiloperationen durchgeführt werden. Dabei wird das Übertragsbit einer Teiloperation als Eingangsinformation für die folgende Teiloperation herangezogen. Darüber hinaus besitzt das Übertragsbit besondere Bedeutung bei der bitweisen Verschiebung von Operanden, auf die am Ende dieses Abschnittes eingegangen wird.
AF | Das Hilfs-Übertragsbit(Auxiliary Carry Flag, auch Half-Carry Flag genannt,) zeigt einen Übertrag vom Bit 3 ins Bit 4 des Ergebnisses an. (Seine Gewinnung entspricht der des Übertragsbits für 4-bit-Operanden.) Es wird nur bei Prozessoren benötigt, deren ALU keine BCD-Arithmetik (Binary Coded Decimal) beherrscht. Dort dient es zusammen mit dem Übertragsbit zur Umwandlung eines dualen Ergebnisses in eine BCD-Zahl (vgl. Selbsttestaufgabe 2.4-1, 1., 4.).
ZF | Das Nullbit (Zero Flag) zeigt an, ob das Ergebnis der letzten Operation gleich 0 war. Dabei kann es sich um das Laden eines Operanden in ein Register, um eine arithmetische oder logische Operation oder das Dekrementieren eines (Index-)Registers handeln. Die letztgenannte Möglichkeit wird besonders bei der Programmierung von Schleifen benutzt.
SF | Das Vorzeichenbit (Sign Flag, Negative Flag - N) zeigt an, daß das Ergebnis negativ ist, also sein höchstwertiges Bit (Most Significant Bit - MSB) den Wert 1 hat. Ganz allgemein spiegelt dieses Flag das höchstwertige Bit eines Operanden wider.
OF | Das Überlaufbit (Overflow Flag, auch durch OV bzw. V abgekürzt) zeigt eine Bereichsüberschreitung im Zweierkomplement an. Bei einer Breite des Ergebnisses von n bit wird dieses Bit also gesetzt, wenn das Ergebnis kleiner als -2n-1 oder größer als 2n-1-1 ist.
EF | Das Even Flag zeigt an, ob das Ergebnis eine gerade Zahl ist.
PF | Das Paritätsbit (Parity Flag) signalisiert, ob das Ergebnis eine ungerade Parität, d.h. eine ungerade Anzahl von '1'-Bits hat.

Die Flags werden aus den Operanden, dem Ergebnis einschließlich eines aufgetretenen Übertrags und einigen Signalen des Steuerwerkes durch ein Schaltnetz bestimmt. Damit befaßt sich die folgende Selbsttestaufgabe.

Selbsttestaufgabe S2.4-1: (–> Lösungsvorschlag)
Betrachtet werde eine 8-bit-ALU, die im wesentlichen aus einem Parallel-Addierer/Subtrahierer besteht. Durch ein Steuersignal AS werde angezeigt, ob die augenblicklich ausgeführte Operation eine Addition (AS=0) oder eine Subtraktion (AS=1) zweier Operanden im Zweierkomplement ist. (Die Operanden seien mit A=A7...A0 und B=B7...B0, das Ergebnis mit F=F7...F0 bezeichnet.) Leiten Sie logische Gleichungen zur Bestimmung der Flags AF, CF, OF, ZF, SF, EF, PFaus A, B, F und AS her. Nun sei angenommen, daß die ALU ihre Operanden wahlweise als vorzeichenlose ganze Zahlen oder als vorzeichenbehaftete Zahlen im Zweierkomplement verarbeiten kann. Leiten Sie für beide Fälle aus den Flags logische Beziehungen dafür her, daß für die beiden Operanden A, B einer Vergleichssubtraktion A - B gilt: A<B, A<= B, A>B, A>=B Zeichnen Sie eine Schaltung, die aus den Operanden A B, dem Ergebnis F sowie dem Steuersignal AS die Flags ZF, EF, SF, PF, OF erzeugt und aus diesen sowie aus dem Übertragsbit CF und dem Hilfs-Übertragsbit AF wiederum die unter 2. hergeleiteten Vergleichsresultate. Ergänzen Sie Ihre Zeichnung um einen Testmultiplexer, der genau eines der aufgeführten Signale zum Steuerwerk durchschaltet. A, B seien nun zweistellige BCD-Zahlen. Geben Sie an, wie die ALU nach einer Addition A+B das Ergebnis F wiederum in eine zweistellige BCD-Zahl verwandeln kann.

2.4.1.4 Der Operationsvorrat einer Integer-ALU

In Tabelle 2.4-1 sind die Operationen aufgeführt, die eine Integer-ALU - ein Rechenwerk, das alle arithmetischen Operationen nur auf ganzzahligen Operanden anwendet - im Minimalfall ausführen kann.
Es fällt auf, daß dieser (minimale) Operationsvorrat nicht wesentlich über die vier Grundrechenarten +, -, ×, / hinausgeht. Viele der 8-bit-Prozessoren beherrschen nicht einmal die Multiplikation und die Division, so daß diese wie alle anderen "höheren" mathematischen Operationen durch einen speziellen Baustein, einen sog. Arithmetik-(Co-)Prozessor, oder zeitaufwendiger durch ein Programm in vielen Schritten sequentiell berechnet werden müssen. Im letzten Fall spricht man von einer Emulation in Software.

Tabelle 2.4-1: Operationen einer ALU

Operation | Funktion
Arithmetische Operationen
Addieren ohne/mit Übertrag | F := A+B; F := A+B+CF
Subtrahieren ohne/mit Übertrag | F := A-B; F := A-B-CF
Inkrementieren | F := A+1
Dekrementieren | F := A-1
Multiplizieren (ohne/mit Vorzeichen) | F := A×B
Dividieren (ohne/mit Vorzeichen) | F := A/B
Komplementieren (im Zweierkomplement) | F := ¬A+1
Logische bitweise Verknüpfungen
Negation | F := ¬A
Und | F := A^B
Oder | F := AvB
Antivalenz | F := A<|>B
Schiebe- und Rotationsoperationen
Linksverschieben | F := 2×A modulo 2n
Rechtsverschieben | F := [A/2]
Linksrotieren ohne Übertragsbit | F := 2×A + An-1 mod 2n
Linksrotieren durchs Übertragsbit | F := 2×A + CF mod 2n
Rechtsrotieren ohne Übertragsbit | F := [A/2] + A0×2n-1
Rechtsrotieren durchs Übertragsbit | F := [A/2] + CF×2n-1
Transport-Operation
Transferieren | F := A ; F := B
| F := Konstante
Bezeichnungen: A, B Operanden; F Ergebnis; CF Übertrag; n Länge von A (in bit); ^, v , <|>, ¬ : UND, ODER, Antivalenz, Inversion; ':=' Zuweisung; [ ] ganzzahliger Teil

- Die Addition und die Subtraktion werden wahlweise auf vorzeichenlose ganze Zahlen oder auf vorzeichenbehaftete ganze Zahlen angewandt. Dabei macht die Schaltung keinerlei Unterschied zwischen beiden Zahlenbereichen; die Interpretation der Zahlen bleibt dem Benutzer überlassen. Die Subtraktion wird meist durch die Addition der negierten Zahl (im Zweierkomplement) durchgeführt. Alternativ kann ein Übertrag CF, der in einer vorhergehenden Operation aufgetreten ist, berücksichtigt werden oder nicht. Einige Prozessoren bieten die Operationen nur mit Berücksichtigung des Übertrags. Bei ihnen muß gegebenenfalls das Übertragsbit durch einen besonderen Befehl vor der Ausführung der Operation auf '0' bzw. '1' gesetzt werden. Dies wird im folgenden Beispiel vorausgesetzt.

  Beispiel

  Zwei 16-bit-Operanden

  A = AH,AL = (A15...A8),(A7...A0) und
  B = BH,BL = (B15...B8),(B7...B0) ,

  die jeweils zwei Bytes im Speicher belegen, sollen durch eine 8-bit-ALU mit dem Akkumulator AC addiert (bzw. subtrahiert) werden. Nach der Addition/Subtraktion der niederwertigen Bytes enthält das Übertragsbit den Übertrag, der in die Berechnung des höherwertigen Ergebnisbytes eingeht.

  Schritt | Addition | Subtraktion | Bemerkung
  1. | CF:=0 | Rücksetzen des Übertragsbits
  2. | AC:=AL | Laden des L-Bytes von A
  3. | AC:=AC+BL+CF | AC:=AC-BL-CF | Operation mit dem L-Byte von B und CF,
  4. | AL:=AC | Abspeichern nach AL
  5. | AC:=AH | Laden des H-Bytes von A
  6. | AC:=AC+BH+CF | AC:=AC-BH-CF | Operation mit dem H-Byte von B und CF
  7. | AH:=AC | Abspeichern nach AH

- Die beiden Operationen Inkrementieren bzw. Dekrementieren sind Spezialfälle der Addition bzw. der Subtraktion, bei denen der zweite Operand B durch die Konstante '1' ersetzt wird.
- Da das Ergebnis der Multiplikation bekanntlich doppelt so 'lang' werden kann wie jeder Operand, braucht man also wenigstens zwei Register, die das Ergebnis aufnehmen können, z.B. zwei Akkumulatoren AC0 und AC1. Natürlich sind zurÜbertragung des Ergebnisses in die Register zwei Schritte nötig.
  Dann ergibt sich als Ergebnis der Multiplikation:
  AC1 := H-Byte von (AC0×AC1) und AC0 := L-Byte von (AC0×AC1).
  Die Multiplikation kann häufig wahlweise mit vorzeichenlosen Zahlen oder vorzeichenbehafteten Zahlen im Zweierkomplement ausgeführt werden. Beide Zahlenbereiche müssen jedoch von der ALU unterschiedlich verarbeitet werden, da bei der Multiplikation zweier vorzeichenbehafteter Zahlen zunächst zwei Vorzeichen-Bits entstehen, von denen eins wieder entfernt werden muß.
- Bei der Division entsteht in der Regel ein ganzzahliger Quotient und ein Rest. Hier gibt es nun sehr unterschiedliche Möglichkeiten, das Ergebnis zu verwerten: Die ALU kann nur den ganzzahligen Anteil des Quotienten, nur den Rest oder aber, falls wieder zwei Operandenregister (Akkumulatoren) existieren, beide ausgeben. Dabei muß der Rest der Division gegebenenfalls auf die Anzahl der Bits des Akkumulators abgeschnitten werden. Diesen Fall kann man folgendermaßen darstellen:
  AC1 := ganzzahliger Anteil von (AC1/AC),
  AC0 :=(abgeschnittener) Rest von (AC1/AC0).

  Auch die Division kann häufig wahlweise mit vorzeichenlosen Zahlen oder vorzeichenbehafteten Zahlen im Zweierkomplement ausgeführt werden.

- Durch die Operation Komplementieren wird eine Zahl in ihr Zweierkomplement umgewandelt. Dies geschieht durch bitweise Negation (Inversion) und anschließende Addition von 1.
- Die logischen Operationen Inversion, UND-, ODER- bzw. Antivalenz werden stets bitweise auf ihren Operanden ausgeführt. Wir beschreiben sie anhand eines Beispiels. (Bezeichnungen: s. Tabelle 2.4-1.)

  Beispiel | Es seien | A := 01101100 ,
  |  | B := 11101001 .
  Dann folgt: | F :=Ø A = 10010011 , | F := AÙB = 01101000 ,
  | F := AÚB = 11101101 , | F := A¹B= 10000101 .

- Die Schiebe- und Rotations-Operationen können meistens in beide Richtungen 'links'/'rechts' durchgeführt werden. Bei Akkumulatormaschinen kann natürlich auch der Akkumulator als Links/Rechts-Schieberegister ausgebildet sein und somit diese Operationen ohne Einsatz der ALU durchführen. ("links" bedeutet dabei üblicherweise eine Verschiebung in Richtung der höherwertigen Bits, "rechts" in Richtung der niederwertigen Bits. Verschiebe- und Rotations-Operationen tauchen noch einmal im Abschnitt 3.2, im Zusammenhang mit den Befehlen auf, durch die sie aufgerufen werden.)
  - Bei den logischen Schiebeoperationen werden die Bits des Operanden als unabhängig voneinander betrachtet und besitzen keine Wertigkeiten. Das aus dem Register herausfallende Bit wird in das Übertragsbit übernommen und am anderen Ende eine '0' hereingezogen (s. Bild 2.4-5a). Dadurch bekommt man die Möglichkeit, durch wiederholtes Verschieben jedes Bit eines Registers in das Übertragsbit CF zu übertragen und dort durch einen besonderen Befehl auszuwerten (s. Abschnitt 3.2).

    Bild 2.4-5: Darstellung der Schiebe-Operationen

    Neben ihrer logischen Bedeutung besitzen die Schiebeoperationen auch eine arithmetische: Bekanntlich bedeutet eine Verschiebung einer vorzeichenlosen Dualzahl um ein Bit nach links eine Multiplikation mit 2, eine Verschiebung nach rechts eine Division durch 2. Im Bild 2.4-5b wird der Operand als vorzeichenbehaftet angesehen. Um bei der Schiebeoperation das Vorzeichen zu erhalten, wird das höchstwertige Bit in sich selbst zurückgeführt. Man spricht in diesem Fall von einem arithmetischen Rechts-Schieben (Shift Arithmetic Right).

  - Die Rotations-Operationen unterscheiden sich von den Schiebe-Operationen dadurch, daß das Register als geschlossene Bitkette aufgefaßt wird (s. Bild 2.4-6), indem das jeweils an einem Ende herausfallende Bit am entgegengesetzte Ende in das Register hereingezogen wird. Dabei kann das Übertragsbit wahlweise mit benutzt werden (Rotieren mit/ohne Übertragsbit). Außerdem kann das Übertragsbit als zusätzliches Bit des Registers aufgefaßt werden (Rotieren durchs Übertragsbit).

    Selbsttestaufgabe S2.4-2: (–> Lösungsvorschlag)
    Es seien A:=10101101 , CF:=0. Geben Sie für alle Schiebe- und Rotations-Operationen das Ergebnis an.

  - Durch die Transport-Operation kann einer der beiden Operanden auf den ALU-Ausgang durchgeschaltet werden. Dies ist z.B. dann wichtig, wenn der Akkumulatorinhalt in einem Register oder einer Speicherzelle abgelegt werden soll. Es können aber auch häufig benutzte Konstanten, die in der ALU erzeugt werden, auf den Ausgang gelegt werden, wie z.B. 0, 1 oder -1 usw. Wichtig ist, daß bei dieser Operation die Flags des Statusregisters dem Operanden entsprechend gesetzt werden und so die Größe des Operanden durch spezielle Befehle getestet werden kann.

Bild 2.4-6: Darstellung der Rotations-Operationen

2.4.1.5 Sättigung

Bei den Operationen Addition oder Subtraktion von ganzen Zahlen tritt in den folgenden Fällen ein Überlauf (Overflow, s.a. das Flag OF in Abschnitt 2.4.1.3 ) auf, d.h. der Zahlenbereich wird auf der einen Seite verlassen und auf der anderen Seite wieder betreten:

1. Die Summe zweier vorzeichenloser Zahlen überschreitet den darstellbaren Zahlenbereich und wird auf die darstellbaren Bits abgeschnitten.
2. Die Differenz zweier vorzeichenloser Zahlen ist kleiner als 0. Das Ergebnis wird modulo zur Größe des darstellbaren Zahlenbereichs als positive Zahl ausgegeben.
3. Die Summe zweier vorzeichenbehafteter positiver Zahlen überschreitet den darstellbaren positiven Zahlenbereich und wird als negative Zahl ausgegeben.
4. Die Summe zweier vorzeichenbehafteter negativer Zahlen unterschreitet den darstellbaren negativen Zahlenbereich und wird als positive Zahl ausgegeben.

Dieses eben beschriebene zyklische Durchschreiten (Wrap-around) führt bei allgemeinen arithmetischen Rechnungen zu einer Überlauf-Ausnahmesituation (Overflow Trap) und muß durch ein geeignetes Behandlungsprogramm bereinigt werden. Bei Anwendungen der digitalen Signalverarbeitung oder im Multimediabereich kann ein Überlauf oft nicht toleriert werden, da er zur Ausgabe eines falschen (z.B. invertierten) Signals oder falscher Werte (z.B. für graphische Anwendungen) führt. Andererseits darf diese Behandlung aus Zeitgründen oft nicht durch Software durchgeführt werden, sondern sie muß in Hardware implementiert sein.
Dazu bieten die entsprechenden Rechenwerke von DSPs und modernen universellen Prozessoren die Möglichkeit der Sättigung (Saturation): Die Ergebnisse werden auf den größten bzw. kleinsten Wert des darstellbaren Zahlenbereichs abgeschnitten, je nachdem, ob der Zahlenbereich nach oben oder unten überschritten wurde. Im o.a. 1. Fall führt das zu der Zahl $FF..FF, im 2. Fall zum Ergebnis $00..00. Der 3. Fall ergibt die korrigierte Summe $7F..FF und der 4. Fall $80..00.
DSPs besitzen häufig ein bestimmtes Bit im Steuerregister, durch das die Arbeitsweise des Rechenwerks ohne bzw. mit Sättigung aufgabengerecht festgelegt werden kann. Multimedia-Rechenwerke bieten meist für jede der Operationen Addition und Subtraktion zwei getrennte Maschinenbefehle für die Ausführung der Operation ohne oder mit Sättigung der Ergebnisse (vgl. Abschnitt 3.2).

### 2.4.2 Der Barrel Shifter |

Bei einfachen Mikroprozessoren kann das Rechenwerk einen Operanden in jedem Taktzyklus des Prozessors um höchstens eine Bitposition nach links oder rechts schieben bzw. rotieren. Dies bedeutet, daß das Verschieben/Rotieren um mehrere Positionen sehr zeitaufwendig durch eine Schleife realisiert werden muß. Daher besitzen die Rechenwerke von komplexeren Prozessoren die Fähigkeit, einen Operanden in einem einzigen Taktzyklus um eine beliebige Anzahl von Bitpositionen zu verschieben/rotieren, die nur durch die Länge des Operanden beschränkt wird. Diese Operationen werden durch eine Teilkomponente des Rechenwerks ausgeführt, die als Barrel Shifter (oder Barrel Rotator) bezeichnet wird. Zur Erhöhung der Fähigkeit, mehrere Operationen parallel auszuführen zu können, ist der Barrel Shifter bei modernen Mikroprozessoren, insbesondere den DSPs, z.T. sogar als autonom arbeitendes Rechenwerk realisiert.
Die Grundschaltungen zur Realisierung eines Barrel Shifters bilden Multiplexer, die prinzipiell jede Eingabeleitung mit jeder Ausgabeleitung verbinden können. Daraus wird bereits der immense Aufwand an Chipfläche für die benötigten Schaltgatter und ihre Verbindungsleitungen deutlich. Im folgenden Exkurs wird beispielhaft ein spezieller Barrel Shifter behandelt, der in einem Taktzyklus um 0 bis 3 Positionen verschieben kann .

Selbsttestaufgabe S2.4-3: (–> Lösungsvorschlag)
2. Geben Sie eine Realisierung für den 4-bit-Multiplexer derart an, daß der Index des durchgeschalteten Eingangs Ei gerade mit der durch (S1,S0) gegebenen Dualzahl übereinstimmt. Entwerfen Sie ein Schieberegister, das in Abhängigkeit von zwei Steuersignalen S1, S0 wahlweise
   | S1 | S0
   - den Registerinhalt unverändert läßt bzw. - parallel über die Dateneingänge Di, - mit dem Doppelten des alten Registerinhalts, - mit dem Vierfachen des alten Registerinhalts geladen wird. | 0 0 1 1 | 0 1 0 1
Geben Sie eine Hardwarelösung für die Beschaltung der Eingänge eines Adreßaddierers an, um eine Skalierung um den konstanten Faktor 8 zu erreichen.

Exkurs 2.4-2: Realisierung eines Barrel Shifters
Die Skalierung erlaubt es, einen Operanden wahlweise mit den Werten 1, 2, 4 oder 8 zu multiplizieren. Bekanntlich bedeutet eine Multiplikation einer positiven ganzen Zahl mit dem Faktor 2 gerade eine Verschiebung um eine Bitposition nach links, also zu höheren Bitwertigkeiten hin, und dem Auffüllen der untersten Bitstelle mit einer '0'. Daher kann man die Skalierungskomponente durch einen Barrel Shifter als Schaltnetz realisieren, das alle Bits wahlweise um 0, 1, 2 oder 3 Stellen nach links verschiebt. Im Bild 2.4-7 ist eine mögliche Realisierung dieses Barrel Shifters dargestellt. Der Grundbaustein ist ein 4-bit-Multiplexer. Sein Schaltsymbol ist im oberen Teil von Bild 2.4-7 angegeben. Die beiden Steuerleitungen S0 und S1 der Multiplexer werden für alle Bitpositionen miteinander verbunden. Bild 2.4-7: Realisierung eines Barrel Shifters Ist D=Dn...D0 die Eingabeinformation der Skalierungskomponente, so ist die Ausgabeinformation 3 bit länger, d.h. man kann sie als A=An+3An+2 An+1 An...A0 schreiben. Jeder Dateneingang Di ist beim Multiplexer Nr. i mit dem Eingang E3, bei seinem unmittelbar linken Nachbarn mit dem Eingang E2, beim übernächsten Nachbar mit E1 und beim dritten linken Nachbarn mit E0 verbunden. Die bei dieser Belegung frei bleibenden unteren Eingänge der ersten drei Multiplexer bzw. oberen Eingänge der letzten drei Multiplexer werden mit '0' belegt. (Natürlich kann man diese Multiplexer auch durch spezielle Multiplexer mit 1 bis 3 Eingängen ersetzen.) Für die Ausgänge Ai ergeben sich in Abhängigkeit von S0 und S1 die folgenden Werte:
S1 | S0 | Ai | Funktion
0 | 0 | Di-3 | A = 8×D
0 | 1 | Di-2 | A = 4×D
1 | 0 | Di-1 | A = 2×D
1 | 1 | Di | A = 1×D

### 2.4.3 Multiplizier-Akkumulier-Rechenwerk |

Später werden wir zeigen, daß viele Algorithmen der digitalen Signalverarbeitung die Berechnung von Funktionen der Form

S i = ai * bi ,

d.h. Summen von Produkten (Sums of Products), auszuführen haben. Die Grundoperation, die der obigen Formel zugrunde liegt, ist eine Multiplikation mit anschließender Addition zur jeweils vorher ermittelten Summe. Eine Addition dieser Art wird auch als Akkumulation bezeichnet und die zusammengesetzte Operation als Multiplizier-Akkumulier-Operation (Multiply-Accumulate - MAC). Die Berechnung der beschriebenen Funktionen wird seit einigen Jahren nicht mehr nur von Digitalen Signalprozessoren (DSPs), sondern - insbesondere im Zusammenhang mit Multimedia-Anwendungen - auch von universellen Hochleistungsprozessoren verlangt. DSPs haben Rechenwerke, die speziell auf die schnelle Berechnung der MAC-Operation ausgelegt sind und diese in einem einzigen Prozessorzyklus schaffen. Universelle Prozessoren besitzen dazu oft - neben den anderen Rechenwerken - eine spezielle MAC-Einheit. Im folgenden Bild 2.4-8 ist der prinzipielle Aufbau eines Multiplizier-Akkumulier-Rechenwerks skizziert.

Bild 2.4-8: Aufbau eines Multiplizier-Akkumulier-Rechenwerks

Zwei n-bit-Operanden werden durch einen schnellen Parallelmultiplizierer zu einem 2n-bit-Produkt verknüpft. Das Ergebnis wird einem Eingang der 2n-bit-ALU zugeführt. Auf den zweiten Eingang der ALU wird der Akkumulator zurückgekoppelt, der alle Ergebnisse der ALU auffängt. (Die Rolle des Akkumulators wird bei vielen Prozessoren von einem beliebigen Datenregister wahrgenommen.) Durch die gestrichelte Linie, die um den Multiplizierer herumführt, soll gezeigt werden, daß die ALU auch Operanden ohne vorausgehende Multiplikation verarbeiten kann. Häufig kann außerdem der Akkumulatorinhalt vor der Verknüpfung in der ALU durch einen Barrel Shifter geführt und dort um eine beliebige Anzahl von Bitpositionen verschoben werden. Dies dient z.B. zur Skalierung des Operanden oder zur De-/Normalisierung (s. Abschnitt 2.4.3).

### 2.4.4 Gleitpunkt-Rechenwerk |

Gerade in technisch-wissenschaftlichen Anwendungen treten häufig Zahlenwerte auf, zwischen denen viele Größenordnungen liegen. Hier ist es zweckmäßig, sich neben den eigentlichen wichtigen ("signifikanten") Ziffern auch die individuelle Größenordnung einer Zahl ("Maßstabsfaktor") zu merken. Dies führt zur Gleitpunkt-Zahlendarstellung. Wir beschränken uns im folgenden auf die Darstellung der Gleitpunktzahlen im Binärsystem. Dann läßt sich eine Gleitpunktzahl Z folgendermaßen darstellen:

Z = ± M × 2±E .

- M ist die oben erwähnte Folge der signifikanten Ziffern und wird Mantisse genannt. Sie kann positiv oder negativ sein, was durch das vorangestellte Vorzeichen '±' ausgedrückt ist. Üblicherweise wird verlangt, daß 0.5 <= M < 1 ist, d.h. in der binären Darstellung der Mantisse das erste Bit nach dem Punkt eine '1' ist. In diesem Fall spricht man von der normalisierten Form. Im Fall, daß M < 0.5 gilt, spricht man dementsprechend von der denormalisierten Form.
- 2±E ist der Maßstabsfaktor der Zahl Z. Die Zahl E heißt der Exponent der Zahl. Auch er kann, ausgedrückt durch das vorangestellte '±', positiv oder negativ sein. Durch Addition einer geeigneten konstanten Zahl kann der Exponent in den positiven Zahlenbereich verschoben und dadurch auf das Vorzeichen des Exponenten verzichtet werden. Im folgenden wollen wir dies voraussetzen.

Sehr viele mathematische Funktionen mit Gleitpunktzahlen bedingen die Ausführung unterschiedlicher Operationen auf Exponent und Mantisse der Zahlen. So wird ja z.B. die Multiplikation zweier Zahlen durch die Addition der Exponenten und die Multiplikation der Mantissen durchgeführt:

Z1×Z2 | = [(-1)VZ1 × 2E1 × M1] × [(-1)VZ2 × 2E2 × M2]
| = (-1)VZ1+VZ2 × 2E1+E2 × (M1 × M2) .

Die Unterteilung der Gleitpunkt-Datenformate in Exponent und Mantisse spiegelt sich häufig auch im Aufbau eines Gleitpunkt-Rechenwerks (Floating-Point Unit - FPU) wider, wie es in der folgenden Fallstudie beschrieben wird. Zur Beschleunigung der Berechnung mathematischer Funktionen besitzt das Rechenwerk zwei ALUs, die ihre Operationen auf den Exponenten und den Mantissen soweit wie möglich parallel durchführen. Einfachere, ältere Gleitpunkt-Einheiten besaßen nur eine ALU, die die Berechnungen von Exponenten und Mantissen sequentiell hintereinander - und damit sehr zeitaufwendig - durchführen mußte.
Noch bis zur Mitte der 80er Jahre besaßen Mikroprozessoren keine integrierte FPUs. Diese mußten als eigenständige Bausteine mit dem m P über den Systembus verbunden werden und wurden als Arithmetik-(Co-)Prozessoren bezeichnet.

Fallstudie 2.4-1: Gleitpunkt-Rechenwerk der Intel-Prozessoren
Bild 2.4-9 zeigt den prinzipiellen Aufbau des Gleitpunkt-Rechenwerks, wie es in den Arithmetik-Prozessoren 80287, 80387 und der integrierten FPU des 80486 eingesetzt wurde. Das Rechenwerk unterstützt das IEEE-785-Format für Gleitpunktzahlen, das im Abschnitt 3.1 beschrieben wird. Bild 2.4-9: Operationswerk einer Arithmetik-Einheit mit zwei ALUs Das Rechenwerk besitzt einen eigenen Satz von Register für die Ablage von Gleitpunktzahlen, die die Unterteilung der Operanden in Vorzeichen/Exponent bzw. Mantisse widerspiegeln: 64-bit-Mantisse, 15-bit-Exponent und Vorzeichen der Mantisse. Zusätzlich werden in einem Festwertspeicher, dem Konstanten-ROM, wichtige und häufig benötigte Konstanten als Gleitpunktzahlen abgespeichert und so deren zeitaufwendige Neuberechnung vermieden. Aus dem Registersatz werden über zwei getrennte Busse (mit 16 bzw. 64 Leitungen) die Operandenteile den Hilfsregistern (HR) der ALUs zugeführt. Diese ALUs führen dann die geforderten Operationen aus. Die Mantissen-ALU berechnet ihre Ergebnisse intern mit einer größeren Genauigkeit (z.B. 68 bit). Die Ergebnisse werden erst vor ihrer Übertragung in den Registersatz auf das vorgegebene Format gerundet. Beide ALUs tauschen über besondere Steuerleitungen Informationen aus. Bei der oben angesprochenen Normalisierung von Gleitpunktzahlen muß die ALU des Exponenten z.B. wissen, um wie viele Bitpositionen die Mantisse verschoben wurde. Zur ALU für die Mantissen-Operationen gehört auch eine Rundungslogik, die das Ergebnis auf das verlangte Format abschneidet. Außerdem ist ihr ein Barrel Shifter zugeordnet. Da dieser sehr viel Chipfläche benötigt, wurde er nur einmal im Operationswerk realisiert und mußte so auch für eine eventuelle Verschiebung des Exponenten mitbenutzt werden. Dies wird durch die Schaltlogik ermöglicht, die die Bussysteme beider ALUs verbindet. Die Kopplung beider Bussysteme wird insbesondere auch für Befehle benötigt, die den Exponenten oder die Mantisse einer Gleitpunktzahl selbst in eine Gleitpunktzahl umwandeln (vgl. Abschnitt 3.2). Im Statusregister findet man - neben den bereits beim Integer-Rechenwerk beschriebenen Zero Flag und Negative Flag - ein Positive Flag, das ein positives Ergebnis (>0) markiert. Bei den beiden letztgenannten Flags wird noch zwischen gültigen oder ungültigen Ergebnissen (NaN), beim Zero Flag zwischen +0 und -0 unterschieden. Ein Busy Bit zeigt der CPU an, ob die FPU beschäftigt ist oder nicht. Darüber hinaus existieren weitere Statusflags, die anzeigen, ob das Ergebnis der letzten Operation positiv bzw. negativ unendlich ist (±∞, Infinity), keine gültige Gleitpunktzahl im verlangten Format ist (NaN - Not a Number), den darstellbaren Zahlenbereich nach oben (Overflow) oder unten (Underflow) verlassen hat, in nicht normalisierter Form vorliegt (Denormalized), durch Rundung an Genauigkeit verloren hat (Precision), bei der Division durch 0 entstand (Divide by Zero). Durch spezielle Bits im Steuerregister kann für jedes der letztgenannten Ereignisse individuell festgelegt werden, ob es zu einem Trap führen soll oder nicht. Darüber hinaus kann dort die Genauigkeit der von der FPU ausgegebenen Ergebnisse nach dem IEEE-785-Format bestimmt werden. Zusätzlich kann eine von vier verschiedenen Rundungsmöglichkeiten selektiert werden, die im IEEE-754-Standard festgelegt sind (vgl. Abschnitt 3.2).

### 2.4.5 Multimedia-Rechenwerke |

Die Breite der Operanden, die von Integer-Rechenwerken verarbeitet (und im Registersatz zwischengespeichert) werden, ist im Laufe der Jahre von 4 bit auf bis zu 64 bit gewachsen (vgl. Bild 1.3-3). Andererseits wird der Einsatz moderner Mikrorechner durch das verstärkte Vordringen von Multimedia-Anwendungen geprägt, die die Darstellung von Graphiken, die Wiedergabe von Video- und Audio-Aufnahmen und die Kommunikation über lokale oder Weitverkehrsnetze integrieren. Diese Anwendungen sind häufig durch relativ "kurze" Daten gekennzeichnet: Im Integer-Bereich kommt man beispielsweise mit 8 bit oder 16 bit, im Gleitpunkt-Bereich mit 32-bit-Zahlen aus. Einerseits bedeutet die Ablage dieser Daten in "langen" Registern mit einer Länge von (32,) 64 oder 80 bit eine "Verschwendung" von (Register-)Speicherplatz. Andererseits bedingt ihre Verarbeitung eine geringe Ausnutzung der Rechenkapazität einer Standard-ALU oder -Gleitpunkt-Einheit. Darüber hinaus verlangt die realistische Bearbeitung und Ausgabe dieser Daten eine hohe Verarbeitungsgeschwindigkeit von diesen Rechenwerken, da sie wiederholt die gleichen Befehle nacheinander auf diese Daten anwenden müssen. Aus diesen Gründen wurden viele moderne, universelle Mikroprozessoren mit besonderen Rechenwerken zur Manipulation von Graphik-, Video- oder Audio-Daten ausgestattet.

2.4.5.1 Integer-Rechenwerke für Multimedia

Die wohl bekannteste Realisierung eines Rechenwerks für Integer-Daten ist die MMX-Einheit (MultiMedia Extension) der Pentium-Prozessoren von Intel und ihrer x86-kompatiblen Konkurrenten anderer Hersteller. Dieses Rechenwerk verwendet eine ALU, die die Skalierbarkeit der Operandenbreite von 8, 16, 32 oder 64 bit, das "Packen" von kurzen Operanden zu einem 64-bit-Datum und die parallele Ausführung gleicher Operationen auf mehreren solcher Operanden unterstützt. Eine der Hauptanwendungen dieser Rechenwerke ist das Füllen von Flächen (Rendering) im Bereich der graphischen Datenverarbeitung. Die gepackten Daten werden in speziellen 64-bit-Registern abgelegt, die im Abschnitt 6.9 beschrieben werden.
Im Bild 2.4-10 sind die verschiedenen Betriebsarten der MMX-Einheit skizziert. Wichtig ist, daß die Umschaltung zwischen diesen Betriebsarten von Befehl zu Befehl funktioniert, also nicht für eine mehr oder weniger lange Befehlsfolge geschehen muß.

Bild 2.4-10: Die Betriebsarten der MMX-Einheit

- Im Bild 2.4-10a) werden zwei 64-bit-Operanden (sog. Quadwords - QW) zu einem 64-bit-Operanden verknüpft. Als Operationen sind neben der Lade-/Speicheroperation die logischen bitweisen Verknüpfungen sowie die Verschiebeoperationen möglich.
- Bild 2.4-10b) zeigt, wie zwei Paare von jeweils 32-bit-Doppelwörtern (Double Words - DW) unabhängig voneinander zu zwei 32-bit-Ergebnissen verknüpft werden. Ein irgendwie gearteter Übertrag zwischen den beiden Teilrechnungen findet nicht statt. Zu den Schiebe- und Transferoperationen kommen hier insbesondere die Addition und die Subtraktion sowie die Vergleichsoperationen "gleich" (equal) und "größer" (greater) hinzu.
- Die dritte Betriebsart (s. Bild 2.4-10c) wirkt auf vier Paare von 16-bit-Wörtern (Words - W). Zusätzlich zu den Operationen der letztgenannten Betriebsart kann hier eine Multiplikation (16x16® 16 bit) durchgeführt werden, wobei vom Ergebnis wahlweise die höher- oder niederwertigen 16 bit genommen werden. Die weiß eingezeichnete Verbindung zwischen jeweils zwei Teil-ALUs kennzeichnet eine komplexe Operation, bei der die beteiligten Teil-ALUs jeweils eine 16x16-bit-Multiplikation ausführen und ihre 32-bit-Produkte zu einem 32-bit-Gesamtergebnis addieren. Diese Operation ist im Bild 2.4-11 skizziert.

  Bild 2.4-11: Gepackte Multiplikation mit doppelt-genauem Ergebnis

- In der letzten Betriebsart nach Bild 2.4-10d) werden acht Byte-Paare (Byte - B) als Operanden eingesetzt und ein Ergebnis aus ebenfalls 8 Bytes berechnet. Als Operationen können die Addition, Subtraktion und die Vergleichsoperationen (s.o.) angewendet werden.

An dieser Stelle sei noch einmal darauf hingewiesen, daß MMX-Rechenwerke meist spezielle Befehle für die Addition und Subtraktion von gepackten Daten ohne bzw. mit Sättigung der Ergebnisse zur Verfügung stellen (vgl. Abschnitt 2.4.1.4). Im Bild 2.4-12 sind Beispiele für die parallele Addition zweier gepackter Operanden aus 16-bit-Wörtern dargestellt, im Bild 2.4-12a) wird mit Wrap-around gearbeitet, im Bild 2.4-12b) mit Sättigung von vorzeichenlosen Zahlen, im Bild 2.4-12c) mit Sättigung von vorzeichenbehafteten Zahlen.

Bild 2.4-12: Beispiele für die Addition mit Wrap-around und Sättigung

Im Bild 2.4-13 ist eine parallele Vergleichsoperation auf "größer" mit gepackten Operanden aus 16-bit-Wörtern dargestellt. Die Operation setzt vorzeichenlose ganze Zahlen voraus. Das Ergebnis "wahr" (true) wird hier durch den Wert $F..F, das Ergebnis "falsch" (false) durch den Wert $0..0 angegeben. Diese Wahl der Ergebniswerte ermöglicht es, durch Maskierung der Operanden mit Hilfe des Ergebnisses und der logischen Verknüpfungen die jeweils größeren oder kleineren Eingabewerte zu selektieren.

Bild 2.4-13: Parallele Vergleichsoperation mit 16-bit-Wörtern

Neben den beschriebenen Operationen existieren noch einige weitere, die das Zusammensetzen von kurzen zu längeren Operanden (Packen - Packing) und das Zerlegen von langen Operanden in kürzere gestatten. Im Abschnitt 3.2 werden wir MMX-Befehlssätze ausführlicher beschreiben.

2.4.5.2 Gleitpunkt-Rechenwerke für Multimedia

Bei modernen x86-kompatiblen Prozessoren, wie dem Pentium III von Intel oder dem K6/K7 von AMD, wurde die Verarbeitungsweise der eben beschriebenen skalierbaren Integer-Rechenwerke auf die Behandlung von Gleitpunktzahlen übertragen. Dazu wurden sie mit Gleitpunkt-Arithmetikeinheiten ausgestattet, die - analog zur Darstellung in den Bildern 2.4-12b) und c) - zwei oder vier gepackte Gleitpunktzahlen gleichzeitig verarbeiten können. Diese Zahlen liegen im 32-bit-Format des IEEE-754-Standards vor und können in speziellen Registern der Rechenwerke abgelegt werden. Die AMD-Prozessoren packen zwei Gleitpunktzahlen und benutzen zur Ablage die gleichen acht 64-bit-Register wie die MMX-Einheiten (s. Abschnitt 2.6). Der Pentium III hingegen besitzt acht getrennte 128-bit-Register, in die er jeweils vier Gleitpunktzahlen packen kann. Von AMD werden die beschriebenen Rechenwerke und ihre Operationen mit dem Begriff 3Dnow! bezeichnet und dadurch schon ein Hinweis auf eine der Hauptanwendungen gegeben, die im Bereich der 3-dimensionalen Graphik-Darstellungen liegen. Intel hingegen verwendet die Bezeichnung ISSE, was für Internet Streaming SIMD Extension steht und auf die Bedeutung der Technik für die Verarbeitung von kontinuierlich fließenden Daten im Internet hinweist. Weitere Anwendungen kommen aus dem weiten Bereich der digitalen Signalverarbeitung.
Der Vorrat an Operationen, die ein Multimedia-Gleitpunkt-Rechenwerk mit gepackten Daten ausführen kann, umfaßt die arithmetischen Operationen Addition, Subtraktion, Multiplikation und Division sowie die bitweise ausgeführten logischen Verknüpfungen Und, Oder, Antivalenz, Inversion und manchmal auch die negierte Und-Verknüpgung (NAND). Dazu kommt meist die Operation Quadratwurzel-Ziehen (Square Root). Z.T. wird für die Division und das Wurzelziehen nur der erste Iterationsschritt durchgeführt. Je nach gewünschter Genauigkeit müssen die weiteren Stellen danach in einer Schleife berechnet werden. Die Operationen "Mittelwertbildung", "Ermittlung des Maximums" bzw. "Ermittlung des Minimums", die Vergleiche auf '=0', '> 0', '< 0' werden jeweils elementeweise auf einem Paar von gepackten Daten ausgeführt. Daneben wird eine Reihe von Operationen unterstützt, die dem Transport der Daten, dem Packen bzw. Entpacken von Daten, dem Vertauschen der gepackten Zahlen sowie der Konversion der Daten zwischen den Darstellungen als Integer- oder Gleitpunkt-Zahlen dienen. Auf die Befehle eines Multimedia-Gleitpunkt-Rechenwerks werden wir im Abschnitt 3.2 näher eingehen.

| Inhaltsverzeichnis
|  | Übersicht Kapitel 2
2.3 Unterbrechungsbehandlung |  | 2.5 Das Adreßwerk