-
Die
vorliegende Erfindung betrifft ein Computersystem zum bedingten
Ausführen
von Befehlen, eine Ausführungseinheit
zur Verwendung in dem Computersystem sowie Verfahren zum Ausführen von
Befehlen.
-
Es
sind Computersysteme bekannt, bei denen die Ausführung eines Befehls auf einen
Wert hin, der in dem Befehl identifiziert oder adressiert wird,
mit "predicated"-Anweisungen implementiert
wird (im folgenden "prädikatieren" genannt). Es sind
auch Computersysteme bekannt, die auf sogenannte gepackte Operanden ansprechen.
Das bedeutet, jeder Operand umfasst eine Vielzahl von gepackten
Objekten, die an entsprechenden Stellen ("Lanes")des Operanden enthalten sind. Der Packungsgrad
kann variieren, und für
64-Bit-Operanden werden bekanntermaßen Byte-Packungen (acht Objekte pro 64-Bit-Operand),
Halbwort-Packungen (vier Objekte pro 64-Bit-Operand) und Wort-Packungen
(zwei Objekte pro 64-Bit-Operand) vorgesehen. Bei bestehenden Computersystemen
bewirkt das Prädikatieren
("Predication") dann, wenn die
Befehle, die solche gepackten Operanden definieren, prädikatiert
werden, entweder, dass die Operation mit allen Operanden durchgeführt wird
oder dass diese überhaupt
nicht ausgeführt
wird. Darüber
hinaus werden Bedingungswerte in Abhängigkeit von den Ergebnissen
der Operation eines Befehls eingestellt. Bei dem System, das in
der
GB 2 317 466 beschrieben
wird, setzt zum Beispiel eine arithmetische Logikeinheit Bedingungscode-Flags
in Abhängigkeit
von dem Ergebnis einer Operation.
-
Es
gibt auch Computersysteme, bei denen ein Befehl einen speziellen
Test durchführt
(z.B. Größer-als-Vergleich)
und ein einzelnes Bit für
das Ergebnis wahr/falsch setzt. Derartige Befehle können bei
gepackten Objekten implementiert werden. Zum Beispiel vergleichen
die gepackten Vergleichsbefehle in der Intel MMX-Maschine die entsprechenden
Datenobjekte in den Quell- und Zieloperanden jeweils bezüglich Gleichheit
oder einem Größer-als-Wert
und erzeugen eine Maske von Einsen oder Nullen, die in den Zieloperand geschrieben
werden. Logische Operationen können
die Maske verwenden, um Elemente auszuwählen. Es gibt nur eine kleine
Gruppe derartiger Befehle, und diese Befehle haben immer den Nebeneffekt,
dass sie Wahr/Falsch-Flags setzen.
-
Gemäß einer
Ausführungsform
der Erfindung ist ein Verfahren zum Ausführen von Behlen in einem Computersystem
mit Operanden vorgesehen, die eine Vielzahl von gepackten Objekten
an jeweiligen Stellen des Operanden enthalten, wobei jeder Befehl
eine Operation definiert und einen Bedingungseinstellungsindikator
enthält,
der unabhängig
von der Operation eingestellt werden kann, wobei das Verfahren umfasst:
Bestimmen des Status des Bedingungseinstellungsindikators und, wenn
der Bedingungseinstellungsindikator eingestellt ist, Durchführen einer
in dem Befehl spezifizierten Operation an jeder Stelle des Operanden
und Erzeugen eines Satzes von Multibit-Bedingungscodes in Abhängigkeit
von den Ergebnissen der Durchführung der
Operation für
jede Stelle.
-
Die
Anordnung gemäß der Erfindung
sieht eine Anzahl von Vorteilen vor. In erster Linie sieht sie eine auswählbare Fähigkeit
vor, Bedingungscodes zusammen mit gewöhnlichen Operationen einstellen
zu können, die
in einem Befehl definiert sind. Der Bedingungseinstellungsindikator
bestimmt, ob Bedingungscodes eingestellt werden oder nicht.
-
Darüber hinaus
sind die Bedingungscodes vorzugsweise, aber nicht notwendigerweise,
Multibit-Bedingungscodes, die es erlauben, dass eine Anzahl von
unterschiedlichen Testbedingungen durch Folgebefehle ausgewertet
bzw. abgeschätzt
werden können.
-
Wenn
der Operand eine maximale Anzahl N von gepackten Objekten enthält, wird
ein Bedingungscode individuell für
jede Stelle erzeugt, wodurch jeder Satz von Bedingungscodes N Bedingungscodes
enthält.
-
Gemäß dem im
folgenden beschriebenen Ausführungsbeispiel
wird dann, wenn die Operanden weniger als die maximale Anzahl von
gepackten Objekten enthalten (z.B. Halbwort- oder Wort-Packungen),
für jede Stelle
des Operanden ein Bedingungscode erzeugt, und der Wert dieses Codes
wird verwendet, um zwei oder mehrere Bedingungscodes in dem Bedingungscodesatz
einzustellen, so dass sich in dem endgültigen Satz von Bedingungscodes
N (die größtmögliche Anzahl
von) Bedingungscodes befinden. Dadurch wird es möglich, dass Bedingungscodes
bei einem geringeren Packungsgrad eingestellt und von einem Operanden
mit einem höheren
Packungsgrad verwendet werden können.
In einem anderen Ausführungsbeispiel
wird pro Stelle des gepackten Operanden ein Bedingungscode eingestellt,
so dass die Anzahl der eingestellten Bedingungscodes vom Packungsgrad
abhängen.
-
Für ein Computersystem,
das erste und zweite Ausführungskanäle enthält, können jeweilige
Sätze von
Bedingungscodes für
jeden Ausführungskanal
erzeugt werden. Außerdem
kann der Zugriff auf einen Satz von Bedingungscodes, der einem der
Ausführungskanäle zugeordnet
ist, durch einen Befehl erfolgen, der in einem anderen der Ausführungskanäle ausgeführt wird.
-
Die
Erfindung erwägt
auch den Zugriff auf die Bedingungscodes in einem Folgebefehl, um
zu bestimmen, an welchen Stellen des Operanden die in diesem Folgebefehl
spezifizierte (angegebene) Operation ausgeführt werden soll.
-
Die
Erfindung sieht ein Verfahren zum Ausführen von Befehlen in einem
Computersystem mit Operanden vor, die eine Vielzahl von gepackten
Objekten an jeweiligen Stellen des Operanden enthalten, wobei die Anzahl
der gepackten Objekte in dem Operanden kleiner ist als die größtmögliche Anzahl
(N), wobei das Verfahren aufweist: Durchführen einer in dem Befehl spezifizierten
Operation an jeder Stelle des Operanden und Abschätzen (Auswerten)
von Bedingungscodewerten für
jede Stelle in Abhängigkeit
von den Ergebnissen der Durchführung
der Operation für
diese Stelle; Erzeugen eines Satzes von Bedingungscodes, der eine
Anzahl von Bedingungscodes enthält,
die der größtmöglichen
Anzahl von gepackten Objekten in einem Operanden entspricht, unter
Verwendung des für
jede Stelle des Operanden eingestellten Bedingungscodewertes, um zwei
oder mehrere Bedingungscodes in dem Satz von Bedingungscodes einzustellen;
und Zugreifen auf jeden der Sätze
von Bedingungscodes in einem Folgebefehl, der einen Operanden identifiziert,
der in höherem
Maße gepackt
ist als der Operand des ersten Befehls, um zu bestimmen, an welcher
Stelle des Operanden für
den Folgebefehl die in diesem Folgebefehl spezifizierte Operation
durchgeführt
werden soll, in Abhängigkeit
von den Ergebnissen des Vergleichs eines in dem Folgebefehl identifizierten
Testcodes mit dem erzeugten Satz von Bedingungscodes.
-
Eine
weitere Ausführungsform
der Erfindung sieht ein Computersystem vor mit: einem Programmspeicher,
der eine Befehlsfolge zur Ausführung
durch das Computersystem enthält,
wobei die Befehle einen ersten Befehl aufweisen, der wenigstens
einen Quelloperanden identifiziert, der eine Vielzahl von gepackten
Objekten an jeweiligen Stellen des Operanden enthält und ein
Bedingungseinstellungsfeld aufweist, das ein Bedingungseinstell-Flag
enthält,
sowie einen zweiten Befehl, der eine auszuführende Operation definiert
und ein Testfeld aufweist, das einen Testcode identifiziert; und
wenigstens einer Ausführungseinheit
zum Ausführen der
ersten und zweiten Befehle, wobei gemäß der Ausführung des ersten Befehls ein
Satz von Bedingungscodes erzeugt wird, in Abhängigkeit von den Ergebnissen
der Durchführung
der Operation für
jede Stelle des Operanden, wenn das Bedingungssatz-Flag eingestellt
bzw. gesetzt ist, und wobei bei der Ausführung des zweiten Befehls der
in dem Testfeld identifizierte Testcode mit den Bedingungscodes
verglichen wird, um zu bestimmen, an welchen Stellen des Operanden
die in dem zweiten Befehl spezifizierte Operation durchgeführt werden
soll.
-
Eine
weitere Ausführungsform
der Erfindung sieht ein Computerprogramm-Erzeugnis vor, das in ein Computersystem
geladen werden kann und das Programmcode-Einrichtungen aufweist,
die eine Befehlsfolge aufweisen, mit: einem ersten Befehl, der wenigstens
einen Quelloperanden identifiziert, der eine Vielzahl von gepackten
Objekten an jeweiligen Stellen des Operarden enthält und ein
Bedingungseinstellungsfeld aufweist, das ein Bedingungseinstell-Flag
enthält,
und einem zweiten Befehl, der eine durchzuführende Operation definiert
und ein Testfeld aufweist, das einen Testcode identifiziert, wobei,
wenn das Computerprogramm-Erzeugnis in ein Computersystem geladen
wird und das Bedingungseinstell-Flag gesetzt ist, die Ausführung des
ersten Befehls dazu führt,
dass ein Satz von Bedingungscodes erzeugt wird, in Abhängigkeit
von den Ergebnissen des Durchführens
der in dem ersten Befehl spezifizierten Operation für jede Stelle
des in dem ersten Befehl definierten Operanden; und der zweite Befehl
die in dem zweiten Befehl definierte Operation bedingt an einzelnen
Stellen des Operanden implementiert, in Abhängigkeit von den Ergebnissen
des Vergleichs des in dem zweiten Befehl identifizierten Testcodes
mit dem erzeugten Satz von Bedingungscodes.
-
Zum
besseren Verständnis
der vorliegenden Erfindung und zur Veranschaulichung, wie diese
ausgeführt
werden kann, wird nun beispielhalber auf die beigefügten Zeichnungen
Bezug genommen, in denen:
-
1 ein
schematisches Blockdiagramm ist, das einen Prozessor veranschaulicht;
-
2 ein
Diagramm ist, das die Codierung; von zwei "gepackten" Befehlen veranschaulicht;
-
3 eine
Anzahl von verschiedenen 32-Bit-Befehlsformaten veranschaulicht;
-
4 den
Inhalt eines Textregisters veranschaulicht;
-
5 den
Inhalt eines Bedingungscoderegisters veranschaulicht;
-
6 ein
Diagramm ist, das das Einstellen von Bedingungscodes veranschaulicht;
und
-
7 ein
Diagramm ist, das die Verwendung von Bedingungscodes veranschaulicht.
-
Das
hier beschriebene Computersystem ist schematisch in
1 veranschaulicht
und ist ein schematisches Diagramm des Systems. In
1 bezeichnet
das Bezugszeichen
2 einen Programmspeicher, der Programme
in Form einer Vielzahl von Befehlen enthält. Der Programmspeicher
2 ist
mit einem Befehlscache
3 verbunden, der mit einem Befehlsabruf-/Dekodierschaltkreis
4 verbunden
ist. Der Abruf-/Dekodierschaltkreis gibt Adressen an den Programmspeicher
aus und erhält
bei jeder Abrufoperation einen 64-Bit-Befehl von dem Programmspeicher
2 (oder
dem Cache
3). Jeder 64-Bit-Befehl kann zwei Operationen
oder eine einzelne Operation definieren. Die Dekodiereinheit
4 wertet
den Operationscode ("Opcode") aus und überträgt die geeigneten
Steuersignale entlang der X- und Y-Kanäle
5x ,
5y . Jeder Kanal umfasst eine SIMD-Ausführeinheit
8x ,
8Y , die
drei Datenverarbeitungseinheiten MAC, INT und FPU und eine Lade-/Speichereinheit
LSU
6 umfasst. Jede Datenverarbeitungseinheit MAC, INT
und FPU sowie die Lade-/Speichereinheiten LSU werden nach einem "Single Instruction
Multiple Data (SIMD)"-Prinzip
("Single Instruction
Multiple Data" =
Einzelbefehl/Mehrfachdaten) gemäß der in
dem Befehl ausgedrückten
SIMD-Stelle betrieben, und zwar gemäß dem nachfolgenden Protokoll,
das den Packungsgrad von Objekten für gepackte Datenverarbeitungsoperationen
definiert:
(B) | – 8-Bit-Objekte
(b0 ... b7) |
(H) | – 16-Bit-Objekte
(h0 .., h3) |
(W) | – 32-Bit-Objekte
(w0 ... w1) |
(L) | – 64-Bit-Objekte
(I) |
(S) | – 32-Bit-Gleitpunkt |
(D) | – 64-Bit-Gleitpunkt |
-
Bei
jedem Kanal 5x , 5y wird
dann, wenn der Befehl eine Datenverarbeitungsoperation definiert,
diese der geeigneten Datenverarbeitungseinheit MAC, INT oder FPU
zugeführt,
und wenn dieser eine Lade-/Speicheroperation definiert, wird sie
der Lade-/ Speichereinheit LSU zugeführt. Die Datenwerte werden
in die und aus den MAC-Datenverarbeitungseinheiten
in ein gemeinsames und aus einem gemeinsamen Registerfile 10 geladen,
das sechzehn 64-Bit-Spezialregister entlang den Registerzugriffspfaden 12x , 12y umfasst.
Die Datenwerte werden in die und aus den INT- und FPU-Datenverarbeitungseinheiten
und den Lade-/Speichereinheiten LSU in ein zweites und aus einem
zweiten Registerfile 11 geladen, das vierundsechzig 64-Bit-Mehrzweckregister
umfasst. Die Registerzugriffspfade 14x , 14y sind für diese Zugriffe vorgesehen.
Der Programmzähler
PC, der den aktuellen Befehl anzeigt, kann über eines der Mehrzweckregister
(das PC-Register) gelesen werden. Ein anderes der Mehrzweckregister
bildet ein Steuer- und Statusregister. Die Mehrzweckregister umfassen auch
ein Bedingungscoderegister (CCreg) und ein Testregister TSTreg,
die im folgenden noch genauer beschrieben werden.
-
Jeder
Registerzugriffspfad 12, 14 trägt drei Adressen von der Zugriffseinheit,
zwei Quelladressen SRC1, SRC2 und eine Zieladresse DST. Im Falle
von Datenverarbeitungsoperationen definieren die Quelladressen SRC1,
SRC2 Register in den Registerfiles 10, 11, die
Quelloperanden für
die Verarbeitung durch die Datenverarbeitungseinheit enthalten.
Die Zieladresse DST identifiziert ein Zielregister, in das ein Ergebnis
der Datenverarbeitung eingebracht wird. Die Operanden und Ergebnisse
werden zwischen den Registerfiles 10 oder 11 und
der jeweiligen Datenverarbeitungseinheit über die Zugriffspfade 12, 14 übertragen.
Im Falle von Lade-/Speicheroperationen
erlauben die Befehlsformate die Formulierung von Speicher-zugriffsadressen
Ax, Ay, aus den
Datenwerten, die in den Registern enthalten sind, wie dies in unserer
ebenfalls anhängigen
Anmeldung Nr. (PWF-Aktenzeichen: 92472) beschrieben ist, wie später beschrieben
wird. Die Lade-/Speichereinheiten greifen auf einen gemeinsamen
Adressraum in der Form eines Datenspeichers 16 über einen
Dual-Ported-Datencache DCACHE 15 zu. Zu diesem Zweck besitzt
jede Lade-/Speichereinheit einen 64-Bit-Datenbus Dx, Dy und einen
64-Bit-Adressbus Ax, Ay.
-
Die
Architektur unterstützt
zwei Arten von Befehlen, nämlich
sogenannte "lange
Befehle" und "Doppeloperations-Befehle". Jeder 64-Bit-Doppeloperations-Befehl definiert
zwei 31-Bit-Operationen in der Art und Weise, wie dies in 2 dargestellt
ist. Das heißt,
jede 64-Bit-Sequenz enthält
zwei 32-Bit-Befehlsabschnitte, die INST1 und INST2 genannt werden.
Jeder Befehl umfasst auch einen bestimmten Satz von Identifikationsbits,
die den Typ jeder Operation identifizieren. In 2 gibt
es an den Bit-Stellen 31 und 63 zwei solcher Bits, die in 2 ID1
und ID2 genannt sind. In diesem Ausführungsbeispiel sind die Operationen
in Datenverarbeitungs-(DP)-Typen oder Lade-/Speicher-(LD/ST)-Typen
unterteilt. Die erlaubten Kombinationen sind zwei Datenverarbeitungsoperationen
(ID1, ID2, beide auf "0" gesetzt), zwei Lade-/Speicheroperationen
(ID1, ID2, beide auf "1" gesetzt) oder eine
Datenverarbeitungs- und eine Lade-/Speicheroperation (ID1=0, ID2=1).
-
3 veranschaulicht
eine Anzahl von Basisformaten für
die 32-Bit-Datenverarbeitungsabschnitte
der Doppeloperations-Befehle. Jede 32-Bit-Operation benötigt zur
Ausführung
die Ressourcen einer Lade-/Speichereinheit oder eine oder mehrere
der SIMD-Datenverarbeitungseinheiten (MAC, INT, FPU). Somit können normalerweise
zwei 32-Bit-Operationen gleichzeitig ausgeführt werden, eine in jeweils
einem der X- oder Y-Kanäle.
Im folgenden wird auf die X- und Y-Kanäle manchmal als die rechte
und die linke Seite des Prozessors Bezug genommen.
-
Das
Format (1) definiert Register-Register-Operationen. Das Format (2)
definiert Register-Immediate-Operationen. Das Format (3) definiert
eine Speicherzugriffsoperation. Die Speicherzugriffsoperationen
werden hier nicht näher
erläutert,
aber es sei angemerkt, dass sie dazu verwendet werden, um Daten
aus dem Speicher in die Registerfiles zu laden und um Speicheroperationen
für den
umgekehrten Vorgang vorzusehen.
-
Die
Datenverarbeitungsbefehlsformate haben die folgenden Felder gemeinsam.
Es gibt drei Identifikationsbits, nämlich M (Bit 31) und G (Bits
29 und 30), die die An der Datenverarbeitungsoperation bezeichnen. Ein
Operationscode-Feld (Bits 22 bis 28), das die Art der auszuführenden
Operation definiert, ein Bedingungseinstellungsfeld S (Bit 21),
ein Testregisterfeld (Bits 18 bis 20) und Felder, die zwei Quellregister
Src1, Src2 und ein Zielregister Dst definieren. Natürlich umfasst
das Format (2) nicht ein Feld, das ein zweites Quellregister identifiziert,
sondern enthält
stattdessen einen Immediate-Wert. Wie oben erwähnt ist, können die Register in den Registerfiles 10, 11 eine
Anzahl von gepackten Objekten enthalten, und in diesem Fall wird
die Operation, die in dem Operationscode des Befehls definiert ist,
normalerweise an jeder "Stelle" des Operanden ausgeführt, das
heißt,
bei jedem Paar von entsprechenden gepackten Objekten in jeweiligen
Quellregistern Src1, Src2 oder Quellregister und Immediate-Wert,
je nachdem, wie der Fall liegt.
-
Wie
oben erwähnt
wurde, umfassen die Mehrzweckregister 11 CC-Register und
Testregister. Das Testregister enthält eine Vielzahl von Test-Bytes,
wobei jedes Byte ein Format wie in 4 aufweist
und das niedrigstwertige Byte auf Null gesetzt ist. Auf jedes dieser
Bytes wird als ein Treg-Byte [1...7] Bezug genommen. Die Treg-Bytes
sind programmierbar und werden vor der Befehlsausführung auf
die benötigten
Werte eingestellt. Das Testregister wird dazu benutzt, die bedingte
Ausführung
der Befehle zu erlauben. Jedes Befehlsformat enthält ein 3-Bit-TST-Feld,
das die Spezifizierung eines Treg-Byte [1 bis 7] erlaubt. Wenn ein Treg-Byte
in dem Befehl nicht spezifiziert wird, wird das TST-Feld in dem
Operationscode auf 0 gesetzt, und der Befehl wird unbedingt ausgeführt. Ein
spezifiziertes Byte kann unter Verwendung eines ADL-Befehls vom Format
(2) modifiziert werden, der einen Byte-Wert, der in dem Immediate-Feld angegeben
ist, zu einer spezifizierten SIMD-Stelle hinzufügt, die in dem TST-Feld (Treg-Byte
[1...7]) definiert ist.
-
Das
8 Bit-Feld jedes Treg ist derart, wie es in 4 gezeigt
ist.
-
Das
Bedingungsfeld (Bits 0 bis 3) gilt für alle prädikatierten Befehle (predicated
instructions). Es enthält einen
4-Bit-Testcode, um zu erlauben, dass die Bedingungen getestet werden
können.
Wie an späterer
Stelle noch genauer erläutert
wird, gilt die Bedingung für
Befehle bei gepackten Objekten für
alle Stellen auf einer Pro-Stelle-Basis.
-
Die
vier Bedingungsflags sind:
- • N (Negativ-Flag -- Bit 3)
- • Z
(Zero-Flag -- Bit 2)
- • C
(Carry-Flag -- Bit 1)
- • V
(Überlauf-Flag
-- Bit 0)
-
Diese
vier Bits bewirken 16 Testbedingungen (siehe Tabelle 1).
-
-
Das
CC-Selektorfeld (Bits 4 bis 6) gilt nur für Befehle bei ungepackten Objekten.
Das CC-Selektorfeld bezeichnet den Bedingungscode (in dem CC-Register,
Erläuterungen
siehe unten), der mit dem Code in dem Treg-Byte verglichen werden
soll.
-
In
dem beschriebenen Ausführungsbeispiel
gilt das Seitenfeld (S-Bit 7, X=0, Y=1) nur für Nicht-SIMD-64-Bit-Befehle.
Für 32-Bit-Operationen
wird die Seite gemäß dem Kanal
entschieden, in dem der Befehl ausgeführt wird, ungeachtet dessen,
auf was das Seitenfeld eingestellt ist. Für Nicht-SIMD-64-Bit-Befehle
bestimmt das Seitenfeld entweder linke oder rechte (X- oder Y-)
Bedingungscodes in dem CC-Register.
-
Das
Bedingungscoderegister ist 64 Bits lang und die Bitfelder werden
in 5 definiert. Jeder Bedingungscode ist vier Bits
lang (ein Halbbyte ("Nibble")).
-
Jedes
CC{X,Y}{0..7}-Halbbyte weist die vier Bedingungs-Flags (NZCV) in
dieser Reihenfolge auf. Die Bedingungscodes können auf einer Pro-Stelle-Basis
eingestellt und benutzt werden.
-
SIMD-Byte-(B)-Operationen
aktualisieren 8 Bedingungscodes, X oder Y, in Abhängigkeit
von der Seite der Maschine.
CC{X,Y}0...CC{X,Y}7
-
SIMD-Halbwort-(H)-Operationen
aktualisieren vier Paare von Bedingungscodes wie folgt (wiederum
in Abhängigkeit
von den Seiten der Maschine). Das heißt, zwei Bedingungscodes werden
mit dem gleichen Wert für
jede Operation aktualisiert.
CCX0=CCX1 | CCY0=CCY1 |
CCX2=CCS3 | CCY2=CCY3 |
CCX4=CCX5 | CCY4=CCY5 |
CCX6=CCX7 | CCT6=CCY7 |
-
SIMD-Wort-(W)-Operationen
aktualisieren zweimal vier Bedingungscodes wie folgt (in Abhängigkeit von
der Seite der Maschine). Das heißt, vier Bedingungsflags werden
auf den gleichen Wert für
jede Operation aktualisiert.
CCX0=CCX1=CCX2=CCX3 | CCY0=CCY1=CCY2=CCY3 |
CCX4=CCX5=CCX6=CCX7 | CCY4=CCY5=CCY6=CCY7 |
-
SIMD-Langwort-(L)-Operationen
aktualisieren alle acht Bedingungscodes wie folgt (in Abhängigkeit von
der Seite der Maschine).
CCX0=CCX1=CCX2=CCX3=CCX4=CCX5=CCX6=CCX7
CCY0=CCY1=CCY2=CCY3=CCY4=CCY5=CCY6=CCY7
-
Im
folgenden wird nun die Verwendung des Testregisters und des Bedingungscoderegisters
unter Bezugnahme auf die nachfolgenden Beispiele beschrieben. Es
ist selbstverständlich,
dass die nachfolgenden Erläuterungen
Beispiele sind, die lediglich zur Veranschaulichung der Prinzipien
der Operation verwendet werden.
-
Es
wird nun die arithmetische Operation ADD betrachtet. Dieser Befehl
kann in einem Register-zu-Register-Format unter Verwendung von Format
(1) in 3, oder in einer Register-zu-Immediate-Format
unter Verwendung von Format (2) von 3 implementiert
werden. Nur das Register-zu-Register-Format wird nachfolgend genauer
beschrieben, um die Prinzipien der Verwendung der Testregister und
des Bedingungscoderegisters zu veranschaulichen.
-
Der
Befehl ADD hat die folgende Semantik:
ADD{B|H|W|L}{S}{Treg}
Dest, Src1, Src2.
-
Wenn
man das Format (1) in 3 betrachtet, so definiert dieser
Befehl zwei Quellregister in den Feldern SRC1 und SRC2, wobei jedes
Quellregister Operanden für
die Additionsoperation enthält.
Wenn der Befehl ADDL ist, sind die Register nicht gepackt, sondern
jeder enthält
ein 64-Bit-Objekt. Für
die ADDB-, ADDH- und ADDW-Befehle enthält jedes Quellregister eine
Anzahl von gepackten Objekten gemäß dem früher definierten Packungsgrad.
Im folgenden Beispiel wird angenommen, dass jedes Quellregister
acht gepackte Objekte b0 ... b7 enthält. Ein Zielregister DST wird
in dem DST-Feld des Befehls definiert, um das Ergebnis der Additionsoperation
zu enthalten. In dem Zielregister werden acht gepackte Objekte generiert.
Unter den gegebenen Umständen
sei angenommen, dass eine einzelne 32-Bit-Operation durch einen Kanal(X oder
Y) des Prozessors bewirkt wird.
-
6 veranschaulicht
ein Diagramm einer der Funktionseinheiten, die in der Lage ist,
den ADD-Befehl auszuführen.
Ein erster und ein zweiter Bitpuffer 40, 42 sind
vorgesehen, um den ersten und den zweiten Quelloperanden zu enthalten.
In dem veranschaulichten Beispiel enthalten die Quelloperanden in
jedem Fall acht gepackte Objekte b0 bis
b7. Die Additionsschaltung 44 umfasst
acht Operatoren, in diesem Fall Additionsschaltkreise, von denen
jeder angeschlossen ist, um jeweils zwei gepackte Objekte von der
gleichen Stelle b0 ... b7 der
Eingabe-Puffer 40, 42 zu erhalten. Nur die Verbindungen
des ersten und des letzten Objekts sind gezeigt. Ähnliche
Verbindungen gelten für
jede der anderen Additionsschaltkreise. Ein Ausgabe-Puffer 46 enthält das Ergebnis,
das in ähnlicher
Weise in der Form von acht gepackten Objekten zum Laden in das Zielregister vorliegt,
das im Befehl spezifiziert ist. Ein Bedingungscodegenerator 48 untersucht
auch die Ergebnisse jeder Addition und erzeugt Bedingungscodes für die Seite
der Maschine, auf der der Befehl ausgeführt wird, die in dem Bedingungscoderegister
CCreg gehalten werden sollen. Der Bedingungsgenerator 48 erzeugt
immer acht Bedingungscodes für
jede Seite der Maschine, ungeachtet des Packungsgrades der Quelloperanden,
wie nachfolgend noch genauer beschrieben werden wird.
-
Das
Befehlsformat (1) enthält
ein S-Flag (Bit 21). Wenn dieses Flag gesetzt ist, dann werden die
Bedingungscodes für
die Seite der Maschine eingestellt, auf der der Befehl ausgeführt werden
soll. Bei diesem Beispiel wird angenommen, dass der Befehl auf der
X-Seite der Maschine ausgeführt
wird. Der Bedingungscodegenerator 48 generiert Bedingungscodes
CCX0 bis CCX7, indem er die Ergebnisse der Additionsoperationen
berücksichtigt,
die für
jedes gepackte Objekt in den Quellregistern durchgeführt wurden,
und bestimmt aus diesen Operationen die Werte von N, Z, C und V,
welche diejenigen Bits sind, die jeden Bedingungscode definieren.
In dem Beispiel von 6 kann für jede Bedingungscodestelle
CCX0 ... CCX7 in dem Bedingungscoderegister ein anderer Bedingungscode
generiert werden. Bedingungscodes werden folgendermaßen eingestellt.
Das N-Flag des Bedingungscodes wird gesetzt, wenn das Ergebnis negativ
ist, das heißt,
das höchste Bit
wird gesetzt (Ereignis für
vorzeichenlose Eingaben). Das Z-Flag wird gesetzt, wenn das Ergebnis
Null ist. Das C-Flag wird gesetzt, wenn die Operation einen Ausgabeübertrag
erzeugt hat. Das V-Flag wird gesetzt, wenn es bei der Operation
zu einem Bereichsüberlauf
gekommen ist, bevor es zum Abschneiden des höchstwertigen Bits ("wrap") oder einer Sättigung
("saturation") gekommen ist.
-
Wenn
das S-Flag in dem Befehl nicht gesetzt wird, wird das Bedingungsregister
nicht aktualisiert.
-
Für die obige
Erklärung
wurde angenommen, dass die Additionsoperation durchgeführt wurde.
Es ist möglich,
den ADD-Befehl selber auf Bedingungscodes hin zu prädikatieren,
die von einem früheren
Befehl oder einer früheren
Befehlsfolge gesetzt wurden. Zu diesem Zweck enthält das Befehlsformat
ein Testregisterfeld TST (Bits 18 bis 20). Diese drei Bits erlauben
es, dass eines der Testregister-Bytes Treg (1..7) adressiert wird.
Wenn ein Testregister-Byte in dem TST-Feld des Befehls spezifiziert
wird, dann wird jeder Bedingungscode auf der Seite der Maschine,
auf der der Befehl ausgeführt
wird, im Verhältnis
zu dem Bedingungscode überprüft, der
in dem adressierten Treg-Byte spezifiziert ist. Wenn das TST-Feld
auf Null gesetzt ist, derart, dass kein Treg-Byte spezifiziert wird,
dann wird der Befehl immer ausgeführt.
-
Nach
dem Vergleich des in dem adressierten Treg-Byte spezifizierten Testcodes
mit jedem der Bedingungscodes CCX0 ... CCX7 (unter der Annahme,
dass die Operation auf der X-Seite der Maschine ausgeführt wird),
wird die spezifizierte Operation an den SIMD-Stellen ausgeführt, bei
denen Übereinstimmung
vorliegt, und wird an den SIMD-Stellen, bei denen keine Übereinstimmung
vorliegt, nicht ausgeführt.
Ein Beispiel ist in 7 veranschaulicht. Es wird angenommen,
dass die in 6 veranschaulichte und oben
beschriebene Operation durchgeführt
worden ist, und dass die Bedingungscodes CCX0 bis CCX7 wie oben
beschrieben in Abhängigkeit
von den Ergebnissen der arithmetischen Operationen an jeder der
SIMD-Stellen b0 ... b7 eingestellt
worden sind. Für
dieses Beispiel wird angenommen, dass die Bedingungscodes folgendermaßen lauten: b0 0010, b1 0101,
b2 0011, b3 0010,
b4 0010, b5 0100.
Dies ist in dem Bedingungscoderegister in 7 veranschaulicht.
Es soll auch angenommen werden, dass das adressierte Testregister-Byte
in dem TST-Feld des Befehls den Bedingungscode 0011 enthält. Dies
bezeichnet die Bedingung "Übertrag
gesetzt C". Die SIMD-Stellen
b0,b2,b3,b4 erfüllen
diese Bedingung. Es sei auch angenommen, dass die nachfolgende Operation,
die ausgeführt
werden soll, ebenfalls ein ADD-Befehl ist, der bei byteweise gepackten
Inhalten von zwei Quell registern SRC1, SRC2 verarbeitet wird, wobei
die Ergebnisse in ein Zielregister DST geladen werden sollen. Da
ein Testregister-Byte spezifiziert worden ist, wird die Additionsoperation
nur an den SIMD-Stellen bewirkt, an denen der Bedingungscode, der
für diese
Stelle (CCX0 ... CCX7) eingestellt worden ist, die Bedingung erfüllt, die
von dem Testcode definiert wird, der in dem adressierten Treg-Byte
eingestellt ist. Dies wird von einem Bedingungscode-Prüfprogramm 50 festgestellt.
Die Ausgabe des Bedingungscode-Prüfprogramms 50 steuert
einen Satz von Schaltern 52, nämlich jeweils einen für jede SIMD-Stelle
b0 ... b7. Diese
Schalter sind für
die Steuerung zuständig,
ob die Ergebnisse der Additionsoperation, die in dem Befehl dargestellt
ist, die Werte an der entsprechenden Stelle in dem Zielregister
DST aktualisieren oder nicht. Dies ist in Form eines Diagramms in 7 dargestellt,
wobei ein Kreuz veranschaulicht, dass das Ergebnis der Additionsoperation nicht
in das Zielregister geladen wird, und ein durchgehender Pfeil veranschaulicht,
dass das Ergebnis doch in das Zielregister geladen wird. Dies ist
in dem Zielregister dadurch gekennzeichnet, dass DST ein Original-Byte
in dem Zielregister kennzeichnet (das heißt, vor der Ausführung des
Befehls), und dass RES ein Ergebnis-Byte kennzeichnet, das ein Ergebnis
der arithmetischen Operation an dieser Stelle nach der Ausführung des
Befehls ist.
-
Wie
oben erwähnt
ist, sind dann, wenn ein Befehl bei weniger dicht gepackten Objekten
ausgeführt werden
soll, zum Beispiel H oder W, noch acht Bedingungscodes eingestellt,
paarweise oder zu viert, wie oben erwähnt ist. Es sei zum Beispiel
angenommen, dass eine Operation bei Halbwort-gepackten Objekten
h0 ... h3 ausgeführt wird.
Der Bedingungsgenerator 48 bestimmt die Bedingungscodewerte
durch Setzen der N-, C-, Z- und V-Flags wie oben für jede SIMD-Stelle.
Somit werden vier Bedingungscodewerte generiert. Diese werden dazu
benutzt, acht Bedingungscodes in dem Bedingungscoderegister als
Bedingungscodepaare einzustellen, wie oben erwähnt ist. Wenn die Bedingungscodes
in dem Bedingungscoderegister einmal gesetzt sind, können sie
in Folgebefehlen benutzt werden, die auf jeden Packungsgrad ansprechen.
Bei Halbwort-gepackten Objekten wird der erste Bedingungscode CCX0
und jeder andere Bedingungscode danach im Verhältnis zu dem Testcode in dem
adressierten Treg-Byte überprüft, um zu
bestimmen, ob der Befehl an dieser SIMD-Stelle ausgeführt wird oder nicht. Bei Wort-gepackten
Objekten werden der erste Bedingungscode und der vierte Bedingungscode
im Verhältnis
zu dem Testcode in dem adressierten Treg-Byte überprüft, um zu bestimmen, ob die Operation
an dieser SIMD-Stelle ausgeführt
werden soll oder nicht.
-
Bei
Langwort-Operationen wird der erste Bedingungscode CCX0 ausgewertet.
Wie oben beschrieben worden ist, wird für alle Bedingungscodes für eine Seite
der Maschine der gleiche Wert eingestellt.
-
Bei
Nicht-SIMD-Befehlen, das heißt
Befehlen, bei denen die Operanden nicht gepackt sind, können die
Bedingungscodes immer noch dazu verwendet werden zu bestimmen, ob
der Befehl ausgeführt
wird oder nicht. In diesem Fall identifiziert das TST-Feld des Befehls
wiederum ein Treg-Byte. Der Bedingungsselektor in dem Treg-Byte
identifiziert einen Bedingungscode, der sich auf der rechten oder
linken Seite befinden kann. Das Seitenbit S bezeichnet die entsprechende
Seite der Maschine (X oder Y). Das heißt, jeder Bedingungscode der
sechzehn Bedingungscodes CCX0 ... CCX7, CCY0 ... CCY7 kann von dem
Bedingungsselektor identifiziert werden. Der Code, der in den Bedingungsbits
0 bis 3 des Treg-Bytes enthalten ist, wird dann im Verhältnis zu
dem ausgewählten
Bedingungscode getestet, um zu bestimmen, ob der Befehl ausgeführt wird
oder nicht. Wenn die Testbedingung erfüllt ist, wird der Befehl ausgeführt. Wenn
nicht, dann wird der Befehl nicht ausgeführt.
-
Aus
der obigen Beschreibung wird es klar, dass, obwohl der Prozessor
eine rechte und eine linke Seite (X- und Y-Kanäle) aufweist, auf das Bedingungscoderegister
von beiden Seiten zugegriffen werden kann. Bei 32-Bit-Operationen
werden die Bedingungscodes gemäß der Seite
des Prozessors, die die 32-Bit-Operation tatsächlich verarbeitet, eingestellt
und erfolgt der Zugriff auf diese gemäß dieser Seite. Somit aktualisieren 32-Bit-Operationen,
die in dem X-Kanal 5X verarbeitet werden, die Bedingungscodes für den X-Kanal
CCX0 ... CCX7, und sie werden nur bei den X-Kanal-Codes CCX0 ...
CCX7 bedingt ausgeführt.
In ähnlicher
Weise erfolgt dies bei den 32-Bit-Operationen, die in dem Y-Kanal
5Y ausgeführt
werden. Aber 64-Bit-Operationen besitzen
eine größere Flexibilität. 64-Bit-Befehle
umfassen auch ein TST-Feld für
den Zugriff auf ein Treg-Byte in einer Weise, die der ähnlich ist,
die oben für
die 32-Bit-Operationen beschrieben wurde. In diesem Fall bestimmt
das Seitenfeld S in dem Treg-Byte, auf das zugegriffen wurde, welche
Bedingungscodes (X oder Y) benutzt werden. Das heißt, das
Seitenfeld S bestimmt sowohl, welche Bedingungscodes gemäß einem 64-Bit-Befehl,
der ausgeführt
wird, eingestellt werden, als auch auf welche Bedingungscodes (X
oder Y) die Operation des 64-Bit- Befehls
hin prädikatiert
wird. Dadurch werden die Optionen, die bei der Ausführung von 64-Bit-Befehlen
zur Verfügung
stehen, beträchtlich
erhöht.
-
Es
ist selbstverständlich,
dass eine Anzahl von Variationen zu dem oben beschriebenen Ausführungsbeispiel
möglich
sind. Zum Beispiel kann das Seitenbit S in dem Treg-Byte immer dazu
benutzt werden, den benötigten
Satz von Bedingungscodes (X oder Y zu bezeichnen, und nicht nur
bei Nicht-SIMD-64-Bit-Befehlen, wie dies oben erwähnt ist.
Es besteht auch keine Notwendigkeit für ein spezielles Bedingungseinstell-Flag S
in dem Befehl – ob
Bedingungscodes eingestellt werden sollen oder nicht, kann in dem
Operationscode definiert werden, oder die Befehlssemantik kann derart
sein, dass Bedingungscodes immer eingestellt werden.
-
Unter
Berücksichtigung
von 7 ist es möglich,
eine bedingte Ausführung
Stelle für
Stelle auf verschiedene Arten und Weisen zu implementieren. Eine
andere Alternative zu der oben Beschriebenen würde darin liegen, die Operation
(und das Aktivieren der jeweiligen Operatoren) nur dann durchzuführen, wenn
die Testbedingung für
diese Stelle erfüllt
ist.