-
1. Gebiet
der Erfindung
-
Die
vorliegende Erfindung betrifft eine Programmkonvertierungs-Vorrichtung
zum Generieren eines ausführbaren
Codes für
einen VLIW-Prozessor durch Übersetzen,
Verknüpfen
und Bearbeiten eines Quellprogramms, das in einer höheren Programmiersprache
geschrieben ist, und ein Aufzeichnungsmedium. Insbesondere betriftt
die Erfindung eine Technik zum Unterteilen von Befehlen mit Konstanten
in einem Quellprogramm in Teile und zum Ausführen einer parallelen Ablaufsteuerung
für die
unterteilten Befehle.
-
2. Stand der
Technik
-
VLIW-
(Very Long Instruction Word, sehr langes Befehlswort) Prozessoren
enthalten eine Vielzahl von Operationseinheiten, die eine Vielzahl
von Operationen, die in jedem VLIW angeordnet sind, parallel ausführen. VLIWs
werden von Programmkonvertierungs-Vorrichtungen generiert, nämlich Kompilierern,
die eine Parallelität
in Quellprogrammen auf Operationsebene erkennen und eine Ablaufsteuerung
für die
Quellprogramme durchführen.
-
VLIWs
sind jedoch Befehle mit fester Länge und
sind daher als Code ineffizient. Das heißt, es ist in vielen Fällen notwendig,
redundante Codes, wie beispielsweise Nulloperations-Codes ("nop"-Codes), in VLIWs
einzufügen.
VLIW-Prozessoren, die das Auftreten von redundanten Bereichen in
VLIWs vermeiden, werden in den japanischen Patentanmeldungen H09-159058
und H9-159059 des gleichen Anmelders wie für diese Anmeldung offenbart.
-
Jeder
dieser VLIW-Prozessoren enthält
einen speziellen Konstantenpuffer und eine Funktion zum Ausführen eines
Pogramms, in dem eine Konstante, die in jedem Befehl enthalten ist,
so, wie sie ist, extrahiert oder extrahiert und in mehrere Teil-Codeelemente
(partial digits) unterteilt und in verschiedenen VLIWs angeordnet
wird. In dieser Spezifi kation beschreibt der Begriff "unterteilte Konstanten" diese unterteilten
Teile einer Konstante oder gelegentlich ganze Konstanten. Jeder
VLIW-Prozess führt dieses
Programm aus, indem unterteilte Konstanten in dem Konstantenpuffer
(in einer Codeelement-Richtung) gesammelt werden, um die ursprüngliche
Konstante zu rekonstruieren, und wobei die rekonstruierte ursprüngliche
Konstante als ein Sprungziel oder ein Operand verwendet wird. Es
ist zu beachten, dass ein VLIW-Prozessor mit dieser Funktion im
folgenden als ein "konstantenrekonstruierender
VLIW-Prozessor" bezeichnet
wird. Ein Kompilierer für
den konstantenrekonstruierenden VLIW-Prozessor unterteilt lange
Konstanten in einem Programm in unterteilte Konstanten und füllt redundante
Bereiche in den Befehlen mit den unterteilten Konstanten, wodurch
die Code-Effizienz des Programms verbessert wird.
-
Es
wurde jedoch noch kein Kompilierer vorgeschlagen, der für den konstantenrekonstruierenden
VLIW-Prozessor geeignet ist.
-
Dieser
Kompilierer muss lange Konstanten in einem Programm in unterteilte
Konstanten teilen und die unterteilten Konstanten in entsprechender Weise
anordnen und die unterteilten Konstanten in entsprechender Weise
in einer Vielzahl von VLIWs anordnen. Dadurch generiert der Kompilierer
einen ausführbaren
Code. Dies reduziert redundante Bereiche in Befehlen. Diese Funktion
muss sicherstellen, dass jede ursprüngliche Konstante korrekt aus
den unterteilten Konstanten, die in der Vielzahl von VLIWs angeordnet
sind, rekonstruiert und definitiv von dem beabsichtigten Befehl
verwendet wird.
-
US-A-5
423 012 offenbart einen Mikrocomputer, der Befehlswörter mit
einer einheitlichen Wortlänge
verwendet, in dem ein erstes oder zweites Befehlswort, das in einem
Speicherbereich gespeichert wird, der durch eine Adresse eines Adressenregisters
angegeben wird, in einer vorgegebenen Wortposition eines Befehls-Erstlesepuffers
(instruction first-reading buffer) gelesen wird, der durch eine
erste Verweisadresse angegeben wird, oder das erste oder zweite
Befehlswort, das von einer Wortposition des Befehls-Erstlesepuffers
gelesen wird, der durch eine zweite Verweisadresse angegeben wird,
in einem Befehlsinterpretationsabschnitt über einen zweiten Schieber
gelesen wird. Der Befehlsinterpretationsabschnitt interpretiert
ein Befehlswort von einem Busschnittstellenabschnitt. In dem Fall
des zweiten Befehlsworts (Datenbefehl) werden Daten, die für eine Berechnung
notwendig sind, auf der Basis von Daten des zweiten Befehlsworts, erzeugt,
wie beispielsweise unmittelbare Daten und Offset-Daten. In dem Fall
des ersten Befehlsworts wird eine Berechnung auf der Basis von Daten
ausgeführt,
die durch einen Datenerweiterungsabschnitt erzeugt worden sind.
-
KURZDARSTELLUNG
DER ERFINDUNG
-
Im
Hinblick auf die festgestellten Probleme ist es die Aufgabe der
vorliegenden Erfindung, wie in den Ansprüchen im Anhang dargelegt, einen
Kompilierer bereitzustellen, der für konstantenrekonstruierende
VLIW-Prozessoren verwendet wird, und einen ausführbaren Code bereitzustellen,
der für
die konstantenrekonstruierenden VLIW-Prozessoren geeignet ist.
-
Zum
Erfüllen
der oben genannten Aufgabe konvertiert der Kompilierer der vorliegenden
Erfindung eine Befehlsfolge, die sich aus seriell angeordneten Befehlen
zusammensetzt, in eine VLIW-Folge für einen Prozessor. Der Kompilierer
umfasst: einen Unterteilungsschritt zum Unterteilen jedes Befehls
in der Befehlsfolge, der eine Konstante enthält, in eine Vielzahl von unterteilten
Befehlen; einen Analyseschritt zum Analysieren von Abhängigkeitsbeziehungen
zwischen jedem Befehl in der Befehlsfolge, der unterteilte Befehle
enthält,
die in dem Unterteilungsschritt gemäß einer Ausführungsreihenfolge
für jeden Befehl
in der Befehlsfolge erzeugt wurden; und einen Verschiebungsschritt
zum Verschieben von Befehlen in der Befehlsfolge in Übereinstimmung
mit den analysierten Abhängigkeitsbeziehungen,
um VLIWs zu generieren, die sich jeweils aus einer Vielzahl von Befehlen
zusammensetzen, die parallel ausführbar sind.
-
Mit
den angegebenen Schritten wird jeder Befehl, der eine Konstante
enthält,
in einem Quellprogramm in wenigstens zwei kürzere Befehle unterteilt, und
eine parallele Ablaufsteuerung wird unter Verwendung der kürzeren Befehle
so durchgeführt, dass
ein für
den konstantenrekonstruierenden VLIW-Prozessor geeigneter Kompilierer
ausgeführt werden
kann. Das heißt,
die Generierung von redundanten Bereichen in VLIWs wird unterdrückt.
-
Hier
kann der Unterteilungsschritt enthalten: einen Befehlsgrößenbeurteilungs-Unterschritt
zum Durchführen
einer Befehlsgrößenbeurteilung,
ob eine Größe eines
Befehls, der eine Konstante enthält,
gleich einer oder kleiner als eine Größe jedes Einheitsopera tionsfelds
in einem VLIW-ist; und einen Unterteilungs-Unterschritt, der, wenn
die Größe des Befehls,
der die Konstante enthält,
als größer als
die Größe jedes
Einheitsoperationsfelds beurteilt wird, den Befehl, der die Konstante
enthält,
in eine Vielzahl von unterteilten Befehlen unterteilt, deren Größen jeweils
gleich der oder kleiner als die Größe jedes Einheitsoperationsfelds
sind.
-
Mit
den angegebenen Schritten werden nur Befehle, deren Größen größer als
Operationsfelder von Objekt-VLIWs sind, unterteilt und der parallelen Ablaufsteuerung
unterzogen. Selbst wenn daher ein Quellprogramm Befehle enthält, deren
Größen für Operationsfelder
von Objekt-VLIWs irrelevant sind, wird der Unterteilungsprozess
nur an Befehlen durchgeführt,
die unterteilt werden sollten, wodurch die Kompilierzeit reduziert
wird.
-
Hier
kann in dem Unterteilungs-Unterschritt der Befehl, der die Konstante
enthält,
in einen oder mehrere Befehle zum Speichern der Konstante in einem
Speicherpuffer des Prozessors und einen Befehl zum Verwenden der
gespeicherten Konstante unterteilt werden.
-
Mit
dem angegebenen Prozess werden alle Konstanten in Befehlen in einem
Konstantenpuffer gespeichert. Als Ergebnis dessen müssen Befehle, die
Konstanten enthalten, die Konstanten nicht als Operanden enthalten,
so dass ein Kompilierer, der für VLIWs
mit kleinen Operationsfeldern zum Spezifizieren nur von Operationscodes
geeignet ist, ausgeführt werden
kann.
-
Hier
kann in dem Unterteilungs-Unterschritt der Befehl, der die Konstante
enthält,
in einen oder mehrere Befehle unterteilt werden, um jeweils eine oder
mehrere unterteilte Konstanten in den Speicherpuffer des Prozessors
und einen Befehl zum Verwenden der gespeicherten unterteilten Konstanten
zu speichern, wobei die unterteilten Konstanten durch Unterteilen
der Konstante erhalten werden.
-
Mit
dem angegebenen Prozess werden nur unterteilte Konstanten, welche
die Größe von Konstanten-Bereichen
in Objekt-VLIWs überschreiten, vorab
in dem Konstantenpuffer gespeichert, und die folgenden Befehle verwenden
die unterteilten Konstanten in dem Konstantenpuffer. Als Ergebnis
dessen kann ein Kompilierer, der für VLIWs mit Operationsfeldern
zum Spezifizieren von kurzen Operanden geeignet ist, ausgeführt werden.
-
Hier
kann der Kompilierer des Weiteren einen Zusammensetzungsschritt
enthalten, der, wenn zwei oder mehr unterteilte Befehle, die aus
ein und demselben Befehl, der eine Konstante enthält, in dem
Unterteilungs-Unterschritt generiert wurden, in ein und demselben
VLIW in dem Verschiebungsschritt angeordnet werden, die zwei oder
mehr unterteilten Befehle zu einem Befehl zusammenfasst.
-
Mit
dem angegebenen Schritt können
unpraktische Situationen ausgeschlossen werden, in denen ein Befehl,
der als ein einzelner Befehl, (ein Befehl, der nicht unterteilt
werden sollte), erhalten bleiben sollte, in zwei oder mehr Befehle
unterteilt wird, die in verschiedenen Operationsfeldern eines VLIW
angeordnet und ausgeführt
werden, so dass die Ausführungsgeschwindigkeit
reduziert wird. Außerdem
kann die Zusammensetzung von Einrichtungsbefehlen für unterteilte
Konstantengruppen (divided constant set instructions) und ungeeigneten Verwendungsbefehlen
für unterteilte
Konstanten (divided constant use instructions) vehindert werden.
-
Wenn
hier in dem Befehlsgrößenbeurteilungs-Unterschritt
die Endgröße nicht
bestimmt worden ist, kann die Befehlsgrößenbeurteilung unter Verwendung
einer angenommenen Größe für die Konstante
durchgeführt
werden. Der Kompilierer kann des Weiteren enthalten: einen Konstantengrößen-Beurteilungsschritt
zum Verknüpfen
einer Vielzahl von VLIW-Folgen und zum Bestimmen einer Endgröße jeder
Konstante; und einen Einfügungsschritt,
der, wenn die Endgröße größer als
die angenommene Größe ist,
einen Befehl zum Speichern einer unterteilten Konstante, die einer
Differenz zwischen der Endgröße und der
angenommenen Größe entspricht,
in dem Speicherpuffer und zum Einfügen des generierten Befehls
in eine entsprechende VLIW-Folge generiert.
-
Mit
den angegebenen Schritten kann Inkonsistenz während der Unterteilungs- und
Verknüpfungs-Prozesse
auf Grund von Kennungsgrößen (label
sizes), die während
des Kompilierens und Assemblierens nicht bestimmt worden sind, vermieden werden.
Daher kann ein Kompilierer, der zur Entwicklung eines Programms
geeignet ist, das Objektmodule verknüpft, die in einer Vielzahl
von Kompilierungseinheiten generiert wurden, ausgeführt werden.
-
Wenn
hier in dem Befehlsgrößenbeurteilungs-Unterschritt
die Endgröße nicht
bestimmt worden ist, kann die angenommene Größe auf die maximale Adressengröße oder
Konstantengröße gesetzt werden,
die von dem Prozessor handhabbar ist, oder auf die am häufigsten
verwendete Adressengröße oder
Konstantengröße.
-
Mit
dem angegebenen Prozess kann Veränderlichkeit
auf Grund der angenommenen Größen vermieden
werden, so dass die Generierung von VLIWs mit Nulloperations-Codes unterdrückt werden kann.
-
Hier
kann der Kompilierer den Unterteilungsschritt nach dem Konstantengrößen-Bestimmungsschritt
erneut ausführen,
wobei in dem Befehlsgrößenbeurteilungs-Unterschritt
in dem erneut ausgeführten
Unterteilungsschritt die Befehlsgrößenbeurteilung unter Berücksichtigung
der Endgröße durchgeführt wurde,
die in dem Konstantengrößen-Bestimmungsschritt
bestimmt wurde.
-
Mit
dem angegebenen Prozess wird während
der Unterteilung einer Konstante die endgültige Kennungsgröße so berücksichtigt,
dass die Befehlseinfügung
nicht durchgeführt
werden muss, und ein ausführbarer
Code, in dem die Code-Größe und Ausführungszeit
reduziert sind, generiert werden kann.
-
Hier
kann der Kompilierer den Analyseschritt und den Verschiebungsschritt
erneut ausführen,
die auf den erneut ausgeführten
Unterteilungsschritt folgen.
-
Mit
dem angegebenen Prozess wird jede Konstante entsprechend unterteilt,
und die Optimierung durch die parallele Ablaufsteuerung wird wiederholt,
so dass ein ausführbarer
Code mit höherer Code-Effizienz
generiert werden kann.
-
Hier
ist der ausführbare
Code der vorliegenden Erfindung eine VLIW-Folge für einen
Prozessor, der eine Vielzahl von Befehlen parallel ausführt, wobei
ein VLIW in der VLIW-Folge eine Konstante enthält, die in einem Speicherpuffer
des Prozessors gespeichert werden soll, der durch wenigstens ein VLIW
in der VLIW-Folge implizit angegeben wird, und ein anderes VLIW,
das auf das VLIW folgt und das erste ist, das auf den Spei cherpuffer
nach dem VLIW verweist, einen Befehl zum Verwenden der Konstante
in dem Speicherpuffer enthält.
-
In
dem angegebenen Code werden jede Konstante und jeder Befehl, der
eine Konstante verwendet, jeweils in zwei kürzere Konstanten und Befehle
unterteilt, werden in VLIWs angeordnet und ablaufgesteuert, um durch
den konstantenrekonstruierenden Prozessor rekonstruiert zu werden.
Daher kann ein ausführbarer
Code, der für
den konstantenrekonstruierenden VLIW-Prozessor geeignet ist, nämlich ein
ausführbarer
Code von hoher Code-Effizienz, bei dem die redundanten Bereiche
in VLIWs unterdrückt
werden, bereitgestellt werden.
-
KURZE BESCHREIBUNG
DER ZEICHNUNGEN
-
Diese
und andere Aufgaben, Vorteile und Merkmale der Erfindung gehen aus
ihrer folgenden Beschreibung in Zusammenhang mit den folgenden begleitenden
Zeichnungen hervor, die eine bestimmte Ausführungsform der Erfindung veranschaulichen.
-
1 ist
ein Blockschaltbild, das ein Beispiel der Architektur des Prozessors 100 zeigt,
für den
der Kompilierer der vorliegenden Erfindung verwendet wird;
-
2A und 2B zeigen
zwei Formate von VLIWs, die durch den Kompilierer der vorliegenden
Erfindung generiert worden sind;
-
3A bis 3C zeigen
drei Formate für ein
12-Bit-Operationsfeld von VLIWs;
-
4A und 4B zeigen
zwei Formate für ein
24-Bit-Operationsfeld von VLIWs;
-
5 ist
ein Blockschaltbild, das die Konstruktion des Kompilierers und dazugehörige Eingabe-/Ausgabe-Daten
zeigt;
-
6 ist
ein Ablaufdiagramm, das die Verarbeitung der Konstanten-Unterteilungseinheit 12 des Kompilierers
der vorliegenden Erfindung zeigt;
-
7 ist
ein Ablaufdiagramm, das die Verarbeitung der Abhängigkeitsdiagramm-Generierungseinheit 20 des
Kompilierers der vorliegenden Erfindung zeigt;
-
8 ist
ein Ablaufdiagramm, das eine Verarbeitung der Befehlsverschiebungseinheit 21 des Kompilierers
der vorliegenden Erfindung zeigt;
-
9 ist
ein Blockschaltbild, das die detaillierte Konstruktion der Verknüpfereinheit 17 des Kompilierers
der vorliegenden Erfindung zeigt;
-
10 ist
ein Ablaufdiagramm, das die Verarbeitung der Befehlseinfügungseinheit 23 der
Verknüpfereinheit 17 zeigt;
-
11A bis 11C zeigen
eine Reihe eines Eingabe- und Ausgabe-Codes und dazugehörige Daten
von Beispiel 1;
-
12 ist
ein endgültiges
Abhängigkeitsdiagramm,
das von der Abhängigkeitsdiagramm-Generierungseinheit 20 generiert
wird, wenn der in 11B gezeigte serielle Assemblercode
in die parallele Ablaufsteuerungseinheit 13 eingegeben
wird;
-
13 ist
ein Blockschaltbild, das die Konstruktion eines üblichen Kompilierers zeigt;
-
14 zeigt
ein Abhängigkeitsdiagramm, das
durch die Abhängigkeitsdiagramm-Generierungseinheit 920 des üblichen
Kompilierers generiert wird;
-
15 zeigt
VLIWs, die durch die Befehlsverschiebungseinheit 921 des üblichen
Kompilierers generiert werden;
-
16 zeigt
einen parallelen Assemblercode, der durch den üblichen Kompilierer generiert wird;
-
17A bis 17G zeigen
eine Reihe eines Eingabe- und Ausgabe-Codes und dazugehörige Daten
von Beispiel 2;
-
18A bis 18E zeigen
eine Reihe eines Eingabe- und Ausgabe-Codes und dazugehörige Daten
von Beispiel 2, die durch jedes Element des Kompilierers der vorliegenden
Erfindung generiert werden, wenn die generierten Speicherstelleninformationen 40 wieder
in die Konstanten-Unterteilungseinheit 12 eingegeben werden;
-
19A bis 19E zeigen
eine Reihe eines Eingabe- und Ausgabe-Codes und dazugehörige Daten
von Beispiel 3;
-
20A bis 20F zeigen
eine Reihe eines Eingabe- und Ausgabe-Codes und dazugehörige Daten
von Beispiel 4;
-
21A und 21B zeigen,
dass die Funktion der Konstanten-Unterteilungseinheit 12 der vorliegenden
Erfindung von zwei verschiedenen Standpunkten aus ausgedrückt werden
kann; und
-
22 zeigt
einen vereinfachten Inhalt einer CD-ROM, die eine VLIW-Folge aufzeichnet,
die durch den Kompilierer der vorliegenden Erfindung generiert worden
ist.
-
BESCHREIBUNG
DER BEVORZUGTEN AUSFÜHRUNGSFORMEN
-
Eine
Ausführungsform
des Kompilierers der vorliegenden Erfindung wird im Folgenden unter
Bezugnahme auf die Figuren beschrieben.
-
<Anforderungen an die Hardware>
-
Der
vorliegende Kompilierer ist ein Kreuzkompilierer, der ein Quellprogramm,
das in einer höheren
Programmiersprache geschrieben ist, übersetzt und verknüpft, um
ein ausführbares
Programm für
einen VLIW-Prozessor zu generieren, der später beschrieben wird. Der vorliegende
Kompilierer wird durch ein Programm erhalten, das durch ein allgemeines
Computersystem ausgeführt
werden kann, nämlich
eine Entwicklungs-Workstation oder einen Arbeitsplatzrechner. Daher
kann der vorliegende Kompilierer oder der durch den vorliegenden
Kompilierer generierte Code in einem Aufzeichnungsmedium, wie beispielsweise
einer Diskette, einer CD-ROM oder einem Halbleiterspeicher gespeichert und
verteilt werden.
-
Hier
ist zu beachten, dass der "Kompilierer" in dieser Spezifikation
nicht als Kompilierer im engeren Wortsinn interpretiert werden sollte,
der Assemblercode durch Übersetzen
von Quellcode generiert, der in einer höheren Programmiersprache geschrieben
ist, sondern als ein Kompilierer im weiteren Sinn interpretiert
werden sollte, der zusätzlich
eine Funktion zum Generieren von Maschinensprachen-Objektcode durch Übersetzen
des Assemblercodes und eine Funktion zum Verknüpfen des Objektcodes besitzt.
-
<Zielprozessor>
-
Vor
der Beschreibung des vorliegenden Kompilierers werden zunächst Funktionen
beschrieben, die für
den Zielprozessor erforderlich sind.
-
<Architektur>
-
Der
Zielprozessor ist ein konstantenrekonstruierender VLIW-Prozessor,
der oben beschrieben wurde.
-
1 ist
ein Blockschaltbild, das eine Beispielarchitektur des Zielprozessors
zeigt.
-
Der
Zielprozessor 100 ist ein Prozessor, der feste 32-Bit-VLIWs
ausführt.
Der Prozessor enthält die
Befehls-Abrufschaltung 101, das Befehlsregister 102,
drei Befehlsdecodierer 103–105, den Konstantenpuffer 107,
der ein spezialisiertes Schieberegister zum Sammeln von Konstanten
bis zu 32 Bits zum Rekonstruieren einer ursprünglichen Konstante ist, die
Registergruppe 108, die sechzehn 32-Bit-Register R0–R15 enthält, und
zwei Operationseinheiten 109 und 110, die ihre
Operationen parallel ausführen.
-
Beim
Ausführen
eines Programms, in dem unterteilte Konstanten, die aus jedem ursprünglichen Befehl
extrahiert wurden, in verschiedenen VLIWs angeordnet sind, besitzt
der VLIW-Prozessor 100 eine Funktion zum Sammeln der unterteilten
Konstanten, indem er sie in den Konstantenpuffer 107 verschiebt,
um die ursprüngliche
Konstante zu rekonstruieren. Nach der Rekonstruktion verwendet der VLIW-Prozessor 100 die
rekon struierte Konstante als ein Sprungziel oder einen Operanden.
Unmittelbar, nachdem ein in dem Konstantenpuffer 107 gespeicherter
Wert verwendet wird (auf ihn verwiesen worden ist), wird der gespeicherte
Wert definitiv gelöscht, das
heißt,
durch Nullen (0) ersetzt, um die nächste Sammlung vorzubereiten.
-
Ein
Kompilierer für
den VLIW-Prozessor 100 muss sicherstellen, dass während der
Ausführung
eines Programms alle unterteilten Konstanten definitiv in dem Konstantenpuffer 107 in
entsprechender Reihenfolge gespeichert werden, um die ursprüngliche Konstante
zu rekonstruieren, und dass die rekonstruierte Konstante definitiv
durch einen vorgesehenen Befehl verwendet wird. Das heißt, wenn
eine Konstante in jedem Befehl unterteilt wird, und die unterteilten
Konstanten in einer Vielzahl von VLIWs angeordnet werden, muss der
Kompilierer die Ablaufsteuerung in verschiedener Hinsicht durchführen, wie
beispielsweise einer Ausführungsreihenfolge
des vorliegenden Befehls und anderer dazugehöriger Befehle, um VLIWs zu
generieren, so dass die ursprüngliche Konstante
definitiv aus den unterteilten Konstanten rekonstruiert wird, und
die rekonstruierte Konstante von dem ursprünglichen Befehl verwendet wird.
-
In
dieser Spezifikation verweist ein "VLIW" auf
einen Code, der eine Gruppe von Operationen spezifiziert, die durch
den VLIW-Prozessor 100 in einem Zyklus parallel auszuführen sind,
während
ein "Befehl" (ausgenommen für das VLIW)
auf den Code verweist, der eine einzelne Operation spezifiziert. Des
Weiteren verweist eine "Konstante" auf einen Wert,
der explizit in einem Befehl (einem Direktbefehl) spezifiziert wird,
und eine Kennung (label), die während
einer Verknüpfung
bestimmt wird.
-
2A und 2B zeigen
zwei Formate von VLIWs, die durch den VLIW-Prozessor 100 ausgeführt werden
(ein Zwei-Operationen-Format und ein Drei-Operationen-Format).
-
Jedes
VLIW setzt sich aus drei Feldern zusammen (dem ersten 8-Bit-Feld 51,
dem zweiten 12-Bit-Feld 52 und dem dritten 12-Bit-Feld 53).
-
In
dem in 2A gezeigten Drei-Operationen-Feld
gibt das erste Feld 51 Formatinformationen an, die ein
VLIW-Format und die erste Operation spezifizieren, das zweite Feld 52 gibt
die zweite Operation an, und das dritte Feld 53 gibt die
dritte Operation an.
-
In
dem in 2B gezeigten Zwei-Operationen-Feld
gibt das erste Feld 51 die Formatinformation und die erste
Operation an, und der 24-Bit-Bereich, der aus dem zweiten Feld 52 und
dem dritten Feld 53 besteht, gibt die zweite Operation
an.
-
Die
Format-Information gibt eines der zwei Formate an und gibt ein oder
mehrere Felder an, die nur Konstanten enthalten, die in dem Konstantenpuffer 107 gesammelt
werden sollen (das zweite Feld 52, das dritte Feld 53,
oder beide, das zweite und das dritte Feld 52 und 53).
-
Die
erste Operation ist auf einen Sprungbefehl begrenzt. Eine Sprungkennung
(eine Sprungzieladresse) für
den Sprungbefehl wird durch den Konstantenpuffer 107, das
zweite Feld 52, das dritte Feld 53 oder eine Kombinationen
von solchen angegeben.
-
Die
zweite und dritte Operation sind standardmäßige Transfer-/arithmetisch-logische
Befehle, die keine Sprungbefehle enthalten. Es ist zu beachten,
dass Befehle, für
die Speicherzugriff erforderlich ist, wie beispielsweise Lade- oder
Speicherbefehle, entweder auf die zweite Operation oder die dritte Operation
begrenzt sind. Diese standardmäßigen arithmetisch-logischen
Befehle sind entweder 12 Bits lang oder 24 Bits lang. Obwohl sie
hauptsächlich durch
12 Bits ausgedrückt
werden, werden die standardmäßigen Transfer-/arithmetisch-logischen
Befehle durch 24 Bits ausgedrückt,
wenn in den Befehlen lange Operanden enthalten sind.
-
3A bis 3C zeigen
drei Formate für ein
12-Bit-Operationsfeld. 3A zeigt ein Format für eine Zwischenregister-Operation; 3B ein
Format für
einen Operation, die ein Register und ein 4-Bit-Konstante verwenden; 3C ein
Format nur zum Spezifieren einer unterteilten 12-Bit-Konstante, die
in dem Konstantenpuffer 107 gespeichert werden soll.
-
4A bis 4B zeigen
zwei Formate ein 24-Bit-Operationsfeld. 4A zeigt
ein Format für eine
Operation, die ein Register und eine 16-Bit-Konstante verwendet; 4B ein
Format nur zum Spezifizieren einer unterteilten 24-Bit-Konstante,
die in dem Konstantenpuffer 107 gespeichert werden soll.
-
(Befehlssatz)
-
Die
Hauptbefehle in dem Befehlssatz des VLIW-Prozessor 100 werden
im Folgenden beschrieben.
-
{(Beispiel 1) mov 0x1234,
R0}
-
Dieser
Befehl ist ein Transferbefehl, um eine 16-Bit-Konstante "0x1234", (wobei Ox eine
Hexadezimalzahl ist), im Register R0 zu setzen. Dieser Befehl ist
der gleiche wie bei einem Standardprozessor.
-
Dieser
Befehl enthält
eine 16-Bit-Konstante. Dementsprechend wird dieser Befehl für eine 24-Bit-Operation
verwendet. Das bedeutet, dass ein anderer standardmäßiger Transfer-/arithmetisch-logische
Befehl nicht in dem VLIW angeordnet werden kann, das diesen Befehl
enthält.
-
{(Beispiel 2) sfst 0x1234:12u}
-
Dieser
Befehl ist ein Transferbefehl, um die höherwertigen 12 Bits "0x1234: 12h" der 16-Bit-Konstante "0x1234" im Konstantenpuffer 107 einzurichten,
indem der Inhalt in den Konstantenpuffer 107 verschoben
wird, und ist ein Einrichtungsbefehl für unterteilte Konstanten.
-
Hier
ist der " Einrichtungsbefehl
für unterteilte
Konstanten " ein
Befehl zum Sammeln von unterteilten Konstanten in einem implizit
bestimmten Speicherbereich, (dem Konstantenpuffer 107),
und ist ein eindeutiger Befehl für
den VLIW-Prozessor 100. Die unterteilte Konstante kann
alle Zahlen oder Teilzahlen einer Sprungkennung sein, die für eine Sprungoperation
verwendet wird, oder besteht aus Teilzahlen einer Konstante, die
für einen
Transfer/arithmetisch-logischen Befehl verwendet wird.
-
In
dem endgültigen
ausführbaren
Code für diesen
Befehl enthält
ein Feld, das diesen Befehl enthält,
nur die unterteilte 12-Bit-Konstante, wodurch der Befehl zu einer
12-Bit-Operation
gemacht wird. Das erste Feld 51 enthält Formatinformationen, die den
Befehl spezifizieren. Dementsprechend kann das VLIW, das diesen
Befehl enthält,
nur eine weitere 12-Bit-Operation enthalten.
-
{(Beispiel 3) mov 0x1234:4L,
R0}
-
Dieser
Befehl ist ein Verwendungsbefehl für unterteilte Konstanten. Genauer
ist er ein Transferbefehl zum Einrichten einer 16-Bit-Konstante
im Register R0, indem die unterteilte Konstante, die in dem Konstantenpuffer 107 als
die höherwertigen
12 Bits und die niederwertigen 4 Bits der Konstante "0x1234" gespeichert werden,
die durch diesen Befehl (0x1234:4L) als die niederwertigen 4 Bits
spezifiziert werden, zusammengesetzt wird. Hier ist ein "Verwendungsbefehl
für unterteilte
Konstanten" ein
Befehl zum Verwenden von unterteilen Konstanten, die in einem implizit
bestimmten Speicherbereich gespeichert sind, (dem Konstantenpuffer 107),
und ist ein eindeutiger Befehl für
den VLIW-Prozessor 100.
-
Der
Befehl von Beispiel 3 ist eine 12-Bit-Operation. Dementsprechend
kann ein VLIW, das diesen Befehl enthält, nur eine weitere 12-Bit-Operation
enthalten.
-
Hier
ist zu beachten, dass das Ausführungsergebnis
des Befehls von Beispiel 1 das gleich ist wie dasjenige, das durch
aufeinander folgendes Ausführen
der Befehle von Beispiel 2 und Beispiel 3 erhalten wird. Dementsprechend
kann der Kompilierer zwei 12-Bit-Befehle
generieren, nämlich
den Einrichtungsbefehl für
unterteilte Konstanten von Beispiel 2 und den Verwendungsbefehl
für unterteilte
Konstanten von Beispiel 3, statt des 24-Bit-Befehls von Beispiel 1.
Wenn in einem Befehl ein redundanter Bereich vorhanden ist, kann
der redundante Bereich dadurch mit dem Einrichtungsbefehl für unterteilte
Konstanten gefüllt
werden, wodurch die Code-Effizienz verbessert wird.
-
<Konstruktion des Kompilierers>
-
5 ist
ein Blockschaltbild, das die Konstruktion des vorliegenden Kompilierers
und dazugehörige
Eingabe-/Ausgabe-Daten zeigt.
-
Der
vorliegende Kompilierer kann grob in drei Gruppen unterteilt werden.
Die erste Gruppe generiert den seriellen Assemblercode 42 aus
dem Quellcode 41, der in einer höheren Sprache geschrieben ist,
(der stromaufwärts
des Kompilierers liegende Teil 10 und die Assemblercode-Generierungseinheit 11).
Die zweite Gruppe generiert den pa rallelen Assemblercode 43 und
den Objektcode 44a–44b,
indem der serielle Assemblercode 42 der parallelen Ablaufsteuerung
unterzogen wird, die eindeutig ist für den VLIW-Prozessor 100,
(die Konstanten-Unterteilungseinheit 12, die parallele
Ablaufsteuerungseinheit 13, die Konstanten-Zusammensetzungseinheit 14,
die Code-Ausgabeeinheit 15 und die parallele Assemblereinheit 16).
Die dritte Gruppe generiert den endgültigen ausführbaren Code 46 durch
Verknüpfen
einer Vielzahl von verschiebbarem Objektcode 44a und 44b (die
Verknüpfereinheit 17).
-
Die
Verschiebungsinformationen 45a–45b und Speicherstelleninformationen 40 beziehen
sich auf Kennungen und werden in die Verknüpfereinheit 17 eingegeben
oder von dieser ausgegeben. Die Verschiebungsinformationen 45a–45b und
Speicherstelleninformationen 40 werden verwendet, um endgültige Kennungsadressen
zu bestimmen und werden auch in die Konstanten-Unterteilungseinheit 12 eingegeben,
um beim Generieren von optimalem Code verwendet zu werden. Die Eingabe-/Ausgabedaten 40–45 und
andere Zwischensprachendaten werden auf einer Festplatte des oben
beschriebenen Computersystems als Dateien gespeichert oder werden
in einem Speicher als temporäre
Daten gespeichert.
-
(Stromaufwärts des
Kompilierers liegender Teil 10)
-
Der
stromaufwärts
des Kompilierers liegende Teil 10 liest einen Quellcode 41 in
höherer
Sprache, der in einem Dateiformat gespeichert ist, führt eine
syntaktische Analyse und eine semantische Analyse am Quellcode 41 durch
und generiert einen internen Format-Code. Des Weiteren wird der interne Format-Code
je nach Bedarf so optimiert, dass die Größe des endgültig generierten ausführbaren
Codes und die Ausführungszeit
reduziert werden. Die Verarbeitung des stromaufwärts des Kompilierers liegenden
Teils 10 ist die gleiche wie diejenige für den stromaufwärts des
Kompilierers liegenden Teil eines üblichen Kompilierers (eines
Kompilierers für
einen normalen Prozessor, nicht für einen konstantenrekonstruierenden
VLIW-Prozessor).
-
(Assemblercode-Generierungseinheit 11)
-
Die
Assemblercode-Generierungseinheit 11 generiert einen seriellen
Assemblercode 42 aus dem internen Format-Code, der durch
den stromaufwärts des
Kompilierers lie genden Teil 10 generiert und optimiert
wurde. Hier besteht der "serielle
Assemblercode" aus
seriell angeordneten Assembler-Befehlen für Operationen und ist ein Assemblercode
für einen normalen
Prozessor (einen Prozessor mit einer Operationseinheit). Die Verarbeitung
der Assemblercode-Generierungseinheit 11 ist die gleiche
wie diejenige der Assemblercode-Generierungseinheit eines üblichen
Kompilierers.
-
(Konstanten-Unterteilungseinheit 12)
-
Die
Konstanten-Unterteilungseinheit 12 liest den Assemblercode 42,
der durch die Assemblercode-Generierungseinheit 11 generiert
worden ist, und unterteilt alle Verwendungsbefehle für lange Konstanten,
die in dem Assemblercode 42 enthalten sind, in Einrichtungsbefehle
für unterteilte
Konstanten und Verwendungsbefehle für unterteilte Konstanten. Das
heißt,
Verwendungsbefehle für
lange Konstanten werden durch zwei Arten von Befehlen ersetzt (Einrichtungsbefehle
für unterteilte
Konstanten und Verwendungsbefehle für unterteilte Konstanten). Mit
den beiden Befehlsarten wird der gleiche Prozess durchgeführt wie
derjenige, der mit einem Verwendungsbefehl für lange Konstanten durchgeführt wird. Während dieses
Ersetzungsprozesses kann der Verwendungsbefehl für lange Konstanten abhängig von der
Länge der
langen Konstante, die in einem Verwendungsbefehl für lange
Konstanten enthalten ist, durch zwei oder mehrere Einrichtungsbefehle
für unterteilte
Konstanten und einen Verwendungsbefehl für unterteilte Konstanten ersetzt
werden.
-
Hier
ist eine "lange
Konstante" eine
Konstante, die zu lang ist, um innerhalb eines Einheits-Operationsfelds
in einem VLIW geschrieben zu werden. Insbesondere (1), wenn sie
durch einen Sprungbefehl verwendet wird, ist eine lange Konstante
eine Konstante, die nicht innerhalb des ersten Operationsfelds geschrieben
werden kann, (eine Sprungkennung, die durch ein oder mehrere Bits
ausgedrückt wird),
und (2), wenn sie durch einen Transfer-/arithmetisch-logischen Befehl
verwendet wird, ist eine lange Konstante eine Konstante, die nicht
innerhalb eines in 3B gezeigten 12-Bit-Operationsfelds geschrieben
werden kann, (eine Konstante, die durch 5 oder mehrere Bits ausgedrückt wird).
Des Weiteren ist ein "Verwendungsbefehl
für unterteilte Konstanten" ein Befehl, der
eine lange Konstante verwendet.
-
Andererseits
wird eine Konstante, die innerhalb eines Einheits-Operationsfelds
in einem VLIW geschrieben werden kann, also eine Konstante, die durch
einen Transfer-/arithmetisch-logischen Befehl verwendet und durch
4 oder weniger Bits ausgedrückt
wird, als eine "kurze
Konstante" bezeichnet. Ein
Befehl, der eine kurze Konstante verwendet, wird als ein "Verwendungsbefehl
für kurze
Konstanten" bezeichnet.
Es ist zu beachten, dass der Verwendungsbefehl für unterteilte Konstanten eine
kurze Konstante enthält,
(eine Konstante von 4 oder weniger Bits), und daher ein Verwendungsbefehl
für kurze Konstanten
ist.
-
Das
Folgende ist eine ausführliche
Beschreibung der Verarbeitung der Konstanten-Unterteilungseinheit 12.
-
6 ist
ein Ablaufdiagramm, das die Verarbeitung der Konstanten-Unterteilungseinheit 12 zeigt.
-
Die
Konstanten-Unterteilungseinheit 12 führt den folgenden Prozess (Schritte
S2–S4)
für jeden Befehl
durch, der in dem Assemblercode 42 enthalten ist (Schritte
S1–S5).
-
Zunächst bestimmt
die Konstanten-Unterteilungseinheit 12 die Größe einer
Kennung, (die Anzahl von Bits, die erforderlich sind, um eine Adresse auszudrücken, die
durch die Kennung angegeben wird), die in einem zu verarbeitenden
Befehl enthaften ist, (der im folgenden einfach als ein "Zielbefehl" bezeichnet wird)
(Schritt S2).
-
Insbesondere,
wenn die Größe einer
Kennung bestimmt werden kann, weil die Kennung eine örtliche
Kennung ist, die in der gleichen Kompiliereinheit des Quellcodes 41 vorhanden
ist, oder wenn die Größe explizit
durch irgendeine Information angegeben wird, wie beispielsweise
die Speicherstelleninformation 40, wird die Größe zu der
Kennung als Größeninformation,
so wie sie ist, hinzugefügt.
Wenn die Größe einer
Kennung jedoch nicht bestimmt werden kann, weil die Kennung eine
externe Kennung ist, die in einer anderen Kompiliereinheit des Quellcodes 41 vorhanden
ist, wird der Kennung eine temporäre Größe als Kennungsinformation
hinzugefügt.
Es ist zu beachten, dass in dieser Ausführungsform die temporäre Größe mit 16
Bits vorgegeben ist, was gemäß statistischer
Analyse die häufigste
Adressengröße ist.
-
Die
Konstanten-Unterteilungseinheit 12 bestimmt dann, ob der
Zielbefehl ein Verwendungsbefehl für lange Konstanten ist (Schritt
S3).
-
Wenn
beurteilt wird, dass der Zielbefehl ein Verwendungsbefehl für lange
Konstanten ist, wird der Befehl in eine oder mehrere Einrichtungsbefehle für unterteilte
Konstanten und einen Verwendungsbefehl für unterteilte Konstanten unterteilt
(Schritt S4).
-
Insbesondere,
wenn der Verwendungsbefehl für
lange Konstanten ein Sprungbefehl ist, wird die fange Konstante,
(eine Adresse, die durch eine Sprungkennung angegeben wird), in
12-Bit-Teile in der Reihenfolge ab dem niedrigstwertigen Bit unterteilt.
Die Konstanten-Unterteilungseinheit 12 generiert einen
oder mehrere Einrichtungsbefehle für unterteilte Konstanten, die
erhaltene unterteilte Konstanten in dem Konstantenpuffer 107 aufeinander
folgend ab dem höchstwertigen
Bit einrichten, und einen Verwendungsbefehl für unterteilte Konstanten (einen
Befehl, der dem Operations-Code eines Sprungbefehls entspricht).
Der Zielbefehl wird durch den generierten einen oder mehrere Einrichtungsbefehle
für unterteilte
Konstanten und einen Verwendungsbefehl für unterteilte Konstanten ersetzt.
Wenn die lange Konstante in dem Befehl beispielsweise 19 Bits aufweist,
werden der langen Konstante führende Nullen
hinzugefügt,
damit sich 24 Bits, (ein Vielfaches von 12 Bits), ergeben, und sie
wird in die höherwertigen
12 Bits und die niederwertigen 12 Bits unterteilt. insgesamt werden
drei Befehle, nämlich
ein Einrichtungsbefehl für
unterteilte Konstanten für
die unterteilte Konstante mit den höherwertigen 12 Bits, ein Einrichtungsbefehl
für unterteilte
Konstanten für
die unterteilte Konstante mit den niederwertigen 12 Bits und ein
Verwendungsbefehl für
unterteilte Konstanten in dieser Reihenfolge generiert. Der Zielbefehl wird
durch diese generierten Befehle ersetzt.
-
Andererseits,
wenn der Verwendungsbefehl für
lange Konstanten ein Transfer-/arithmetisch-logischer Befehl ist,
entfernt die Konstanten-Unterteilungseinheit 12 die Entsprechung
einer kurzen Konstanten, (die niederwertigen 4 Bits), und unterteilt
die restliche lange Konstante in 12-Bit-Einheiten, ausgehend von
ihrem niedrigstwertigen Bit. Die Konstanten-Unterteilungseinheit 12 generiert
einen oder mehrere Einrichtungsbefehle für unterteilte Konstanten, die
erhaltene unterteilte Konstanten in dem Konstantenpuffer 107 aufeinander
folgend ab dem höchstwertigen
Bit einrichten, und einen Verwendungsbefehl für unterteilte Konstanten (einen
Befehl, der den Operations-Code des Transfer /arithmetisch-logischen
Befehls und einen Operanden enthält,
der die kurze Konstante angibt). Der Zielbefehl wird durch die generierten
Befehle ersetzt. Wenn die lange Konstante in dem Befehl beispielsweise
19 Bits aufweist, werden der langen Konstante führende Nullen hinzugefügt, damit
sich 28 Bits, (2 Bits × n
+4 Bits), ergeben, und sie wird in die höherwertigen 12 Bits, die mittleren
12 Bits und die niederwertigen 4 Bits unterteilt. Insgesamt werden
drei Befehle, nämlich
ein Einrichtungsbefehl für
unterteilte Konstanten für
die unterteilte Konstante mit den höherwertigen 12 Bits, ein Einrichtungsbefehl
für unterteilte
Konstanten für
die unterteilte Konstante mit den mittleren 12 Bits und ein Einrichtungsbefehl
für unterteilte
Konstanten, der die unterteilte Konstante mit den niederwertigen
4Bits enthält,
in dieser Reihenfolge generiert. Der Zielbefehl wird durch diese
generierten Befehle ersetzt.
-
Hier
ist zu beachten, dass zwei verschiedene Verfahren zum Unterteilen
einer langen Konstante verwendet werden, abhängig davon, ob ein Verwendungsbefehl
für lange
Konstanten ein Sprungbefehl oder ein Transfer-/arithmetisch-logischer
Befehl ist. Der Grund dafür
ist, dass eine unterteilte Konstante, (eine Sprungkennung), nicht
in das erste Feld 51 eingefügt werden kann, in das ein
Sprungbefehl eingefügt
ist, wogegen eine unterteilte Konstante, (eine kurze Konstante),
in das zweite Feld 52 oder das dritte Feld 53 eingefügt werden
kann, in die ein Transfer-/arithmetisch-logischer Befehl eingefügt ist.
-
(Parallele Ablaufsteuerungseinheit 13)
-
Die
parallele Ablaufsteuerungseinheit 13 empfängt einen
seriellen Assemblercode, aus dem Verwendungsbefehle für lange
Konstanten durch die Konstanten-Unterteilungseinheit 12 beseitigt
worden sind. Die parallele Ablaufsteuerungseinheit 13 erkennt
die Parallelität
des seriellen Assemblercodes auf der Assembler-Befehlsebene und
generiert einen parallelen Assemblercode, der in VLIWs gepackt wird,
die dem in 2A gezeigten Drei-Operationen-Format
oder dem in 2B gezeigten Zwei-Operationen-Format entsprechen.
Hier ist der "parallele
Assemblercode" ein
Assemblercode für
einen VLIW-Prozessor, wobei eine Folge von parallelen Assemblerbefehlen
verwendet wird, um eine Vielzahl von Operationen anzugeben, die
parallel ausgeführt
werden können.
-
Die
parallele Ablaufsteuerungseinheit 13 enthält die Abhängigkeitsdiagramm-Generierungseinheit 20 und
die Befehlsverschiebungseinheit 21.
-
(Abhängigkeitsdiagramm-Generierungseinheit 20)
-
Die
Abhängigkeitsdiagramm-Generierungseinheit 20 generiert
ein Abhängigkeitsdiagramm
für die
Assemblercode-Ausgabe aus der Konstanten-Unterteilungseinheit 12.
Hier ist das "Abhängigkeitsdiagramm" ein direktionales
Diagramm, das die Ausführungs-Reihenfolgenbeziehungen
zwischen Assembler-Befehlen mit Verknüpfungen, (auch als Pfeile oder
Flanken bezeichnet) ausdrückt,
deren Knoten die Befehle sind, und die Ausführungsreihenfolge von Befehlen
in dem Assemblercode regelt.
-
Die
Abhängigkeitsdiagramm-Generierungseinheit 20 wiederholt
die im Folgenden beschriebene Verarbeitung (Schritte S12–S27) für jeden
Befehl in dem seriellen Assemblercode, aus dem Verwendungsbefehle
für lange
Konstanten durch die Konstanten-Unterteilungseinheit 12 (Schritte
S11–S29) beseitigt
worden sind.
-
Nach
dem Generieren des Knotens eines Zielbefehls (Schritt S12) wiederholt
die Abhängigkeitsdiagramm-Generierungseinheit 20 die
folgenden drei Prozesse, (1) die Generierung eines Abhängigkeitsdiagramms
basierend auf der ausschließlichen
Steuerung über
die Registergruppe 108 (Schritte S13–S18), (2) die Generierung
eines Abhängigkeitsdiagramms
basierend auf der ausschließlichen Steuerung über den
Speicher (Schritte S19–S24), und
(3) die Generierung eines Abhängigkeitsdiagramms
basierend auf der ausschließlichen
Steuerung über
den Konstantenpuffer 107 (Schritte S25–S28). Diese Prozesse werden
im Folgenden ausführlicher
beschrieben.
-
Zuerst
generiert die Abhängigkeitsdiagramm-Generierungseinheit 20 einen
Knoten, der einem Zielbefehl entspricht (Schritt S12). Insbesondere
generiert die Abhängigkeitsdiagramm-Generierungseinheit 20 Informationen,
die den Zielbefehl mit dem Knoten in Beziehung setzen.
-
Die
Abhängigkeitsdiagramm-Generierungseinheit 20 beurteilt,
ob der Zielbefehl auf ein Register verweist (Schritt S13). Hier
gibt "auf ein Register
verweisen" an, dass
der Wert des Registers gelesen wird.
-
Wenn
auf ein Register verwiesen wird, wird der vorherige Register-Definitionsbefehl,
(ein vorheriger Befehl, der das Register definiert), angegeben, und
eine Verknüpfung
wird von dem angegebenen Befehl zu dem Zielbefehl hergestellt (Schritt
S14). Insbesondere werden Informationen generiert, die eine Verknüpfung von
dem Knoten, der dem angegebenen Befehl entspricht, zu dem Knoten
angeben, der dem Zielbefehl entspricht.
-
In
dieser Spezifikation bedeutet "Registerdefinition", dass ein Wert in
einem Register verworfen wird, und ein neuer Wert in dem Register
eingerichtet wird. Des Weiteren bedeutet "voheriger Befehl" den letzten Befehl vor einem Zielbefehl.
-
Wenn
ein einzelner Befehl auf eine Vielzahl von Registern verweist, wiederholt
die Abhängigkeitsdiagramm-Generierungseinheit 20 die
Schritte S13 und S14 für
jedes Register. Diese Wiederholung lässt sich auch auf die folgenden
Schritte anwenden.
-
Als
Nächstes
beurteilt die Abhängigkeitsdiagramm-Generierungseinheit 20,
ob der Zielbefehl ein Register definiert (Schritt S15).
-
Wenn
der Zielbefehl ein Register definiert, wird der vorherige Register-Steuerbefehl,
(ein vorheriger Befehl, der das Register steuert), angegeben, und
es wird beurteilt, ob der angegebene Befehl ein Register-Definitionsbefehl
ist (Schritt S16). Hier bedeutet "Register-Steuerung" die Definition eines und den Verweis
auf ein Register.
-
Wenn
das Beurteilungsergebnis so ausfällt, dass
der angegebene Befehl ein Register-Definitionsbefehl ist, wird eine Verknüpfung von
dem Register-Definitionsbefehl zu dem Zielbefehl hergestellt (Schritt
S17).
-
Wenn
der angegebene Befehl andererseits ein Register-Verweisbefehl und
kein Register-Definitionsbefehl ist, wird der vorherige Register-Definitionsbefehl
angegeben, und es werden Verknüpfungen
zu dem Zielbefehl von jedem Register-Verweisbefehl, (Befehle zum
Verweisen auf das Register), hergestellt, der zwischen dem vorherigen
Register-Definitionsbefehl
und dem Zielbefehl liegt (Schritt S18).
-
Die
mit oben beschriebenen Registerverweisen und Registerdefinitionen
zusammenhängende Verarbeitung
(Schritte S13–S18)
wird auch für
den Speicher durchgeführt
(Schritte S19–S24).
-
Nach
dem Prozess beurteilt die Abhängigkeitsdiagramm-Generierungseinheit 20,
ob der Zielbefehl ein Einrichtungsbefehl für unterteilte Konstanten ist
(Schritt S25).
-
Wenn
der Zielbefehl ein Einrichtungsbefehl für unterteilte Konstanten ist,
wird eine Verknüpfung von
dem vorherigen Konstantenpuffer-Steuerbefehl zu dem Zielbefehl hergesiellt
(Schritt S26). Hier ist ein "Konstantenpuffer-Steuerbefehl" ein Befehl zum Steuern
(Definieren und Verweisen) des Konstantenpuffers 107, nämlich ein
Einrichtungsbefehl für
unterteilte Konstanten und ein Verwendungsbefehl für unterteilte
Konstanten.
-
Schließlich beurteilt
die Abhängigkeitsdiagramm-Generierungseinheit 20,
ob der Zielbefehl ein Verwendungsbefehl für unterteilte Konstanten ist (Schritt
S27).
-
Wenn
der Zielbefehl ein Verwendungsbefehl für unterteilte Konstanten ist,
wird eine Verknüpfung von
dem vorherigen Konstantenpuffer-Steuerbefehl zu dem Zielbefehl hergestellt
(Schritt S28).
-
Es
ist zu beachten, dass es Unterschiede zwischen dem Prozess zum Generieren
eines Abhängigkeitsdiagramms
in Bezug auf Register (Schritte S13–S18) und dem Prozess zum Generieren
eines Abhängigkeitsdiagramms
in Bezug auf den Konstantenpuffer 107 (Schritte S25–S28) gibt.
Der Grund liegt dann, dass jeder Einrichtungsbefehl für unterteilte
Konstanten und Verwendungsbefehle für unterteilte Konstanten, auf
die der Konstantenpuffer 107 zugreift, ein Befehl zum Verweisen
auf das und auch Definieren des Konstantenpuffers 107 ist.
Das heißt, der
Konstantenpuffer 107 enthält ein Schieberegister, so
dass ein Einrichtungsbefehl für
unterteilte Konstanten ein Verschiebe- und Einrichtungsbefehl ist (ein
Verweis- und Definitionsbefehl). Weil der Inhalt des Konstantenpuffers 107 unmittelbar
nach dem Verweisen auf den Inhalt gelöscht wird, ist ein Verwendungsbefehl
für unterteilte
Konstanten ein Verweis- und Definitionsbefehl.
-
(Befehlsverschiebungseinheit 21)
-
In Übereinstimmung
mit der Ausführungsreihenfolge,
die durch das Abhängigkeitsdiagramm
angegeben wird, das durch die Abhängigkeitsdiagramm-Generierungseinheit 20 generiert
wird, verschiebt die Befehlsverschiebungseinheit 21 Befehle in
der seriellen Assemblercode-Ausgabe von der Konstanten-Unterteilungseinheit 12 durch
Packen der Befehle in VLIW-Einheiten des Zielprozessors 100.
Dadurch verschiebt die Befehlsverschiebungseinheit 21 Befehle
so, dass die größtmögliche Anzahl von
Befehlen parallel ausgeführt
wird, wodurch die Ausführungszeit
reduziert wird.
-
Die
Verarbeitung der Befehlsverschiebungseinheit 21 wird im
Folgenden ausführlich
beschrieben.
-
8 ist
ein Ablaufdiagramm, das die Verarbeitung der Befehlsverschiebungseinheit 21 zeigt.
-
Die
Befehlsverschiebungseinheit 21 wiederholt den folgenden
Prozess (Schritte S42–S50),
bis alle Befehle in dem seriellen Assemblercode verschoben sind,
(alle Befehle werden in VLIW-Einheiten gepackt und von der parallelen
Ablaufsteuerungseinheit 13 ausgegeben (Schritte S41–S51).
-
Zunächst prüft die Befehlsverschiebungseinheit 21 das
Abhängigkeitsdiagramm,
um alle Befehle zu klassifizieren, die zum gegenwärtigen Zeitpunkt
in eine ausgebbare Befehlsgruppe ausgegeben werden können (Schritt
S42). Hier ist ein "ausgebbarer
Befehl" ein Befehl,
der nicht von einem vorherigen Befehl abhängt und deshalb unabhängig ausgeführt (ausgegeben)
werden kann. Die Beispiele von ausgebbaren Befehlen sind (1) ein
Zielbefehl, zu dem keine Verknüpfung
in dem Abhängigkeitsdiagramm vorhanden
ist und (2) ein Zielbefehl, dessen Verknüpfungsquellenknoten Befehlen,
die ausgegeben worden sind, oder Einrichtungsbefehlen für unterteilte Konstanten
in dem Abhängigkeitsdiagramm
entspricht.
-
Des
Weiteren setzt sich die "ausgebbare
Befehlsgruppe" aus
allen Befehlen zusammen, die zum gegenwärtigen Zeitpunkt ausgegeben
werden können.
Wie oben beschrieben, enthält
die ausgebbare Befehlsgruppe Zielbefehle, deren Verknüpfungsquelle
ein Einrichtungsbefehl für
unterteilte Konstanten ist. Der Grund dafür liegt dann, dass, selbst
wenn ein VLIW einen Einrichtungsbefehl für unterteilte Konstanten und
einen Verwen dungsbefehl für
unterteilte Konstanten enthält,
diese Befehle durch einen einzelnen Befehl von der Konstanten-Zusammensetzungseinheit 14 ersetzt
werden können,
wie im Folgenden beschrieben, so dass diese Befehle ausgeführt werden
können,
ohne irgendwelche Probleme zu verursachen.
-
Nachdem
eine ausgebbare Befehlsgruppe generiert worden ist (Schritt S42),
wird ein Prozess zum Auswählen
und Löschen
eines Befehls aus der Gruppe (Schritte S45–S48) wiederholt, bis alle
Befehle aus der Gruppe ausgewählt
und gelöscht
worden sind (Schritte S43–S49).
-
Es
ist zu beachten, dass, wenn ein VLIW generiert wird, der Prozess
die Schleife verlässt
(Schritte S43–S49),
eine andere ausgebbare Befehlsgruppe generiert (Schritt S42) und
den gleichen Prozess wiederholt (Schritte S45–S48) (Schritte S43–S49). Der
Grund dafür
ist, dass zum Zeitpunkt, zu dem Befehle, aus denen sich das generierte
VLIW zusammensetzt, aus der ausgebbaren Befehlsgruppe gelöscht werden,
neue ausgebbare Befehle generiert worden sein können.
-
Zuerst
beurteilt die Befehlsverschiebungseinheit 21, ob ein VLIW
aus Befehlen in einer Ausgabe-Ablaufsteuerungs-Befehlsgruppe erstellt
werden kann (ob irgendwelche weiteren Befehle in das VLIW eingefügt werden
können)
(Schritt S44).
-
Hier
sind "Ausgabe-Ablaufsteuerungsbefehle" Befehle, die in
ein generiertes einzelnes VLIW aufgenommen werden können und
parallel ausgeführt
werden, wogegen die "Ausgabe-Ablaufsteuerungs-Befehlsgruppe" Befehle temporär aufnimmt, um
die maximale Anzahl von Ausgabe-Ablaufsteuerungsbefehlen, (die maximale
Anzahl von Ausgabe-Ablaufsteuerungsbefehlen, die in einem VLIW angeordnet
werden können),
zu sammeln. Das heißt, es
werden nur Befehle, die von der ausgebbaren Befehlsgruppe in die
Ausgabe-Ablaufsteuerungs-Befehlsgruppe verschoben worden sind, von
der parallelen Ablaufsteuerungseinheit 13 als Befehle ausgegeben,
die ein generiertes VLIW bilden.
-
Wenn
beurteilt wird, dass ein VLIW in Schritt S44 nicht generiert werden
kann, wählt
die Befehlsverschiebungseinheit 21 einen Befehl aus der
ausgebbaren Befehlsgruppe aus, was dazu führt, dass die Ausführungszeit
und die Code-Größe reduziert werden
(Schritt S45). Insbesondere berechnet die Befehlsverschiebungseinheit 21 Schätzwerte
für die Gesamtanzahl
von aus einem Grundblock generierten VLIWs, indem auf das Abhängigkeitsdiagramm verwiesen
wird, und wählt
den Befehl aus, der zu dem niedrigsten Schätzwert führt.
-
Danach
beurteilt die Befehlsverschiebungseinheit 21, ob der ausgewählte Befehl,
(ein Zielbefehl), in die Ausgabe-Ablaufsteuerungs-Befehlsgruppe
aufgenommen werden kann (Schritt S46). Wenn zu diesem Zeitpunkt
ein oder mehrere Befehle in die Ausgabe-Ablaufsteuerungs-Befehlsgruppe
aufgenommen worden sind, beurteilt die Befehlsverschiebungseinheit 21 hier,
ob die aufgenommenen Befehle und der Zielbefehl ein VLIW bilden
können,
(ob ein VLIW ausgegeben werden kann) (Schritt S46).
-
Wenn
zum Beispiel ein 12-Bit-Befehl in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
vorhanden ist, und der in Schritt S45 ausgewählte Befehl 24 Bits
lang ist, können
diese Befehle kein VLIW bilden. Daher beurteilt die Befehlsverschiebungseinheit 21, dass
diese Befehle nicht ausgegeben werden können. Wenn kein Einrichtungsbefehl
für unterteilte Konstanten
der Verknüpfungsquelle
des momentanen Knotens ausgegeben worden ist und nicht in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
vorhanden ist, beurteilt die Befehlsverschiebungseinheit 21, dass
keine Befehle ausgegeben werden können. Dies verhindert die Generierung
eines fehlerhaften Codes, bei dem ein Verwendungsbefehl für unterteilte
Konstanten ohne Einrichtungsbefehle für unterteilte Konstanten ausgegeben
wird.
-
Wenn
die Befehlsverschiebungseinheit 21 beurteilt, dass ein
Befehl, der in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
enthalten ist, und ein Zielbefehl in Schritt S46 ein VLIW bilden
können,
wird der Zielbefehl von der ausgebbaren Befehlsgruppe zu der Ausgabe-Ablaufsteuerungs-Befehlsgruppe übertragen
(Schritte S47 und S48).
-
Wenn
andererseits die Befehlsverschiebungseinheit 21 beurteilt,
dass ein Befehl, der in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
enthalten ist, und ein Zielbefehl in Schritt S46 kein VLIW bilden können, kann
der Zielbefehl zu diesem Zeitpunkt nicht ausgegeben werden und wird
somit aus der ausgebbaren Befehlsgruppe entfernt (Schritt S48).
-
Wenn
die Befehlsverschiebungseinheit 21 beurteilt, dass ein
VLIW in Schritt S44 aus Befehlen in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
gebildet werden kann, werden die Befehle aus der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
entfernt und als ein VLIW (Schritt S50) ausgegeben. Es ist zu beachten,
dass, wenn der Prozess von Schritt S49 mit Schritt S50 fortfährt, Fälle auftreten,
in denen nicht alle Operationsfelder eines VLIW mit Befehlen gefüllt werden
können,
die in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe bleiben. In diesem
Fall wird ein VLIW ausgegeben, dessen leere Operationsfelder mit
Nulloperations- (nop) Befehlen gefüllt sind.
-
Auf
diese Weise wird der serielle Assemblercode, der in die parallele
Ablaufsteuerungseinheit 13 eingegeben wird, in VLIWs gepackt,
um einen parallelen Assemblercode zu generieren, der dann ausgegeben
wird.
-
(Konstanten-Zusammensetzungseinheit 14)
-
Wenn
ein oder mehrere Einrichtungsbefehle für unterteilte Konstanten und
ein Verwendungsbefehl für
unterteilte Konstanten, die aus ein und demselben Verwendungsbefehl
für lange
Konstanten durch die Konstanten-Unterteilungseinheit 12 generiert
werden, durch die parallele Ablaufsteuerungseinheit 13 (in
ein und demselben Zyklus) in ein und dasselbe VLIW gepackt werden,
ersetzt die Konstanten-Zusammensetzungseinheit 14 diese
Befehle durch einen Verwendungsbefehl für lange Konstanten, den sie
durch Zusammensetzen dieser Befehle erhält. In ähnlicher Weise, wenn eine Vielzahl
von Einrichtungsbefehlen für
unterteilte Konstanten, die aus ein und demselben Verwendungsbefehl
für lange Konstanten
generiert worden sind, (in ein und demselben Zyklus) in ein und
dasselbe VLIW gepackt werden, ersetzt die Konstanten-Zusammensetzungseinheit 14 diese
Befehle durch einen Einrichtungsbefehl für unterteilte Konstanten, den
sie durch Zusammensetzen dieser Befehle erhält. Dies entspricht einem Fall,
in dem die Konstanten-Unterteilungseinheit 12 keine lange
Konstante unterteilt haben muss (keine unterteilten Konstanten in
einer Vielzahl von VLIWs angeordnet haben muss).
-
(Code-Ausgabeeinheit 15)
-
Die
Code-Ausgabeeinheit 15 wandelt einen Assemblercode mit
internem Format, der durch die Konstanten-Zusammensetzungseinheit 14 zusammengesetzt
(ersetzt) worden ist, in einen Assemblercode mit Textformat um und
gibt den umgewandelten Code, (den parallelen Assemblercode 43)
als Dateien aus.
-
(Parallele Assemblereinheit 16)
-
Die
parallele Assemblereinheit 16 wandelt den parallelen Assemblercode 43,
der von der Code-Ausgabeeinheit 15 ausgegeben wird, in
eine Maschinensprache um, die für
den VLIW-Prozessor 100, für den der vorliegenden Kompilierer
verwendet wird, reserviert ist, und generiert den Objektcode 44a–44b und
die Verschiebungsinfonnationen 45a–45b. Während dieses
Prozesses werden die Formatinformationen bestimmt, die in dem ersten Feld 51 eines
VLIW angeordnet werden soll. In dem Fall eines VLIW, das zum Beispiel
einen oder mehrere Einrichtungsbefehle für unterteilte Konstanten enthält, generiert
die parallele Assemblereinheit 16 einen Maschinen-Code
für Felder
mit nur einer unterteilten Konstante und die Formatinformationen,
welche die Felder angeben.
-
Jede
der Verschiebungsinformationen 45a–45b setzt sich aus
Informationen zusammen, die den Namen einer Kennung für jeden
Objektcode 44a, die Adresse eines Befehls, der die Kennung
verwendet, und die Größe der Kennung
angibt. Diese Kennungsgröße ist die
Größe, die
von der Konstanten-Unterteilungseinheit 12 bestimmt wird,
(die in dem in 6 gezeigten Schritt S2 bestimmte
Kennungsgröße), und
ist ein temporärer
Wert (16 Bits in dem oben genannten Beispiel) in dem Fall einer
externen Kennung.
-
(Verknüpfereinheit 17)
-
Die
Verknüpfereinheit 17 verknüpft die
Vielzahl von verschiebbarem Objektcode 44a–44b,
der in verschiedenen Kompiliereinheiten generiert wurde, bestimmt
unbestimmte Kennungen, die in dem Objektcode enthalten sind, und
generiert den ausführbaren
Code 46 und die Verschiebungsinformationen 40 für den VLIW-Prozessor 100.
-
9 ist
ein Blockschaltbild, das die detaillierte Konstruktion der Verknüpfereinheit 17 zeigt.
-
Die
Verknüpfereinheit 17 enthält die Kennungsadressen-Berechnungseinheit 22,
die Befehlseinfügungseinheit 23 und
die Ausgabeeinheit 24.
-
Die
Kennungsadressen-Berechnungseinheit 22 berechnet eine Adresse
jeder Kennung, nachdem die Vielzahl von verschiebbarem Objektcode 44a–44b,
der in die Verknüpfereinheit
eingegeben wurde, verknüpft
worden ist. Dadurch wird auch die Größe jeder Kennung bestimmt.
Dieser Prozess ist der gleiche wie derjenige einer Kennungsadressen-Berechnungseinheit
eines üblichen
Kompilierers.
-
Wenn
die Größe einer
Kennung, die durch die Kennungsadressen-Berechnungseinheit 22 berechnet
worden ist, größer als
die Größe ist,
die durch die Verschiebungsinformationen 45a–45b angegeben
wird, welche die Größe ist,
die durch die Konstanten-Unterteilungseinheit 12 bestimmt
worden ist, fügt
die Befehlseinfügungseinheit 23 den
erforderlichen Einrichtungsbefehl für unterteilte Konstanten ein,
um der Situation gerecht zu werden.
-
10 ist
ein Ablaufdiagramm, das die Verarbeitung der Befehlseinfügungseinheit 23 zeigt.
-
Die
Befehlseinfügungseinheit 23 ruft
nacheinander jede Kennung aus dem Objektcode 44a–44b ab,
der in die Verknüpfereinheit 17 eingegeben
wurde, und wiederholt den folgenden Prozess (Schritte S62–S64) für jede der
abgerufenen Kennungen (Schritte S61–S65).
-
Zunächst werden
die Verschiebungsinformationen einer abgerufenen Kennung, (einer
Zielkennung), aus den Verschiebungsinformationen 45a–45b ausgelesen,
die in die Verknüpfereinheit 17 eingegeben
wurden (Schritt S62).
-
Danach
beurteilt die Verknüpfereinheit 17, ob
die Größe, die
von der Kennungsadressen-Berechnungseinheit 22 berechnet
worden ist, größer ist als
diejenige der Zielkennung, die durch die gelesenen Verschiebungsinfonnationen
angegeben wird (Schritt S63).
-
Wenn
dies der Fall ist, werden ein oder mehrere Einrichtungsbefehle für unterteilte
Konstanten generiert, um unterteilte Konstanten zu speichern, die
der Differenz zwischen diesen Größen entsprechen.
Ein neues VLIW, das die generierten Einrichtungsbefehle für unterteilte
Konstanten und einen Nulloperations-Befehl enthält, wird unmittelbar vor dem
VLIW eingefügt,
das den Befehl enthält,
der die Zielkennung verwendet (Schritt S64).
-
Dadurch,
selbst wenn die Größe einer
temporären
Kennung, die durch die Konstanten-Unterteilungseinheit 12 bestimmt
wird, kleiner ist als die tatsächlich
erforderliche Größe, wird
die Differenz zwischen diesen Größen erkannt
und eine notwendige Behandlung vorgenommen.
-
Die
Ausgabeeinheit 24 generiert die Speicherstelleninformationen 40,
welche die Größe jeder Kennung
angeben, die durch die Kennungsadressen-Berechnungseinheit 22 und
eine Befehlsliste, die auf die Kennungen verweist, bestimmt wird,
und gibt die Speicherstelleninformationen 40 mit dem ausführbaren
Code 46 aus, der nach der Verarbeitung der Befehlseinfügungseinheit 23 erhalten
wird.
-
<Funktion des Kompilierers>
-
Das
Folgende ist eine Beschreibung der Funktion der charakteristischen
Elemente des vorliegenden Kompilierers für spezifische Befehle.
-
<Beispiel 1>
-
Die
folgende Beschreibung betrifft eine Funktion der Konstanten-Unterteilungseinheit 12 und der
parallelen Ablaufsteuerungseinheit 13, wobei der in 11A gezeigte serielle Assemblercode durch die
Assemblercode-Generierungseinheit 11 generiert und in die
Konstanten-Unterteilungseinheit 12 eingegeben wird.
-
Der
in 11A gezeigte Assemblercode 401 und 402 wird
im Folgenden beschrieben.
-
{(Befehl 401)
add R1, R2}
-
Der
Wert im Register R1 wird zu dem Wert im Register R2 addiert, und
das Ergebnis wird im Register R2 gespeichert.
-
{(Befehl 402)
Ld (LabeL), R3}
-
Der
Wert, der in dem Bereich mit der Speicheradresse gespeichert ist,
die durch die Kennung "LabeL" angegeben ist, wird
in das Register R3 geladen.
-
(Konstanten-Unterteilungseinheit 12)
-
Im
Folgenden wird unter Bezugnahme auf das in 6 gezeigte
Ablaufdiagramm die Funktion der Konstanten-Unterteilungseinheit 12 beschrieben, wenn
der in 11a gezeigte serielle Assemblercode 42 eingegeben
wird.
-
Die
Konstanten-Unterteilungseinheit 12 wiederholt die Verarbeitung
zum Unterteilen langer Konstanten (Schritte S1–S5) für jeden der drei in 11A gezeigten Befehle. Allerdings enthalten die Befehle 400 und 401 in
diesem Beispiel weder Kennungen noch lange Konstanten und werden
daher nicht verarbeitet.
-
Die
Konstanten-Unterteilungseinheit 12 kann die Größe der Kennung "LabeL" im Befehl 402 nicht bestimmen
und nimmt daher an, dass die Größe 16 Bits
ist (Schritt S2).
-
Dementsprechend
beurteilt die Konstanten-Unterteilungseinheit 12, dass
der Befehl 402 ein Verwendungsbefehl für lange Konstanten ist (Schritt S3)
und ersetzt diesen Verwendungsbefehl für lange Konstanten 402 durch
einen oder mehrere Einrichtungsbefehle für unterteilte Konstanten und
einen Verwendungsbefehl für
unterteilte Konstanten (Schritt S4).
-
11B zeigt einen Code, der durch die Konstanten-Unterteilungseinheit 12 generiert
wird, wenn der in 11A gezeigte serielle Assemblercode 42 eingegeben
wird.
-
Wie
in dieser Figur gezeigt, wird der Verwendungsbefehl für lange
Konstanten 402 in 11A durch
den Einrichtungsbefehl für
unterteilte Konstanten 405 und den Verwendungsbefehl für unterteilte Konstanten 406 ersetzt.
-
(Abhängigkeitsdiagram-Generierungseinheit 20)
-
Die
folgende Beschreibung basiert auf der Annahme, dass der in 11B gezeigte serielle Assemblercode in die parallele
Ablaufsteuerungseinheit 13 eingegeben wird. Die Funktion
der Abhängigkeitsdiagramm-Generierungseinheit 20 in
diesem Fall wird im Folgenden unter Bezugnahme auf das in 7 gezeigte
Ablaufdiagramm beschrieben.
-
Die
Abhängigkeitsdiagramm-Generierungseinheit 20 wiederholt
ein und denselben Prozess für jeden
der drei in 11B gezeigten Befehle (Schritt S11–S29).
-
12 zeigt
das durch die Abhängigkeitsdiagramm-Generierungseinheit 20 generierte
Abhängigkeitsdiagramm
in dem Fall, in dem der in 11B gezeigte
serielle Assemblercode in die parallele Ablaufsteuerungseinheit 13 eingegeben
wird.
-
{(Befehl 403)
mov R0, R1}
-
Die
Abhängigkeitsdiagramm-Generierungseinheit 20 generiert
den Knoten 601, der diesem Befehl 403 entspricht
(Schritt S12).
-
Danach,
weil dieser Befehl auf das Register R0 verweist, sollte eine Verknüpfung von
einem vorherigen Befehl, der das Register R0 definiert, hergestellt
werden (Schritte S13 und S14). Allerdings sind keine vorherigen
Befehle vorhanden, so dass diese Verknüpfung nicht hergestellt werden
kann.
-
In ähnlicher
Weise, weil dieser Befehl 403 das Register R1 definiert,
sollte ein vorheriger Befehl, der das Register R1 steuert, angegeben
werden (Schritte S15 und S16). Allerdings sind keine vorherigen
Befehle vorhanden, so dass keine Verknüpfung hergestellt werden kann.
-
Hier
ist zu beachten, dass dieses Beispiel zum einfacheren Verständnis nur
einen Grundblock, (eine Prozessroutine mit einem Eingang und einem Ausgang),
verwendet. Wenn jedoch ein Abhängigkeitsdiagramm
für ein
Programm generiert wird, das eine Vielzahl von Grundblöcken enthält, Kann
die Vielzahl von Grundblöcken
unter Verwendung virtueller Knoten verarbeitet werden, die vohergehende Grundblöcke und
folgende Grundblöcke
angeben.
-
{(Befehl 404)
add R1, R2}
-
Der
Befehl 404 ist als nächster
zu verarbeiten, und daher generiert die Abhängigkeitsdiagramm-Generierungseinheit 20 den
Knoten 603, der diesem Befehl 404 entspricht (Schritt
S12).
-
Weil
der Befehl 404 auf das Register R1 verweist, spezifiziert
die Abhängigkeitsdiagramm-Generierungseinheit 20 den
vorherigen Befehl 403, der das Register R1 definiert, und
stellt die Verknüpfung 602 von
dem Befehl 403 zu dem Befehl 404 her (Schritte
S13 und S14).
-
Weil
der Befehl 404 das Register R2 definiert, sollte der vorherige
Befehl, der das Register R2 steuert, angegeben werden (Schritte
S15 und S16). Allerdings ist kein solcher vorhergehender Befehl vorhanden,
so dass keine Verknüpfung
hergestellt wird.
-
{(Befehl 405)
sfst LabeL:12u}
-
Der
Befehl 405 ist als nächster
zu verarbeiten, und daher generiert die Abhängigkeitsdiagramm-Generierungseinheit 20 den
Knoten 604, der diesem Befehl 405 entspricht (Schritt
S12).
-
Der
Befehl 405 steuert kein Register oder einen Speicher und
wird daher dem Verknüpfungsprozess
in den Schritten S13–S24
nicht unterzogen.
-
Der
Befehl 405 ist ein Einrichtungsbefehl für unterteilte Konstanten, so
dass die Abhängigkeitsdiagramm-Generierungseinheit 20 versucht,
einen vorherigen Steuerbefehl für
den Konstantenpuffer anzugeben (Schritte S25 und S26). Allerdings
ist kein solcher vorhergehender Befehl vorhanden, so dass keine
Verknüpfung
hergestellt wird.
-
{(Befehl 406)
Ld (LabeL:4L, R3}
-
Abschließend ist
der Befehl 406 ist zu verarbeiten, und daher generiert
die Abhängigkeitsdiagramm-Generierungseinheit 20 den
Knoten 606, der diesem Befehl 406 entspricht (Schritt
S12).
-
Weil
der Befehl 406 das Register R3 definiert, versucht die
Abhängigkeitsdiagramm-Generierungseinheit 20,
einen vorherigen Befehl anzugeben, der das Register R3 steuert (Schritte
S15 und S16).). Allerdings ist kein solcher vorhergehender Befehl vorhanden,
und daher wird keine Verknüpfung
hergestellt.
-
Der
Befehl 406 ist ein Verwendungsbefehl für unterteilte Konstanten, so
dass die Abhängigkeitsdiagramm-Generierungseinheit 20 den
vorherigen Steuerbefehl 405 für den Konstantenpuffer angibt und
die Verknüpfung 605 vom
Befehl 405 zum Befehl 406 herstellt (Schritte
S27 und S28).
-
Auf
diese Weise werden die Verknüpfung 602 vom
Befehl 403 zum Befehl 404 und die Verknüpfung 605 vom
Befehl 405 zum Befehl 406 hergestellt, wie in 12 gezeigt.
-
(Befehlsverschiebungseinheit 21)
-
In Übereinstimmung
mit der Ausfühnungsreihenfolge,
die durch das in 12 gezeigte Abhängigkeitsdiagramm
angegeben wird, verschiebt die Befehlsverschiebungseinheit 21 den
in 11B gezeigten seriellen Assemblercode parallel.
Das Folgende ist eine Beschreibung der Funktion der Befehlsverschiebungseinheit 21 in
diesem Fall unter Bezugnahme auf das in 8 gezeigte
Ablaufdiagramm.
-
Bis
alle der vier Befehle 403–406, die in 11B gezeigt sind, ausgegeben sind, wiederholt die
Befehlsverschiebungseinheit 21 den Ablaufsteuerungs-Zyklus
(Schritte S41–S51),
der einen Prozess zum Generieren der ausgebbaren Befehlsgruppe (Schritt
S42) und einen Prozess zum gleichzeitigen Verbrauchen eines Befehls
in der generierten ausgebbaren Befehlsgruppe (Schritte S43–S50) enthält.
-
(Erster Ablaufsteuerungszyklus)
-
Im
ersten Ablaufsteuerungszyklus generiert die Befehlsverschiebungseinheit 21 eine
Gruppe, die sich aus den drei Befehlen 403, 405 und 406 als
die ausgebbare Befehlsgruppe zusammensetzt (Schritt S42). Der Grund
dafür ist,
dass die Befehle 403 und 405 Befehle ohne Verknüpfungen
von anderen Knoten zu ihren Knoten sind, und der Befehl 406 einem Knoten
entspricht, dessen Verknüpfungsquellenknoten
einem Einrichtungsbefehl für
unterteilte Konstanten entspricht.
-
In
der Ausgabe-Ablaufsteuerungs-Befehlsgruppe gibt es keinen Befehl,
so dass die Befehlsverschiebungseinheit 21 beurteilt, dass
aus Befehlen in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe in Schritt
S44 kein VLIW erstellt werden kann, und der Prozess mit dem ersten
Verbrauchszyklus fortfährt, indem
er einen optimalen Befehl auswählt
(Schritt S45). In diesem Beispiel wird der Befehl 403 ausgewählt.
-
Weil
die Ausgabe-Ablaufsteuerungs-Befehlsgruppe keinen Befehl enthält, verschiebt
die Befehlsverschiebungseinheit 21 den ausgewählten Befehl 403 in
die Ausgabe-Ablaufsteuerungs-Befehlsgruppe (Schritt S47) und entfernt
den Befehl 403 aus der ausgebbaren Befehlsgruppe (Schritt
S48).
-
Zu
diesem Zeitpunkt bleiben die Befehle 405 und 406 in
der ausgebbaren Befehlsgruppe, so dass der Prozess mit dem zweiten
Verbrauchszyklus fortfährt
(Schritt S44–S48).
-
Die
Ausgabe-Ablaufsteuerungs-Befehlsgruppe enthält nicht genügend Befehle,
um ein VLIW zum gegenwärtigen
Zeitpunkt zu füllen,
so dass die Befehlsverschiebungseinheit 21 beurteilt, dass
ein VLIW in Schritt S44 nicht aus Befehlen in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
erstellt werden kann. In diesem Beispiel wählt die Befehlsverschiebungseinheit 21 den
Befehl 405 als einen optimalen Befehl aus (Schritt S45).
-
Beide
ausgewählten
Befehle 405 und 403 in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
sind 12-.Bit-Befehle und können
daher ein VLIW aufbauen. Daher verschiebt die Befehlsverschiebungseinheit 21 die
Befehle 405 in die Ausgabe-Ablaufsteuerungs-Befehlsgruppe
(Schritt S47) und entfernt den Befehl 405 aus der ausgebbaren
Befehlsgruppe (Schritt S48).
-
Zu
diesem Zeitpunkt bleibt nur der Befehl 406 in der ausgebbaren
Befehlsgruppe, und die Ausgabe-Ablaufsteuerungs-Befehlsgruppe enthält die Befehle 403 und 405.
Als Ergebnis dessen beurteilt die Befehlsverschiebungseinheit 21,
dass ein VLIW in Schritt S44 aus Befehlen in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
erstellt werden kann, entfernt diese Befehle 403 und 405 aus
der Ausgabe-Ablaufsteuerungs-Befehlsgruppe und gibt ein VLIW aus,
das diese Befehle enthält
(Schritt S50).
-
Wenn
die Befehlsverschiebungseinheit 21 den Befehl 406 statt
den Befehl 405 als einen optimalen Befehl in dem zweiten
Verbrauchszyklus auswählt
(Schritt S45), ist der Einrichtungsbefehl 405 für unterteilte
Konstanten, von dem eine Verknüpfung
zu dem Knoten des Befehls 406 hergestellt wird, nicht ausgegeben
worden und ist nicht in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
enthalten. Daher beurteilt die Befehlsverschiebungseinheit 21,
dass ein Befehl, der in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
enthalten ist, und ein Zielbefehl in Schritt S46 kein VLIW bilden
können,
und der Befehl 406 wird aus der ausgebbaren Befehlsgruppe
entfernt. Als Ergebnis dessen wird ein und dasselbe VLIW, (das VLIW,
das die Befehle 403 und 405 enthält), in diesem
Fall ausgegeben.
-
11C zeigt VLIWs, (parallelen Assemblercode), der
durch die Befehlsverschiebungseinheit 21 generiert wird,
wenn der in 11B gezeigte serielle Assemblercode
in die parallele Ablaufsteuerungseinheit 13 eingegeben
wird. Es ist zu beachten, dass ein Code in dem ersten Feld 51 eines
VLIW zum einfacheren Verständnis
weggelassen wird.
-
Der
erste Ablaufsteuerungszyklus generiert das VLIW 407, das
in 11C gezeigt wird.
-
(Zweiter Ablaufsteuerungszyklus)
-
Der
zweite Ablaufsteuerungszyklus beginnt mit dem Befehl 406,
der in der ausgebbaren Befehlsgruppe bleibt.
-
Die
Befehlsverschiebungseinheit 21 fügt den Befehl 404 neu
zu der ausgebbaren Befehlsgruppe hinzu (Schritt S42). Der Grund
dafür ist,
dass der Befehl 403 dem Knoten entspricht, von dem eine
Verknüpfung
zu dem Knoten des Befehls 404 hergestellt wird. Als Ergebnis
dessen wird eine ausgebbare Befehlsgruppe, die sich aus den Befehlen 404 und 406 zusammensetzt,
generiert.
-
In
der Ausgabe-Ablaufsteuerungs-Befehlsgruppe ist kein Befehl vorhanden,
so dass die Befehlsverschiebungseinheit 21 beurteilt, dass
in Schritt S44 kein VLIW aus Befehlen in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
hergestellt werden kann, und der Prozess fährt mit dem ersten Verbrauchszyklus
fort, indem ein optimaler Befehl ausgewählt wird (Schritt S45). In
diesem Beispiel wählt
die Befehlsverschiebungseinheit 21 den Befehl 404 aus.
-
In
diesem Fall ist in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe kein
Befehl vorhanden, so dass die Befehlsverschiebungseinheit 21 den
Befehl 404 in die Ausgabe-Ablaufsteuerungs-Befehlsgruppe verschiebt
(Schritt S47) und den Befehl 404 aus der ausgebbaren Befehlsgruppe
entfernt (Schritt S48).
-
Zu
diesem Zeitpunkt bleibt nur der Befehl 406 in der ausgebbaren
Befehlsgruppe. Der Prozess fährt
mit dem zweiten Verbrauchszyklus in der gleichen Weise fort, wie
beim ersten Ablaufsteuerungszyklus, so dass der Befehl 406 ebenfalls
von der ausgebbaren Befehlsgruppe in die Ausgabe-Ablaufsteuerungs-Befehlsgruppe übertragen
wird (Schritte S44–S48).
-
Die
Ausgabe-Ablaufsteuerungs-Befehlsgruppe enthält die Befehle 404 und 406 zum
gegenwärtigen
Zeitpunkt, so dass die Befehlsverschiebungseinheit 21 beurteilt,
dass in Schritt S44 ein VLIW aus Befehlen in der Ausgabe-Ablaufsteuerungs-Befehlsgruppe
erstellt werden kann. Die Befehle 404 und 406 werden
aus der Ausgabe-Ablaufsteuerungs-Befehlsgruppe entfernt und als
das zweite VLIW ausgegeben (Schritt S50). Das heißt, der zweite
Ablaufsteuerungszyklus generiert das VLIW 408, das in 11C gezeigt ist.
-
Dadurch
packt die Befehlsverschiebungseinheit 21 alle Befehle,
die in die parallele Ablaufsteuerungseinheit 13 eingegeben
wurden, in VLIWs, die sie dann ausgibt (Schritte S41–S51). Dann
beendet die Befehlsverschiebungseinheit 21 ihren Ablaufsteuerugsprozess.
-
(Vergleich mit einem üblichen
Kompilierer)
-
Zwei
in 11C gezeigte VLIWs werden aus dem in 11A gezeigten seriellen Assemblercode durch die
Verarbeitung der Konstanten-Unterteilungseinheit 12 und
der parallelen Ablaufsteuerungseinheit 13 generiert. Dieser
Prozess wird mit dem Fall eines üblichen
Kompilierers verglichen, um die Merkmale des vorliegenden Kompilierers
aufzuzeigen.
-
13 ist
ein Blockschaltbild, das die Konstruktion des üblichen Kompilierers zeigt.
-
Während die
grundlegenden Funktionen des üblichen
Kompilierers die gleichen sind wie diejenigen des Kompilierers der
Ausführungsform,
besitzt der übliche
Kompilierer nicht die Funktionen, die der Konstanten-Unterteilungseinheit 12 und
der Konstanten-Zusammensetzungseinheit 14 entsprechen. Daher
besitzt der übliche
Kompilierer nicht die Funktionen, die den anderen Elementen 910–917, 920 und 921 entsprechen.
-
Wenn
die Assemblercode-Generierungseinheit 911 daher beispielsweise
den in 11A gezeigten seriellen Assemblercode
generiert, wird der serielle Assemblercode in die parallele Ablaufsteuerungseinheit 913 so
eingegeben, wie er ist. Als Ergebnis dessen generiert die Abhängigkeitsdiagramm-Generierungseinheit 920 das
in 14 gezeigte Abhängigkeitsdiagramm.
-
Die
Befehlsverschiebungseinheit 921 verschiebt die in 11A gezeigten Befehle gemäß dem Abhängigkeitsdiagramm 925.
Wie in 14 gezeigt, hängen die
Befehle 400 und 401 voneinander ab und können so
nicht nebeneinander vorhanden sein, (können kein VLIW konstruieren).
Der Befehl 402 ist 24 Bits lang, so dass der Befehl 402 nicht
mit anderen Befehlen 400 und 401 nebeneinander
vorhanden sein kann. Daher generiert die Befehlsverschiebungseinheit 921 drei
VLIWs 930–932,
die in 15 gezeigt sind.
-
Wie
durch Vergleichen von 15 und 11C ersichtlich
ist, ist die Code-Größe des parallelen
Assemblercodes, der durch den üblichen
Kompilierer generiert wird, größer als
diejenige der Ausführungsform
von einem VLIW. Daher ist ein weiterer Zyklus für die Ausführung des Codes erforderlich,
der durch den üblichen
Kompilierer generiert wird.
-
Der
Grund dafür
ist, dass der Kompilierer der Ausführungsform das VLIW 932 in 15 in
kleine Befehle unterteilt, (einen oder mehrere Einrichtungsbefehle
für unterteilte
Konstanten und einen Verwendungsbefehl für unterteilte Konstanten),
und die kleinen Be fehle in den VLIWs 930 und 931 angeordnet werden,
um die redundanten Bereiche in diesen VLIWs zu füllen.
-
<Beispiel 2>
-
Das
Folgende ist eine Beschreibung der Funktion der Verknüpfereinheit 17 und
des Optimierungsprozesses in dem Fall, in dem der in 17A gezeigte serielle Assemblercode durch die
Assemblercode-Generierungseinheit 11 generiert wird und
in die Konstanten-Unterteilungseinheit 12 eingegeben wird.
-
(Verknüpfereinheit 17)
-
17A–17G zeigen eine Reihe eines spezifischen Codes
und dazugehörige
Informationen zur Erläuterung
der Funktion der Verknüpfereinheit 17.
-
17A zeigt den seriellen Assemblercode 42,
der durch die Assemblercode-Generierungseinheit 11 von
Beispiel 2 generiert worden ist. 17B zeigt
einen Code, der durch die Konstanten-Unterteilungseinheit 12 generiert
worden ist, in die der serielle Assemblercode 42 eingegeben
wird. 17C zeigt einen parallelen Assemblercode,
der durch die parallele Ablaufsteuerungseinheit 13 generiert
worden ist, in die der generierte Code eingegeben wird. 17D und 17E zeigen
den Objektcode 44a und die Verschiebungsinformationen 45a,
die durch die parallele Assemblereinheit 16 generiert worden sind,
in die der generierte parallele Assemblercode eingegeben wird. 17F und 17G zeigen
den ausführbaren
Code 46 und die Speicherstelleninformationen 40,
die durch die Verknüpfereinheit 17 generiert
worden sind, in die der Objektcode 44a und die Verschiebungsinformationen 45a eingegeben werden.
-
In
diesem Beispiel ist zu beachten, dass für die ausführliche Erläuterung des Codes, der durch die
Assemblercode-Generierungseinheit 11, die Konstanten-Unterteilungseinheit 12 und
die parallele Ablaufsteuerungseinheit 13 generiert wird, 17A–17C zusätzliche
Informationen anzeigen, die durch Codes gefolgt von dem Zeichen "@" angegeben werden, wobei die zusätzlichen
Informationen zusammen mit jedem Befehl generiert werden. Diese
zusätzlichen
Informationen enthalten einen Kennzeichner zum Spezifizieren jedes
Befehls und von Informationen, die sich auf unterteilte Konstanten
beziehen.
-
Die
zusätzliche
Information "@ID
Zahl", die in 17A gezeigt ist, ist der Kennzeichner eines Befehls
(ein Befehlskennzeichner) in der gleichen Zeile. In 17B stellen die zusätzlichen Informationen "LbU12" und "LbL4" jeweils die höherwertigen
12 Bits und die niederwertigen 4 Bits der Kennung "LabeL" dar, die zusätzliche
Information "S16", (die Größeninformation),
gibt an, dass die Kennung "LabeL" unterteilt ist,
wobei ihre Größe mit 16
Bits angenommen wird, und die zusätzliche Information "M" gibt an, dass der vorliegenden Befehl
der erste in den Befehlen zum Speichern von unterteilten Teilen
der Kennung "LabeL" in den Konstantenpuffer 107 ist.
-
Der
in 17A gezeigte Befehl "DS" ist
ein Dummy-Befehl zum Verwalten eines Speicherbereichs (4 Bytes)
zum Speichern der Kennung "LabeL".
-
Der
in 17D gezeigte Objektcode 44a und die in 17E gezeigten Verschiebungsinformationen 45a werden
in die Verknüpfereinheit 17 eingegeben.
-
In 17D geben die "Speicherstelleninformationen" in dem Objektcode
relative Adressen jedes Befehls durch Offsets (in Byte-Einheiten)
ab dem Beginn eines spezifischen Speicherbereichs (eines Segments
oder eines Abschnitts) an. Das Zeichen "0x" gibt
an, dass die auf das Zeichen folgende Zahl in hexadezimaler Weise
ausgedrückt
wird. Die Zeichen "LabeL:12u" und "LabeL:4L" stellen jeweils
die höherwertigen
12 Bits und die niederwertigen 4 Bits der Kennung "LabeL" dar, wobei die beiden
Teile unterteilte Konstanten sind.
-
Wie
in 17E gezeigt, setzen sich die Verschiebungsinformationen 45a aus
der "Kennung", den Speicherstelleninformationen", welche die Speicherstelle
eines Befehls angeben, der auf die Kennung verweist, und den "zusätzlichen
Informationen" zusammen,
die den Befehl begleiten. Hier setzen sich die Speicherstelleninformationen
aus einer Adresse eines VLIW und einer Zahl zusammen, welche die
Speicherstelle eines Einheitsoperationsfelds in dem VLIW angibt,
das einen Befehl enthält,
der auf die Kennung verweist, wobei die VLIW-Adressenwerte sich
um 32 Bits (4 Bytes) voneinander unterscheiden.
-
In
diesem Beispiel wird auf die Kennung "LabeL" durch einen Befehl verwiesen, der in
dem dritten Operationsfeld des VLIW angeordnet ist, das sich an der
relativen Adresse "0x1000" befindet, und dieses VLIW
enthält
die zusätzlichen
Informationen "ID102. LbU12.
S16. M". Auf die
Kennung "LabeL" wird auch durch
den Befehl verwiesen, der in dem dritten Operationsfeld des VLIW
angeordnet ist, das sich an der relativen Adresse "0x1004" befindet, und dieses VLIW
enthält
die zusätrlichen
Informationen "ID102. LbL4.
S16".
-
Das
Folgende ist eine Beschreibung der Funktion der Verknüpfereinheit 17,
wenn der (in 17D gezeigte) Objektcode 44a und
die (in 17E gezeigten) Verschiebungsinformationen empfangen
werden.
-
In
diesem Beispiel berechnet die Kennungsadressen-Berechnungseinheit 22,
dass die endgültige
Größe der Kennung "LabeL" 28 Bits beträgt, indem
auf anderen, gleichzeitig eingegebenen Objektcode verwiesen wird.
-
Die
Befehlseinfügungseinheit 23 richtet
die Kennung "LabeL" als die Zielkennung
ein (Schritt S61) und extrahiert Verschiebungsinformationen der Zielkennung "LabeL" aus den Verschiebungsinformationen 45a,
die in die Verknüpfereinheit 17 eingegeben
wurden (Schritt S62).
-
Die
Befehlseinfügungseinheit 23 vergleicht die
Größeninformation "S16", die in den zusätzlichen Informationen
der Verschiebungsinformationen enthalten ist, mit der Größe " 28 Bits" der Zielkennung, die
durch die Kennungsadressen-Berechnungseinheit 22 berechnet
worden ist (Schritt S63).
-
In
diesem Fall ist die Größe, die
von der Kennungsadressen-Berechnungseinheit 22 berechnet worden
ist, größer als
die Größe, die
durch die Größeninformation
angegeben wird. Daher spezifiziert die Befehlseinfügungseinheit 23 eine
der Verschiebungsinformationen 429 oder 430 für die in 17E gezeigte Kennung "LabeL", welche die zusätzliche Information "M" enthält, (in diesem Beispiel die
Verschiebungsinformation 429). Dann fügt die Befehlseinfügungseinheit 23 ein
neues VLIW ein, das einen Nulloperations- (nop) Code und einen oder mehrere
Einrichtungsbefehle für
unterteilte Konstanten unmittelbar vor dem VLIW 425 enthält, das
den Speicherstelleninformationen (0x100. 3) entspricht (Schritt
S64).
-
Wie
in 17F gezeigt, wird das sich daraus ergebende VLIW 431 zusätzlich unmittelbar
vor dem VLIW 432 eingefügt.
Es ist zu beachten, dass in diesem VLIW 431 die Kennung "LabeL:12u" die höherwertigen
12 Bits der 28-Bit-Kennung "LabeL" angibt, das heißt, Bits,
welche die 16 Bits überschreiten,
die durch die Größeninformation
der Verschiebungsinformationen angegeben werden. In dem VLIW 432 gibt
die unterteilte Konstante "LabeL:12m" ebenso die mittleren
12 Bits der 28-Bit-Kennung "LabeL" an.
-
Auf
diese Weise, wenn sich die temporäre Kennungsgröße, die
während
des Kompilierens, (der Konstantenunterteilung durch die Konstanten-Unterteilungseinheit 12),
angenommen wird, von der endgültigen
Kennungsgröße unterscheidet,
wird ein Befehl eingefügt,
um die Differenz zu korrigieren.
-
Schließlich generiert
die Ausgabeeinheit 24 die Speicherstelleninformationen 40,
welche die Kennungsgröße enthalten,
die durch die Kennungsadressen-Berechnungseinheit 22 berechnet
worden ist, und gibt die Speicherinformationen mit dem ausführbaren
Code 46 aus, der erhalten worden ist, nachdem die Befehlseinfügungseinheit 23 den
Befehlseinfügungsprozess
durchgeführt
hat (17F).
-
Die
Speicherstelleninformationen 436 der Kennung "LabeL" enthalten die Kennungsgröße "28" und den Kennzeichner "@ID102" des Befehls, der auf
die Kennung verweist. Wenn hier die (später beschriebene) Optimierung,
die diese Speicherstelleninformationen 40 verwendet, nicht
durchgeführt
wird, wird diese Ausgabe von der Verknüpfereinheit der endgültige ausführbare Code 46.
-
(Optimierung unter Verwendung
der Speicherstelleninformationen 40)
-
Das
Folgende ist eine Beschreibung der Funktion des Kompilierers, wenn
die oben beschriebenen Speicherstelleninformationen 40 in
die Konstanten-Unterteilungseinheit 12 zurück eingespeist werden,
und die Verarbeitung durch die folgenden Einheiten wiederholt wird.
-
18A–18E zeigen einen Code und dazugehörige Informationen,
die von jedem Komponentenelement generiert werden, wenn die generierten
Speicherstelleninformationen 40 in die Konstanten-Unterteilungseinheit 12 zurück eingespeist
werden.
-
18A zeigt den Code, der durch die Konstanten-Unterteilungseinheit 12 aus
dem in 17A gezeigten seriellen Assemblercode 42 und
den in 17G gezeigten Speicherstelleninformationen 40 generiert
worden ist. 18B zeigt einen parallelen Assemblercode,
der durch die parallele Ablaufsteuerungseinheit 13 aus
dem generierten Code generiert worden ist. 18C und 18D zeigen jeweils den Objektcode 44a und
die Verschiebungsinformationen 45a, die durch die parallele
Assemblereinheit 16 aus dem parallelen Assemblercode generiert
worden sind. 18E zeigt den ausführbaren
Code, der durch die Verknüpfereinheit 17 aus
dem Objektcode 44a und den Verschiebungsinformationen 45a generiert
worden ist.
-
Unter
Verweis auf die eingegebenen Speicherstelleninformationen 40 bestimmt
die Konstanten-Unterteilungseinheit 12, dass die Größe der externen
Kennung des Befehls mit dem Befehlskennzeichner "ID102" 28 Bits beträgt, (Schritt S2 in 6),
und unterteilt die 28-Bit-Kennung "LabeL" (Schritte S3 und S4). Als Ergebnis
dessen wird der Befehl 412 in 17A durch
drei Befehle 442–444 ersetzt,
die in 18A gezeigt sind. Die zusätzliche Information "LbM12" des Befehls 443 gibt
an, dass dieser Befehl auf die mittleren 12 Bits der Kennung "LabeL" verweist.
-
Die
parallele Ablaufsteuerungseinheit 13 generiert einen parallelen
Assemblercode ohne Nulloperations- (nop) Codes (siehe 18B), indem ein Abhängigkeitsdiagramm und Verschiebungsbefehle gemäß dem in 7 und 8 gezeigten
Verfahren generiert werden.
-
Die
parallele Assemblereinheit 16 generiert den Objektcode 44a,
der dem parallelen Assembler-Code (siehe 18C)
und den Verschiebungsinformationen 45a (siehe 18D) entspricht. Es ist zu beachten, dass
die in 18C gezeigte Legende "LabeL.12m" die mittleren 12
Bits der Kennung "LabeL" darstellt.
-
In
der Verknüpfereinheit 17 berechnet
die Kennungsadressen-Verknüpfungseinheit 22,
dass die Größe der Kennung "LabeL" wiederum 28 Bits beträgt, und
daher fügt
die Be fehlseinfügungseinheit 23 keinen
weiteren Befehl ein, der sich auf die Kennung "LabeL" bezieht (Schritt S63 in 10).
Daher wird der in 18E gezeigte ausführbare Code 46 generiert.
-
Wie
aus einem Vergleich der 18E und 17F ersichtlich ist, ist die Code-Größe des ausführbaren
Codes, der durch Zurücksenden
der Speicherstelleninformationen 40 an die Konstanten-Unterteilungseinheit 12 (siehe 18E) optimiert worden ist, kleiner als diejenige
des anderen ausführbaren
Codes (siehe 17F) von einem VLIW.
-
Hier
ist zu beachten, dass der ausführbare Code,
der auf diese Weise generiert worden ist, (siehe 18E), zu Zielumgebungen, die mit VLIW-Prozessoren 100 ausgestattet
sind, mittels eines Aufzeichnungsmediums transportiert werden kann,
wie beispielsweise einer Diskette, einer CD-ROM oder einem Halbleiterspeicher
oder durch Datenübertragungen über ein Übertragungsmedium.
-
<Beispiel 3>
-
Das
Folgende ist eine Beschreibung der Funktion der Konstanten-Unterteilungseinheit 12 und der
parallelen Ablaufsteuerungseinheit 13 in dem Fall, in dem
ein serieller Assemblercode 42, der einen in 19A gezeigten Sprungbefehl enthält, durch
die Assemblercode-Generierungseinheit 11 generiert wird
und in die Konstanten-Unterteilungseinheit 12 eingegeben
wird.
-
19A zeigt den seriellen Assemblercode 42,
der durch die Assemblercode-Generierungseinheit 11 von
Beispiel 3 generiert worden ist.
-
Der
Sprungbefehl 473 in dieser Figur wird im Folgenden beschrieben.
-
{(Befehl 473)
caLL_func}
-
Die
Ausführungssteuerung
des VLIW-Prozessors 100 bewegt sich zur Sprungkennung "_func".
-
In
diesem Beispiel ist die Größe dieser Sprungkennung "_func" 12 Bits lang, und
das Argument R1 wird auf die Funktion "_func" übertragen, wenn
die Steuerung zu der Funktion verzweigt.
-
19B zeigt den Code, der durch die Konstanten-Unterteilungseinheit 12 aus
dem in 19A gezeigten seriellen Assemblercode 42 generiert
worden ist.
-
Der
Sprungbefehl 473 wird von der 12-Bit-Sprungkennung "_func" begleitet, so dass
der Befehl 473 in den Einrichtungsbefehl 477 für unterteilte
Konstanten zum Speichern der Sprungkennung "_func" in dem Konstantenpuffer 107 und
den Verwendungsbefehl 478 für unterteilte Konstanten, der dem
Operations-Code "caLL" des Sprungbefehls 473 entspricht,
unterteilt wird.
-
19C zeigt ein Abhängigkeitsdiagramm, das durch
die Abhängigkeitsdiagramm-Generierungseinheit 20 in
dem Fall generiert wird, in dem der in 19B gezeigte
Code eingegeben wird.
-
Weil
das Argument R1 in der Funktion "_func" verwendet wird,
hängt der
Sprungbefehl 478 vom Befehl 474 ab.
-
19D zeigt die ausgebbare Befehlsgruppe und die
Ausgabe-Ablaufsteuerungs-Befehlsgruppe, die temporär durch
die Befehlsverschiebungseinheit 21 in dem Fall generiert
wird, in dem der in 19B gezeigte Code und das in 19C gezeigte Abhängigkeitsdiagramm eingegeben
werden.
-
In
dem zweiten Ablaufsteuerungszyklus wird der Sprungbefehl (caLL) 478 in
die Ausgabe-Ablaufsteuerungs-Befehlsgruppe aufgenommen.
-
19E zeigt den parallelen Assemblercode, der durch
die Befehlsverschiebungseinheit 21 generiert worden ist.
Diese Figur zeigt auch den Code in dem ersten Feld 51 von
VLIWs.
-
Auf
diese Weise generieren die Konstanten-Unterteilungseinheit 12 und
die parallele Ablaufsteuerungseinheit 13 des vorliegenden
Kompilierers den parallelen Assemblerco de von zwei VLIWs, die in 19E gezeigt sind, aus dem in 19A gezeigten seriellen Assemblercode.
-
Das
Folgende ist eine Beschreibung des Falles, in dem der gleiche serielle
Assemblercode 42 in einen üblichen Kompilierer eingegeben
wird.
-
16 zeigt
einen parallelen Assemblercode, der durch den üblichen Kompilierer generiert werden
kann.
-
Der übliche Kompilierer
kann den in 19A gezeigten Sprungbefehl 473 nicht
unterteilen, so dass wenigstens ein 13-Bit-Feld, nämlich zwei
aufeinander folgende Felder, für
diesen Befehl erforderlich sind. Daher wird ein paralleler Assemblercode
für drei
VLIWs 940–942 generiert,
und in diesen VLIWs sind viele redundante Bereiche vorhanden.
-
<Beispiel 4>
-
Die
folgende Beschreibung konzentriert sich auf die Funktion der Konstanten-Zusammensetzungseinheit 14 in
dem Fall, in dem der in 20A gezeigte
serielle Assemblercode 42 durch die Assemblercode-Generierungseinheit 11 generiert
wird und in die Konstanten-Unterteilungseinheit 12 eingegeben
wird.
-
20A zeigt den seriellen Assemblercode 42,
der durch die Assemblercode-Generierungseinheit 11 von
Beispiel 4 generiert worden ist.
-
Es
ist zu beachten, dass in diesem Beispiel, während die Größe der Sprungkennung "_func", die durch den Sprungbefehl 803 verwendet
wird, wie in Beispiel 3 12 Bits beträgt, kein Argument zur Funktion "_func" übertragen wird, wenn die Steuerung
zu der Funktion verzweigt.
-
20B zeigt den Code, der durch die Konstanten-Unterteilungseinheit 12 aus
dem in 20A gezeigten seriellen Assemblercode 42 generiert
worden ist.
-
Der
Sprungbefehl 503 wird wie in Beispiel 3 in den Einrichtungsbefehl 507 für unterteilte
Konstanten und den Verwendungsbefehl 508 für unterteilte Konstanten
unterteilt.
-
20C zeigt ein Abhängigkeitsdiagramm, das durch
die Abhängigkeitsdiagramm-Generierungseinheit 20 aus
dem in 20B gezeigten Code generiert
worden ist.
-
20D zeigt die ausgebbare Befehlsgruppe
und die Ausgabe-Ablaufsteuenmgs-Befehlsgruppe, die temporär durch
die Befehlsverschiebungseinheit 21 aus dem in 20B gezeigten Code und dem in 20C gezeigten Abhängigkeitsdiagramm generiert
worden ist.
-
Im
Gegensatz zu Beispiel 3 werden in dem zweiten Ablaufsteuerungszyklus
der Einrichtungsbefehl 507 für unterteilte Konstanten und
der Verwendungsbefehl 508 für unterteilte Konstanten in
die Ausgabe-Ablaufsteuerungs-Befehlsgruppe aufgenommen.
-
20E zeigt den parallelen Assemblercode, der durch
die Befehlsverschiebungseinheit 21 generiert worden ist.
-
Der
parallele Assemblercode setzt sich aus zwei VLIWs 509 und 510 zusammen.
Die aus dem Sprungbefehl 503 generierten Befehle 507 und 508 werden
jeweils in dem ersten Feld 51 und dem zweiten Feld 52 des
VLIW 510 angeordnet.
-
20F zeigt den Code, der durch die Konstanten-Zusammensetzungseinheit 13 aus
dem in 20E gezeigten parallelen Assemblercode
generiert worden ist.
-
Die
Konstanten-Zusammensetzungseinheit 14 erkennt, dass der
Einrichtungsbefehl 507 für unterteilte Konstanten und
der Verwendungsbefehl 508 für unterteilte Konstanten, die
aus ein und demselben Verwendungsbefehl für lange Konstanten, (dem Sprungbefehl 503),
generiert worden sind, in ein und demselben VLIW angeordnet sind.
Dementsprechend ersetzt die Konstanten-Zusammensetzungseinheit 14 diese
Befehle 507 und 508 durch einen Verwendungsbefehl
für lange
Konstanten, (einen Befehl mit dem gleichen Format wie der ursprüngliche Sprungbefehl 503),
der erhalten wird, indem die Befehle 507 und 508 zusammengesetzt
werden. Dadurch werden Probleme gelöst, die verursacht werden,
wenn die Konstanten-Unterteilungseinheit 12 eine Konstante
unnötigerweise
unterteilt, (da unterteilte Konstanten die unterteilten Konstanten
nicht in einer Vielzahl von VLIWs angeordnet haben müssen).
-
Der
Zielprozessor des Kompilierers der Ausführungsform ist dem VLIW-Prozessor ähnlich,
der durch die japanische offengelegte Patentanmeldung H9-159058
oder H9-159059 offenbart
worden ist. Der vorliegende Kompilierer kann für jeden konstantenrekonstruierenden
Prozessor verwendet werden, der ein Programm ausführt, das
durch Unterteilen von Befehlen in Teile und Anordnen der unterteilten
Befehlsteile in einer Vielzahl von VLIWs erstellt wird.
-
Während der
Kompilierer der Ausführungsform
VLIWs in zwei in den 2A und 2B gezeigten
Formaten generiert, kann dieser Kompilierer VLIWs in jedem Formattyp
generieren, wie beispielsweise VLIWs, die sich jeweils aus drei
16-Bit-Operationsfeldern zusammensetzen. Der Grund dafür ist, dass
die vorliegende Erfindung eine Technik zum Unterteilen von Konstanten
ist, die in Befehlen enthalten sind, und zum Durchführen einer
parallelen Ablaufsteuerung gemäß der Größe der Operationsfelder von
VLIWs.
-
Der
VLIW-Prozessor 100, welcher der Zielprozessor des Kompilierers
der Ausführungsform
ist, enthält
ein 32-Bit-Schieberegister (den Konstantenpuffer 107).
Das Schieberegister wird, unmittelbar nachdem auf einen in dem Schieberegister
gespeicherten Wert verwiesen wird, mit Nullen (0) gefüllt. Die
vorliegende Erfindung ist jedoch nicht darauf beschränkt, dass
der Prozessor mit dem Konstantenpuffer 107 auf diese Weise
arbeitet. Die vorliegende Erfindung kann für einen Prozessor mit einem
Konstantenpuffer zum Speichern von zwei oder mehreren unabhängigen Konstanten
und zum Verwenden von Befehlen verwendet werden, die explizit Speicherbereiche
der Konstanten angeben und den verwendeten Inhalt löschen. Insbesondere,
wenn ein Einrichtungsbefehl für
unterteilte Konstanten generiert wird, kann auch ein Befehl zum
Angeben des Speicherbereichs generiert werden. Und wenn ein Verwendungsbefehl
für unterteilte
Konstanten generiert wird, kann auch ein Befehl zum Löschen des
Inhalts generiert werden.
-
In
der Ausführungsform
werden feste Werte, wie beispielsweise 4 Bits oder 12 Bits verwendet, wenn
Konstanten unterteilt werden. Die vorliegende Erfindung ist jedoch
nicht auf diese Werte beschränkt.
-
Wenn
in der Ausführungsform
die Größe einer
Kennung nicht bestimmt werden kann, wird angenommen, dass die Größe die häufigste
Adressengröße (16 Bits)
besitzt. Die Größe kann
jedoch auch als die maximale Adressengröße des Zielprozessors angenommen
werden. Des Weiteren, wenn eine Konstante, deren Größe nicht
bestimmt werden kann, ein Operand für einen Transfer-/arithmetisch-logischen Befehl
ist, kann die Größe der Konstante
als die maximale Konstantengröße des Zielprozessors
oder als die häufigste
Konstantengröße angenommen
werden. Die angenommene Größe kann
als ein Standardwert vorab gespeichert oder durch einen Benutzer
als eine Option angegeben werden, wenn der Kompilierer aktiviert
wird.
-
Wie
aus der speziellen Beschreibung für Schritt S4 in 6 klar
wird, kann die Funktion der Konstanten-Unterteilungseinheit 12 von
zwei Standpunkten aus ausgedrückt
werden. Das heißt,
von dem ersten Standpunkt aus arbeitet die Konstanten-Unterteilungseinheit 12 als
ein Mittel zum Unterteilen jedes Befehls, der eine Konstante enthält, aus eingegebenen
Befehlen, (jedem Verwendungsbefehl für lange Konstanten), in eine
Vielzahl von Befehlen (einen oder mehrere Einrichtungsbefehle für unterteilte
Konstanten und einen Verwendungsbefehl für unterteilte Konstanten),
wie in 21A gezeigt. Von dem zweiten
Standpunkt aus arbeitet die Konstanten-Unterteilungseinheit 12 als
ein Mittel zum Unterteilen jeder Konstante in eingegebenen Befehle,
(jeder 28 Bit langen Konstante), in eine Vielzahl von Teilen und
zum Generieren einer Vielzahl von Befehlen, die jeweils die unterteilten
Konstanten-Teile enthalten, (einen Einrichtungsbefehl für unterteilte
Konstanten für
die unterteilte Konstante mit den höherwertigen 12 Bits, einen
Einrichtungsbefehl für
unterteilte Konstanten für
die unterteilte Konstante mit den mittleren 12 Bits und einen Verwendungsbefehl
für unterteilte
Konstanten für
die kurze Konstante mit den niederwertigen 12 Bits) gemäß den eingegebenen
Befehlen, wie in 21B gezeigt.
-
In
Beispiel 1 fügt
die Befehlsverschiebungseinheit 21 zu dem Befehl 406,
der in der ausgebbaren Befehlsgruppe in dem ersten Ablaufsteuerungszyklus
bleibt, den Befehl 404, mit dem zweiten Zyklus fortzufahren,
hinzu. Die Befehlsverschiebungseinheit 21 kann jedoch den
Inhalt der ausgebbaren Befehlsgruppe löschen und für jeden Zyklus neu berechnen.
-
Hier
ist zu beachten, dass ein ausführbarer Code,
der durch den Kompilierer der Ausführungsform generiert worden
ist, zu einer Zielumgebung, die den generierten Code ausführt, mittels
eines Aufzeichnungsmediums, wie beispielsweise einer Diskette, einer CD-ROM
oder einem Halbleiterspeicher oder über Datenübertragungen über ein Übertragungsmedium
transportiert werden kann.
-
22 zeigt
einen vereinfachten Inhalt der CD-ROM 200, welche die in 18E gezeigte VLIW-Folge 201 und die in 9E gezeigte VLIW-Folge 202 aufzeichnet,
die durch den Kompilierer der Ausführungsform generiert worden
sind. In der VLIW-Folge 201 enthalten die zwei VLIWs 458 und 459 Konstanten,
die zusammengesetzt und in dem Speicherpuffer des Prozessors, der
durch die VLIW-Folge implizit angegeben wird, gespeichert werden
sollen. Das VLIW 460 folgt auf die zwei VLIWs 458 und 459 und
ist das erste VLIW, das auf den Speicherpuffer verweist. Dieses
VLIW 469 enthält
eine Konstante und den Befehl (Ld) zum Verwenden einer Konstante,
die erhalten wird, indem die Konstante und die in den zwei oder
mehreren VLIWs enthaltenden Konstanten zusammengesetzt werden. In
der VLIW-Folge 202 enthält
das VLIW 480 die Konstante (sfst), die in dem Speicherpuffer
des Prozessors, der durch die VLIW-Folge implizit angegeben wird,
gespeichert werden soll. Das VLIW 481, das auf das VLIW 480 folgt
und das erste VLIW ist, das auf den Speicherpuffer verweist, enthält den Befehl
(caLL) zum Verwenden der Konstante (_func), die in dem Speicherpuffer
gespeichert ist.
-
Der
Kompilierer selbst der vorliegenden Erfindung kann ebenfalls in
einem Aufzeichnungsmedium gespeichert werden, wie beispielsweise
einer Diskette, einer CD-ROM oder einem Halbleiterspeicher, und
wie ein durch den Kompilierer erhaltener ausführbarer Code verteilt werden.