-
Hintergrund
-
Die
vorliegende Erfindung betrifft die Emulation von Software, wie die
dynamische Übersetzung,
und betrifft insbesondere die Emulation von asynchronen Signalen
unter Verwendung eines Verzweigungsmechanismus z. B. während einer
dynamischen Übersetzung.
-
Eine
erfolgreiche transparente Migration alter Software auf eine neue
Plattform bringt die vollständige Emulation
der Umgebung der Ursprungsmaschine (source machine) auf der neuen
Maschine mit sich. Eine der größeren Schwierigkeiten
bei der Implementierung ist die Signalhandhabung oder -verarbeitung,
und einer der schwierigeren Teile der Signalverarbeitung bei der
Emulation ist die Abgabe asynchroner Signale. Asynchrone Signale
können
zu jedem Zeitpunkt auftreten. Bei ihrem Empfang wird das Emulationssystem
unterbrochen. Das Emulationssystem muß seinerseits die Unterbrechung
des Ursprungs-Ausführungsprogramms (source
executable), das gerade emuliert wird, simulieren, indem es die
Verarbeitungsroutine des Ursprungs-Ausführungsprogramms (source executable
handler) für
das Signal emuliert, wobei die vollständige Zustandsinformation der
Verarbeitungsroutine des Ursprungs-Ausführungsprogramms
(source executable handler) weitergegeben wird. Die Erfassung der
vollständigen
Zustandsinformation während
der Emulation ist häufig
schwierig oder teuer.
-
Ferner
kann bei effizienten Emulatoren, wie dynamische Übersetzungseinrichtungen, ein
großer
Leistungsvorteil erzielt werden, wenn die Ursprungsoperationen (source
operations) neu geordnet werden und nur der Ursprungscode emuliert
wird, der absolut notwendig ist. Dadurch entstehen jedoch Konflikte
mit der Fähigkeit,
die Zustandsinformation für
die Übertragung
an eine Verarbeitungsroutine eines Ursprungs-Ausführungsprogramms
wiederzugewinnen. Die effiziente Emulation verläßt sich insbesondere auf die
Begrenzung der Anzahl der Punkte, bei denen vollständige Zustandsinformation „erfaßbar" sein muß. Dies
steht jedoch im Konflikt mit der Notwendigkeit, zu jeder Zeit vollständige Zustandsinformation
erfassen zu können,
weil das Auftreten asynchroner Signale zu jeder Zeit erfolgen kann.
-
Überblick über die
Erfindung
-
Gemäß der bevorzugten
Ausführung
der beanspruchten Erfindung wird ein Verfahren zur Erleichterung
der Übertragung
der Kontrolle von einer normalen Emulation in einem Emulationssystem
auf eine Verarbeitungsroutine für
asynchrone Signale in dem Emulationssystem angegeben. Einem Verzweigungs-Zielregister
wird global einer Adresse zugewiesen, die dazu verwendet wird, die
Steuerung an die Verarbeitungsroutine für asynchrone Signale zu übertragen.
Ein Voraussageregister wird global zugewiesen, um als ein Boole'sches Flag zu dienen.
Innerhalb jedes einer Vielzahl von Codeblöcken innerhalb des Emulationssystems
gibt es eine Operation zum Übertragen
der Steuerung. Die Operation zum Übertragen der Steuerung verwendet
eine Voraussage des global zugewiesenen Voraussageregisters. Die
Operation zum Übertragen
der Steuerung verzweigt zu einer Adresse, die in dem global zugewiesenen
Verzweigungs-Zielregister gespeichert ist. In der bevorzugten Ausführung zeigt,
soweit es die Architektur erlaubt, ein Vorabruf-Hinweis für die Operation
zur Übertragung
der Steuerung an, daß die
Steueroperation nicht vorabgerufen wurde. Die Steueroperation wird
in den Codeblock an einem Punkt gelegt, bei dem der Zustand wiedergewonnen
werden kann, allgemein an das Ende des Codeblocks.
-
Wenn
ein asynchrones Signal in dem Emulationssystem ankommt, wird das
Emulationssystem unterbrochen. Information über das asynchrone Signal wird
aufgezeichnet, und das Boole'sche
Flag in dem global zugewiesenen Voraussageregister wird gesetzt,
um anzuzeigen, daß ein
asynchrones Signal angekommen ist. Die Emulation wird dann bei dem
Punkt wieder aufgenommen, bei dem das Emulationssystem unterbrochen
wurde.
-
Wenn
die Emulation die Steueroperation innerhalb eines Codeblocks erreicht,
wird die normale Emulation angehalten. Die Steuerung wird an die
Verarbeitungsroutine für
asynchrone Signale übergeben.
Dies umfaßt
die Verwendung der Operation zur Übertragung der Steuerung (Steuerungsübertragungsoperation). Die
Operation zur Übertragung
der Steuerung verwendet eine Voraussage des global zugewiesenen
Voraussageregisters. Die Operation zur Übertragung der Steuerung verzweigt
zu einer Adresse, die in einem global zugewiesenen Verzweigungs-Zielregister
gespeichert ist. Innerhalb der Verarbeitungsroutine für asynchrone Signale
wird die Ankunft des asynchronen Signals unter Verwendung der aufgezeichneten
Signalinformation simuliert.
-
Die
Erfindung erlaubt die Verarbeitung eines asynchronen Signals in
einem Emulationssystem mit einem minimalen Verwaltungsaufwand.
-
Kurze Beschreibung
der Zeichnungen
-
1 ist ein vereinfachtes
Blockdiagramm, das ein Rechenssystem zeigt, welches einen dynamischen Übersetzer
gemäß einer
bevorzugten Ausführung
der Erfindung umfaßt.
-
2 zeigt die Verwendung eines
dynamischen Übersetzers,
um einen Code gemäß einer
bevorzugten Ausführung
der vorliegenden Erfindung dynamisch zu übersetzen.
-
3 zeigt eine Abbildung von
Adressen auf Blockinformation, eine Blockinformationstabelle und
einen Cache-Speicher für übersetzten
Code, der von einem dynamischen Übersetzer
gemäß der bevorzugten Ausführung der
vorliegenden Erfindung verwendet wird.
-
4 zeigt, wie der dynamische Übersetzer
der 1 asynchrone Signale
gemäß einer
bevorzugten Ausführung
der Erfindung verarbeitet.
-
5 zeigt, wie der dynamische Übersetzer,
der in 1 gezeigt ist,
einen Punkt ermittelt, bei dem angehalten und die vollständige Zustandsinformation
des Emulationssystems gemäß einer
bevorzugten Ausführung
der vorliegenden Erfindung wiedergewonnen wird.
-
Beschreibung
der bevorzugten Ausführung
-
1 zeigt ein vereinfachtes
Blockdiagramm eines Rechenssystems 7, das einen dynamischen Übersetzer 15 zum
Ausführen
einer Anwendung 10 verwendet. Der dynamische Übersetzer
(Übersetzungsroutine) 15 unterscheidet
sich von einem Compiler dadurch, daß ein Compiler ausführbaren
Code vor der Programmlaufzeit erzeugt. Der dynamische Übersetzer 15 erzeugt übersetzten
Code 8 während
der Programmlaufzeit. Codeblöcke
von der Anwendung 10 werden während der Ausführungszeit übersetzt.
Die übersetzten
Codeblöcke
sind in 1 als übersetzter
Code 8 gezeigt. Der übersetzte
Code ist in einem Speicher (z. B. einem Cache-Speicher) gespeichert,
so daß jeder
Codeblock, der mehrmals ausgeführt
wird, während
der Programmlaufzeit nur einmal übersetzt
werden muß.
Dieser Ansatz ermöglicht
die Flexibilität,
daß der
Code nicht vor der Programmlaufzeit übersetzt werden muß, reduziert
jedoch den Verwaltungaufwand, der sich ergeben würde, wenn ein Codeblock bei
jeder Ausführung übersetzt
werden würde.
-
In
der bevorzugten Ausführung
wird der übersetzte
Code 8 in einem Cache-Speicher 20 für übersetzte Code
gespeichert. Wenn der Cache-Speicher 20 für übersetzten
Code voll ist, kann es notwendig sein, einige zuvor übersetzte
Codeblöcke
zu verwerfen, um Platz für
die neu übersetzten
Codeblöcke
zu machen. Dies macht es notwendig, daß die Codeblöcke, welche
verworfen wurden, neu übersetzt
werden, wenn sie wieder gebraucht werden, erlaubt jedoch eine potentielle
Einsparung der Speichernutzung. Alternativ können die zuvor übersetzten
Codeblöcke
im Systemspeicher gespeichert werden, anstatt sie zu verwerfen.
-
2 zeigt die Verwendung eines
dynamischen Übersetzungs-
und Ausführungsprozessen 39,
zum dynamischen Übersetzen
und Ausführen
von Code von einer Anwendung 10. Die Anwendung 10 ist
mit Befehlen 11 und Daten 12 dargestellt. Während Befehle 11 innerhalb
der Anwendung 10 ausgeführt
werden, wird immer dann, wenn ein Programmzähler zu einem Codeblock 13 innerhalb
der Anwendung 10 zeigt, (in einem Schritt 16)
ermittelt, ob der neue Codeblock 13 bereits von dem dynamischen Übersetzungs-
und Ausführungsprozeß angetroffen
und somit bereits vorher übersetzt
wurde. Wenn nein, wird der Codeblock in einem Schritt 18 in
Objektcode, der für
das Hostcomputersystem geeignet ist, übersetzt. In einem Schritt 17 wird
der übersetzte
Code für
den Codeblock 13 ausgeführt.
-
3 illustriert weiter den
Prozeß der
Ausführung
einer Anwendung durch den dynamischen Übersetzungs- und Ausführungsprozeß 39.
In einem Schritt 21 wird die Ausführung der Anwendung gestartet.
In einem Schritt 22 wird die Adresse einer nächsten Anwendung,
die ausgeführt
werden soll, nachgeschlagen. Dies erfolgt z. B. unter Verwendung
einer 25 von Adressen auf Blockinformation.
Die 25 von Adressen auf Blockinformation
umfaßt
Einträge
für Codeblöcke in der
Anwendung und kann zusätzlich
Einträge
für Codeblöcke in einer
von mehreren Teilnehmern genutzten Bibliothek, welche von der Anwendung
aufgerufen wird, umfassen. In der bevorzugten Ausführung sind
in der Blockinformationsabbildung 25 nur Adressen für Codeblöcke enthalten,
die tatsächlich
für die
Ausführung
benötigt
werden. Diese Adressen werden zur Programmlaufzeit, wenn die Codeblöcke benötigt werden,
hinzugefügt.
-
Ein
Codeblock ist eine Gruppierung von einem oder mehreren Befehlen.
Der Codeblock kann somit aus einem einzelnen Befehl, einem geradlinigen
Durchlauf von Befehlen, der bei einer Verzweigung endet (ähnlich einem „Grundblock", der von einem Compiler
verwendet wird), einer gesamten Prozedur oder irgendeiner anderen
Gruppierung von Befehlen bestehen. In den bevorzugten Ausführungen
der vorliegenden Erfindung ist der Codeblock die Übersetzungseinheit,
die von dem dynamischen Übersetzer 15 verwendet wird.
Diese Übersetzungseinheit
kann z. B. eine Prozedur, ein Grundblock, eine Seite, eine Cache-Zeile,
ein Befehl oder irgendeine andere Gruppierung von Befehlen sein.
-
Ein
Eintrag in der 25 von Adressen auf
Blockinformation umfaßt
wenigstens eine erste Programmadresse, die die Anfangsadresse eines
Codeblocks innerhalb einer Anwendung oder eines Codeblocks innerhalb
einer von mehreren Nutzer genutzten Bibliothek weist. Zusätzlich umfaßt jeder
Eintrag einen Blockinformationszeiger, der auf eine Position in
einer Blockinformationstabelle 26 weist, die Blockinformation über den
Codeblock von der Anwendung oder gemeinsam genutzten Bibliothek
umfaßt.
Die Blockinformation innerhalb der Blockinformationstabellte 26 wird
einen Zeiger auf übersetzten
Code umfassen, wenn übersetzter Code
für den
Codeblock existiert.
-
Nach
dem Nachschlagen einer nächsten
Anwendungsadresse, die ausgeführt
werden soll (in einem Schritt 23), wird ermittelt, ob übersetzter
Code für
den Codeblock von der Anwendung oder gemeinsam genutzten Bibliothek
existiert. Dies erfolgt z. B. auf der Grundlage von Information,
die aus der Blockinformationstabelle 26 wiedergewonnen
wird. Wenn für
den Codeblock keine Übersetzung
existiert, wird der Codeblock in einem Schritt 24 übersetzt.
Dann wird der übersetzte
Code ausgeführt.
-
Der
Cache-Speicher 20 für übersetzten
Code wird dazu verwendet, übersetzte
Codeblöcke
für eine effiziente
Ausführung
zu halten. Die Anzahl der Codeblöcke,
welche von dem Cache-Speicher 20 für übersetzten
Code gehalten wird, variiert z. B. abhängig von dem verfügbaren Speicher.
In 3 sind die Codeblöcke innerhalb
des Cache-Speichers 20 für übersetzten Code durch einen
Codeblock 27, einen Codeblock 28 und einen Codeblock 29 repräsentiert.
Jeder dieser Codeblöcke
kann eine übersetzte
Prozedur von einer gemeinsam genutzten Bibliothek repräsentieren.
-
Codeblöcke innerhalb
des Cache-Speichers 20 für übersetzten Code können zu
anderen Codeblöcke innerhalb
des Cache-Speichers 20 für übersetzten Code verzweigen.
Eine Verzweigung innerhalb des Codeblocks 27 weist so zu
einer Position innerhalb des Codeblocks 28. Ähnlich wird
nach der Ausführung
von Code in dem Codeblock 28 die Ablaufsteuerung des Programms
bei dem Codeblock 29 fortfahren. Wie in 3 dargestellt, wird nach der Ausführung des
Codes in dem Codeblock 27 die Ablaufsteuerung des Programms
bei einem Codeblock außerhalb
des Cache-Speichers 27 für übersetzten Code fortfahren. Ähnlich wird
nach der Ausführung
von Code in dem Codeblock 29 eine dynamische Verzweigung
zu einer Adresse innerhalb eines Codeblocks außerhalb des Cache-Speichers 20 für übersetzten
Code springen.
-
Wenn
die Ausführung
von Befehlen innerhalb eines Codeblocks innerhalb des Cache-Speichers 20 für übersetzten
Code begonnen hat, wird die Ausführung
von Befehlen innerhalb des Codeblocks und anderer Codeblöcke innerhalb
des Cache-Speichers für übersetzten
Code fortgesetzt, bis ein Befehl ausgeführt werden soll, der nicht
in einem Codeblock innerhalb des Cache-Speichers 20 für übersetzten
Code enthalten ist. Fehlt dieser in dem Cache-Speicher, wird die Programmsteuerung
zum Schritt 22 zurückkehren,
wo eine nächste
Anwendungsadresse, die ausgeführt
werden soll, nachgeschlagen wird. Der geeignete Codeblock wird übersetzt
(wenn er nicht bereits übersetzt
ist) und in den Cache-Speicher 20 für übersetzten Code gelegt. Die
Ausführung
der Anwendung kann dann fortfahren.
-
4 zeigt, wie ein Emulationssystem,
wie ein dynamischer Übersetzer 15,
asynchrone Signale gemäß einer
bevorzugten Ausführung
der vorliegenden Erfindung verarbeitet. In einem Schritt 31 wird
bei Ankunft eines asynchronen Signals das Emulationssystem unterbrochen.
In einem Schritt 32 zeichnet das Emulationssystem z. B.
in einer Warteschlage Information über das Signal auf.
-
In
einem Schritt 33 wird die Emulation bei dem Punkt, bei
dem das asynchrone Signal angekommen ist und das Emulationssystem
unterbrochen wurde, wieder aufgenommen. In einem Schritt 34 wird
die normale Emulation gestoppt, wenn das Emulationssystem einen
Punkt erreicht, bei dem der Zustand wiederhergestellt werden kann.
In einem Schritt 35 wird die Ankunft des asynchronen Signals
mit Hilfe der aufgezeichneten Signalinformation simuliert. Die vollständige Zustandsinformation
des Systems wird erfaßt,
und die Emulation der Signalverarbeitung des Ursprungsprogramms
wird aufgerufen.
-
Bei
Beendigung der Emulation der Signalverarbeitung des Ursprungsprogramms
kann die Steuerung an das Emulationssystem bei dem Punkt zurückgegeben
werden, bei dem die An kunft des asynchronen Signals simuliert wurde.
Alternativ wird die Steuerung nicht sofort bei Beendigung der Emulation
der Signalverarbeitung des Ursprungsprogramms zurückgegeben.
-
5 zeigt eine effiziente
Art und Weise zur Ausführung
des Schrittes 34 gemäß einer
bevorzugten Ausführung
der vorliegenden Erfindung. Dies erfolgt z. B. unter Verwendung
einer Computerarchitektur, welche das Konzept der Aufteilung einer
Verzweigung in die kleineren Schritte, aus denen sie zusammengesetzt ist,
unterstützt.
Siehe z. B. V. Kathail et al., HP Laboratories Technological Report:
HPL PlayDoh Architecture Specification: Version 1.0; HPL-93-80m, Februar 1994,
Seiten 38–40.
-
Das
Format für
eine typische Verzweigung alten Stils ist in Tabelle 1 unten angegeben: Tabelle
1
-
Der
in Tabelle 1 angegebene Verzweigungsbefehl ist ein Vergleichs- und
Verzweigungsbefehl, der z. B. beschrieben ist in dem PA-RISC 1.1
Architecture and Instruction Set Reference Manual, HP Teilernummer: 0974-90039,
Februar 1994, dritte Ausgabe, Seiten 5–72. In dem Befehl wird ein
allgemeines Register 4 mit Null verglichen, und wenn es nicht gleich
Null ist, wird die Steuerung an die Position „foo" übergeben.
Das Konzept umfaßt
hier drei Schritte. Im ersten Schritt wird ermittelt, ob eine Verzweigung
stattfinden soll (if %gr4 = 0). Im zweiten Schritt wird ermittelt,
wohin verzweigt werden soll (foo). In einem dritten Schritt wird
die Verzweigungsanforderung selbst ausgeführt.
-
In
der bevorzugten Ausführung
der vorliegenden Erfindung werden die drei Schritte eines Verzweigungsbefehls
in einzelne Operationen aufgeteilt. Dies dient als ein Mechanismus
zur Unterbrechung der normalen Emulation, wenn das Emulationssystem
einen Punkt erreicht, bei dem die Zustandsinformation wiedergewonnen
werden kann, wie im Schritt 34 in 4 gezeigt ist.
-
5 zeigt den Mechanismus
zum Unterbrechen der normalen Emulation, wenn das Emulationssystem
einen Punkt erreicht, bei dem die Zustandsinformation wiedergewonnen
werden kann, gemäß der bevorzugten
Ausführung
der vorliegenden Erfindung. In einem Schritt 41 wird ein
Verzweigungs-Zielregister global zugewiesen. In dem Verzweigungs-Zielregister liegt
eine Adresse des Codes, der asynchrone Signale verarbeitet. Vorabrufhinweise
auf den Verzweigungsbefehl werden eingestellt, um der zugrundeliegenden
Hardware mitzuteilen, keine Anstrengungen für einen Vorabruf für dieses
Ziel zu verschwenden, weil typischerweise selten darauf zugegriffen
wird. Da die Verzweigungsbefehle einen Zugriff auf globale Register
erlauben, muß der
Schritt 41 nur einmal ausgeführt werden. Dies ist ein Vorteil
gegenüber
herkömmlichen
Verzweigungsbefehlen. Bei herkömmlichen
Verzweigungsbefehlen wird der Schritt 41 in der Befehlsdecodierung-Pipeline
jedesmal ausgeführt,
wenn eine Verzweigung angetroffen wird.
-
Das
heißt, üblicherweise
codieren Verzweigungsbefehle das Ziel in dem tatsächlichen
Befehl. Der in Tabelle 2 unten angegebene Code dient zur Erläuterung
dieses Sachverhalts.
-
-
Für den in
Tabelle 2 angegebenen Code gilt, daß dann, wenn die Verzweigung
(b; branch) bei 0x100 PC-abhängig
ist – der übliche Fall – die Verzweigung
tatsächlich
für die
Hardware aussehen würde
wie eine „Übertragung
der Steuerung auf eine Position, die der momentanen Position plus
50 entspricht".
Die Materialisierung dieser Zieladresse, in diesem Fall 0x150, erfolgt
in der Befehlsdecodierungs-Pipeline jedesmal dann, wenn der Verzweigungsbefehl
auftritt. Die Decodierungs-Pipeline materialisiert diese Adresse
so schnell sie kann, um sie an die Befehls-Vorabruf-Einheit zu übergeben,
um den Fall vorzubereiten, daß die
Verzweigung schließlich
durchgeführt
wird.
-
In
einem Schritt 42 wird ein Voraussageregister global zugewiesen,
um als ein Boole'sches
Flag zu dienen. Dieses Flag spezifiziert, ob ein asynchrones Signal
ansteht, z. B. in einer Warteschlange, das an die geeignete Verarbeitungsroutine
vergeben werden soll. Die Ressourcen innerhalb des Voraussageregisters werden
auf „FALSCH" initialisiert. Der
Schritt 42 muß auch
nur einmal durchgeführt
werden.
-
In
einem Schritt 43 wird eine einzelne Operation zur Übertragung
der Steuerung in jeden anwendbaren Block übersetzten Codes eingebaut.
Diese Verzweigungsoperation wird über das Voraussageregister
gesteuert, das im Schritt 42 zugewiesen wurde.
-
Normalerweise
wird die im Schritt
43 eingestellte Verzweigungsoperation
nicht ausgeführt,
weil der normale Zustand der Steuerung des global zugewiesenen Voraussageregisters
im Schritt
42 FALSCH ist. Wenn ein asynchrones Signal ankommt
und Information über
das asynchrone Signal, z. B. in einer Warteschlange, gespeichert
wird, werden als ein Teil des Schrittes
32 die Ressourcen
innerhalb des Voraussageregisters auf „WAHR" umgeschaltet. In diesem Fall wird im
Schritt
34 die Verzweigung ausgeführt, und im Schritt
35 wird
die Ankunft des asynchronen Signals unter Verwendung der gespeicherten
Information simuliert. Der in Tabelle 3 unten angegebene Code dient
zur Erläuterung
der bevorzugten Ausführung
der vorliegenden Erfindung: Tabelle
3
block_A: | |
ADD
%gr1, %gr1, %gr1 | ;
Ausführen
einiger Operationen |
B,N
block_B | ;
Verzweigen zu Block_B |
-
Der
Sourcecode (Ursprungscode) innerhalb des Block_A führt verschiedene
Operationen aus, die durch ADD repräsentiert sind, und verzweigt
dann zu dem Sourcecode Block_B.
-
Wenn
ein dynamischer Übersetzer
15 während der
dynamischen Übersetzung
verwendet wird, wird eine Übersetzung
für Block_A
aufgebaut, wie in Tabelle 4 unten angegeben. Tabelle
4
translated_block_A: | |
LDW
emulated_gr1(27),%tmp_reg1 | ;
Laden des Wertes von %gr1 aus dem Speicher |
ADD
%tmp_reg1, %tmp_reg1; %tmp_reg1 | ;
Ausführen
einer UND-Operation |
STW
%temp_reg1; emulated_gr1(27) | ;
Speichern des modifizierten %gr1 |
B,N
translated_block_B | ;
Verzweigen zu translated_block_B |
-
In
Tabelle 5 unten wird ein Verzweigungsbefehl am Ende des translated_block_A
hinzugefügt,
um zu überprüfen, ob
ein asynchrones Signal angekommen ist. Tabelle
5
translated_block_A: | |
LDW
emulated_gr1(27),%tmp_reg1 | ;
Laden des Wertes von %gr1 aus dem Speicher |
ADD
%tmp_reg1, %tmp_reg1, %tmp_reg1 | ;
Ausführen
einer UND-Operation |
STW
%tmp_reg1, emulated_gr1(27) | ;
Speichern des modifizierten %gr1 |
LDW
signal_flag(27),%tmp_reg2 | ;
Laden des Signal Flag (addiert) |
COMIB,!=0,%tmp_reg2,handle_signal | ;
Ausbrechen, falls das Signal angekommen ist (addiert) |
B,N
translated_block_B | ;
Verzweigen zu translated_block_B |
-
Unter
Verwendung der Tabelle 5 oben muß jedesmal, wenn translated
block A ausgeführt
wird, der Code das Handle Signal lokalisieren; ermitteln, ob die
Verzweigung ausgeführt
werden soll; und diese dann ausführen
oder nicht. Dies bedeutet eine erhebliche Menge an Verwaltungsaufwand,
insbesondere wenn dieser Code zu einer Anzahl von Codeblöcken innerhalb
des Emulationssystems hinzuaddiert wird.
-
Um
diesen Verwaltungsaufwand zu minimieren, werden in der bevorzugten
Ausführung
der vorliegenden Erfindung das Verzweigungs-Zielregister und das
Voraussageregister zugewiesen und global eingestellt, so daß auf diese über Verzweigungsbefehle
in jedem Block zugegriffen werden kann. Dies muß nur einmal ausgeführt werden.
Code, welcher dies illustriert, ist in Tabelle 6 unten angegeben. Tabelle
6
%b2
= handle_signal, Not_Taken | ;
Zuweisen und Einstellen des Verzweigungs-Zielregisters 2, das auf Code verweist,
der zum Verarbeiten von Signalen verwendet wird, und zusätzlich Einstellen
eines Codevorabrufhinweises, um anzuzeigen, daß diese Verzweigung selten
genommen wird |
%p2
= CMP %gr0 != %gr0 | ;
Zuweisen des Voraussageregisters 2 und Initialisieren auf FALSCH |
-
Das
Verzweigungs-Zielregister und das Voraussageregister werden global
zugewiesen und eingestellt, so daß in jedem Block nur einmal
durch Verzweigungsbefehle auf sie zugegriffen werden kann, und Code für den Körper des
Blocks wird wie in Tabelle 7 unten gezeigt erzeugt: Tabelle
7
translated_block_A: | |
%b3
= translated_block_B, Taken | ;
Einstellen des Verzweigungs-Zielregisters 3 für die Verzweigung zu B und
Einstellen des Hinweises, um anzuzeigen, daß diese Verzweigung üblicherweise genommen
wird |
LDW
emulated_gr1(27),%tmp_reg1 | ;
Laden des Wertes von %gr1 aus dem Speicher |
ADD
%tmp_reg1, %tmp_reg1, %tmp_reg1 | ;
Ausführen
einer UND-Operation |
STW
%tmp_reg1, emulated_gr1(27) | ;
Speichern des modifizierten %gr1 |
LDW
signal_flag(27),%tmp_reg2 | ;
Laden des Signal_Flags (addiert) |
?%p2:
B %b2 | ;
Wenn Signal, geh zu Handle_Signal |
B %b3 | ;
Verzweigen zu translated_block_B |
-
Für den Code
in Tabelle 7 muß das
Handle_Signal nicht lokalisiert werden. Es muß nur ermittelt werden, ob
die Verzweigung genommen werden soll, und diese dann ausgeführt werden
oder nicht. Dies reduziert erheblich den Verwaltungsaufwand, der
für diese
Verzweigung innerhalb des translated_block_A notwendig ist.
-
Die
obige Erläuterung
offenbart und beschreibt lediglich beispielhafte Verfahren und Ausführungen
der Erfindung. Der Fachmann wird verstehen, daß die beanspruchte Erfindung
auf andere spezifische Art ausgeführt werden kann. Die Offenbarung
der vorliegenden Erfindung soll daher den Bereich der Erfindung,
der in den folgenden Ansprüchen
angegeben ist, illustrieren, jedoch nicht begrenzen.