PatentDe  


Dokumentenidentifikation DE102004013676B4 21.06.2007
Titel Schaltung in einem Prozessor zur Steuerung einer iterativen Ausführung einer Gruppe von Programmanweisungen
Anmelder Infineon Technologies AG, 81669 München, DE
Erfinder Ahmad, Sagheer, Sunnyvale, Calif., US;
Arnold, Roger, Sunnyvale, Calif., US;
Knoth, Matthias, San Jose, Calif., US
Vertreter Jannig & Repkow Patentanwälte, 86199 Augsburg
DE-Anmeldedatum 18.03.2004
DE-Aktenzeichen 102004013676
Offenlegungstag 23.12.2004
Veröffentlichungstag der Patenterteilung 21.06.2007
Veröffentlichungstag im Patentblatt 21.06.2007
IPC-Hauptklasse G06F 9/32(2006.01)A, F, I, 20051017, B, H, DE

Beschreibung[de]
TECHNISCHES GEBIET

Die vorliegende Erfindung betrifft eine Schaltung in einem Prozessor zur Steuerung einer iterativen Ausführung einer Gruppe von Programmanweisungen.

ALLGEMEINER STAND DER TECHNIK

14 ist ein vereinfachtes Diagramm eines herkömmlichen Mikroprozessors (Prozessor) 1400, der einen Anweisungspuffer (d.h. den unten besprochenen Decodierungsanweisungspuffer (DIB) 122) zum Speichern abgerufener Programmanweisungen vor der Ausgabe an eine Ausführungs-Pipeline verwendet. Der Prozessor 1400 ist allgemein konsistent der TriCoreTM-Familie von Prozessoreinrichtungen, die von der Infineon Technologies AG in München hergestellt wird. Für Fachleute auf dem Gebiet der Prozessoren ist erkennbar, daß die Beschreibung des Prozessors 1400 für Erläuterungszwecke stark vereinfacht ist und daß ein Teil der unten separat beschriebenen Schaltungskomponenten mit anderen Komponenten integriert oder ganz weggelassen werden kann.

Der Prozessor 1400 ist allgemein in eine Prefetch- bzw. Vorabrufstufe 110, eine Abruf-/Vordecodierstufe 115, eine Decodierstufe 120 und eine Ausführungsstufe 130 aufgeteilt. Die Vorabrufstufe 110 enthält einen Programmzähler 111 und eine Speicherverwaltungseinheit (MMU) 112, die kooperieren, um Adressensignale zu senden, mit denen entsprechende Programmanweisungen von einem Systemspeicher 101 (z.B. Cache-, lokaler und/oder externer Speicher) gelesen werden, der diese Programmanweisungen dann in die Abruf-/Vordecodierstufe 115 schreibt. Die Abruf-/Vordecodierstufe 115 enthält einen Abrufteil 116 mit einer Programmspeicherschnittstelle (PROG MEM INTRFC) 117 zum Empfangen der Programmanweisungen und einen Vordecodierteil 118 mit einer Decodieranweisungspuffereingangsschaltung 119, die die Anweisungen teilweise decodiert und die Anweisungen auf unten beschriebene Weise in die Decodierstufe 120 schreibt. Die Decodierstufe 120 enthält den DIB 122 und eine Decodier-/Ausgabeschaltung 125. Die Ausführungsstufe 130 enthält die Prozessor-„Pipeline", die die aus der Decodierstufe 120 ausgegebenen decodierten Programmanweisungen ausführt. Bei dem vorliegenden Beispiel enthält die Ausführungsstufe 130 zwei Prozessor-Pipelines: eine Lade-/Speicher-(LS-)Pipeline 132 und eine Integer-Verarbeitungs(IP-)Pipeline 136. Jede Pipeline enthält zwei Ausführungsstufen (d.h. EX1 und EX2) und eine Rückschreibstufe. Der Prozessor 1400 enthält außerdem ein Schleifenzählerregister 105A, das bei dem vorliegenden Beispiel einen Schleifenzählerwert speichert. Man beachte, daß das Schleifenzählerregister 105A eines von mehreren durch den Prozessor 1400 bereitgestellten Vielzweckregistern sein kann.

Der DIB 122 kann logisch als ein zirkulärer Puffer mit mehreren Registern (z.B. vier Registern REG1–REG4), einem Eingangs-(Schreib-)Zeiger, der durch die DIB-Eingangsschaltung 119 gesteuert wird, und einem oder mehreren Ausgangszeigern, die durch die Decodier-/Ausgabeschaltung 125 gesteuert werden, repräsentiert werden. Der Schreibzeiger zeigt auf eines der Register REG1–REG4, und eine Abruf-/Vordecodierstufe 115 schreibt in jedem Schreibzyklus eine, zwei, drei oder vier Anweisungen in das Register, auf das gezeigt wird. Zum Beispiel zeigt in einem ersten Schreibzyklus der Schreibpunkt auf REG1 und es werden vier 16-Bit-Anweisungen in REG1 geschrieben, in einem nächsten Schreibzyklus zeigt der Schreibzeiger dann auf REG2, und es werden zwei 32-Bit-Anweisungen in REG2 geschrieben ..., dann zeigt der Schreibzeiger auf REG4, und es werden eine 32-Bit-Anweisung und zwei 16-Bit-Anweisungen in REG4 geschrieben, dann kehrt der Schreibpunkt zu REG1 zurück, und es werden neue Anweisungen in REG1 geschrieben. Man beachte, daß zuvor geschriebene Anweisungen aus jedem Register ausgegeben werden, bevor neue Anweisungen in dieses Register geschrieben werden. Außerdem werden abhängig von dem Prozessor eine oder mehrere dieser Anweisungen aus den Registern REG1–REG4 während jedes Ausgabezyklus an die Ausführungsstufe 130 ausgegeben, in der die decodierten Anweisungen abhängig von dem „Typ" der ausgegebenen Anweisungen entweder an die LS-Pipeline 132 oder die IP-Pipeline 136 gehen. Zum Beispiel wird in einem ersten Ausgabezyklus eine erste 16-Bit- oder 32-Bit-Anweisung des IP-Typs an die IP-Pipeline 136 ausgegeben, und eine zweite 16-Bit- oder 32-Bit-Anweisung des LS-Typs wird aus dem DIB-Register REG1 an die LS-Pipeline 132 ausgegeben. Abhängig von dem Prozessor kann die Reihenfolge, in der die Anweisungen des LS-Typs und die Anweisungen des IP-Typs angeordnet sind, bestimmen, ob eine oder zwei Anweisungen pro Ausgabezyklus ausgegeben werden. Zum Beispiel kann in einem zweiten Ausgabezyklus eine dritte 16-Bit- oder 32-Bit-Anweisung des LS-Typs (die der zuvor ausgegebenen zweiten Anweisung des LS-Typs folgt) aus REG1 an die LS-Pipeline 132 ausgegeben werden (d.h. weil die zweite und die dritte Anweisung LS-Anweisungen sind, wird während des zweiten Ausgabezyklus keine IP-Anweisung ausgegeben). Dieser Ausgabeprozeß wird fortgesetzt, wobei erst aus REG1 ausgegeben, dann zu REG2, REG3 bzw. REG4 übergegangen und dann zu REG1 zurückgekehrt wird. Durch Speichern und Ausgeben mehrerer Anweisungen in Registern REG1–REG4 auf diese Weise wirkt der DIB 122 als ein Anweisungspuffer, der es der Abruf-/Vorabrufstufe 115 erlaubt, mit einer anderen Geschwindigkeit als die Ausführungsstufe 130 zu arbeiten, wodurch die schnelle Verarbeitung ermöglicht wird.

Die Funktionsweise des Prozessors 1400 umfaßt in der Regel das Verarbeiten (Ausführen) eines Softwareprogramms, bei dem es sich um eine vorbestimmte Reihe von aus dem Systemspeicher 101 gelesenen Programmanweisungen handelt, die zusammen bewirken, daß der Prozessor 1400 eine gewünschte Datenverarbeitungstask durchführt. Während der Entwicklung solcher Softwareprogramme werden die Programmanweisungen im allgemeinen in der Reihenfolge angeordnet, in der sie verarbeitet (ausgeführt) werden, und die so angeordneten Programmanweisungen werden an entsprechenden sequentiellen Speicherstellen in dem Systemspeicher 101 vor der Ausführung durch den Prozessor 1400 zugewiesen (gespeichert).

Programmanweisungen können im allgemeinen folgendermaßen klassifiziert werden: Operationen, die sequentiell in der Ausführungsstufe 130 ausgeführt werden, und Verzweigungs-(oder Sprung-)Anweisungen, die bewirken, daß die Programmsteuerung von einer Anweisung zu einer Anweisung außerhalb der Reihenfolge „springt". Eine bedingte Verzweigungsanweisung, die häufig in Softwareprogrammen verwendet wird, ist eine Schleifenanweisung, die es einem Programm erlaubt, eine Anweisung (oder eine Reihe von Anweisungen) eine spezifizierte Anzahl von Malen oder bis eine bestimmte Bedingung erfüllt ist, wiederholt auszuführen. Fast alle Programmiersprachen enthalten mehrere verschiedene Schleifenanweisungen, die für verschiedene Zwecke ausgelegt sind.

15 ist ein vereinfachtes Diagramm eines Teils 1500 eines Softwareprogramms, der einen oft verwendeten Schleifenanweisungstyp verwendet. Jeder Anweisung INST0 bis INST12 des Programmteils 1500 wird jeweils eine sequentiell angeordnete Adresse X0000 bis X1100 zugewiesen, die eine entsprechende Speicherstelle in dem Speicher 101 (14) repräsentiert. Der Kürze halber sind die durch die Anweisungen INST0 bis INST12 durchgeführten Operationen nur für solche Anweisungen angegeben, die für die folgende Besprechung relevant sind. Zum Beispiel setzt die Anweisung INST1 einen Schleifenzähler R1 auf den ganzzahligen Wert drei (angezeigt durch „[R1==3]"), und die Schleifenanweisung INST9 ist eine Schleifenanweisung, die wie nachfolgend beschrieben funktioniert. Die Funktionen der anderen Anweisungen (d.h. INST0, INST2–INST8 und INST10–INST12) führen Operationen durch, deren Beschaffenheit sequentiell ist (d.h. diese Anweisungen erzeugen keine nicht sequentielle Änderung der Programmsteuerung).

In dem vorliegenden Beispiel ist die Schleifenanweisung INST9 von einem Typ, der wirkt, um einen ausgewiesenen Schleifenzähler (d.h. den Schleifenzähler R1 in diesem Beispiel) bei jeder Ausführung der Schleifenanweisung INST9 um eins zu erniedrigen, um die Programmsteuerung an eine Zielanweisung (d.h. Adresse X0010 abzugeben, wodurch in diesem Beispiel die Anweisung INST2 die Zielanweisung der Schleifenanweisung INST9 wird), solange der Schleifenzähler R1 größer als Null ist, und um die Programmsteuerung an die nächste sequentielle (Fall-through-)Anweisung nach der Schleifenanweisung (d.h. die Anweisung INST10 in diesem Beispiel) abzugeben, wenn der Schleifenzähler R1 gleich Null ist. Im vorliegenden Gebrauch bedeutet der Ausdruck „genommen" den Fall, bei dem, wenn die Schleifenanweisung ausgeführt wird, die Programmsteuerung zu der Zielanweisung springt, und der Ausdruck „nicht genommen" bedeutet den Fall, bei dem die Programmsteuerung zu den Fall-through-Anweisungen der Schleife weitergeleitet wird. Während der Schleifenzähler R1 größer als Null bleibt, ist die Schleifenanweisung IMST9 folglich „genommen"-Operation, und die Programmsteuerung springt zu der Zielanweisung INST2. Der „Schleifenhauptteil" (d.h. die Anweisungen INST2–INST8) wird dadurch wiederholt ausgeführt, bis der Schleifenzähler R1 auf Null erniedrigt ist, und dann ist die Schleife „nicht genommen", und die Programmsteuerung wird zu der Fall-through-Anweisung INST10 weitergeleitet.

Wieder mit Bezug auf den Anfang von 14 erzeugt während der Ausführung des Softwareprogramms der Programmzähler 111 in der Regel sequentielle Programmzählerwerte NEXT_PC, die durch die MMU 112 in Speicheradressen umgesetzt werden, mit denen sequentiell auf die Speicherstellen in dem Speicher 101 zugegriffen wird, wodurch die Programmanweisungen in der vorgeordneten Reihenfolge gelesen und verarbeitet werden. Wenn Verzweigungs- oder Sprunganweisungen (z.B. Schleifenanweisungen) ausgeführt werden, wird ein nicht sequentieller Wert (INJECTED_PC) zu dem Programmzähler 111 gesendet, und eine entsprechende nicht sequentielle Adresse wird zu dem Speicher 101 gesendet. Der somit zurückgesetzte Programmzähler bzw. die somit zurückgesetzte MMU fährt dann fort, sequentielle Adressen nach der injizierten Adresse zu erzeugen, bis eine weitere Unterbrechung auftritt.

Wieder mit Bezug auf 15 werden während des „Schleifeneintritts" (d.h. des ersten Durchgangs durch die Anweisungen vor der Schleifenanweisung INST9) die Vorschleifenanweisungen INST0 und INST1 ausgeführt (wobei der Schleifenzähler R1 auf drei gesetzt wird), dann wird der Schleifenhauptteil das erste Mal ausgeführt, dann wird die Schleifenanweisung INST9 zum ersten Mal ausgeführt (angezeigt durch den äußersten linken Pfeil A in 15). Wie angegeben, erniedrigt die Schleifenanweisung INST9 den Schleifenzähler R1 auf zwei (R1=2), bestimmt, daß der in dem Schleifenzähler R1 gespeicherte Wert nicht gleich Null ist und bewirkt deshalb eine Operation des Typs „Schleife genommen", bei der die Programmsteuerung an die Anweisung INST2 (Adresse X0010) zurückgegeben wird. Die Verarbeitung der „inneren Schleife" des Schleifenhauptteils wird dann durchgeführt, während der Schleifenzähler R1 während einer zweiten Iteration auf eins (R1=1) erniedrigt wird, und während einer dritten Iteration auf Null (R1=0), wobei jedes Mal die Schleifenanweisung INST9 eine weitere Operation des Typs „Schleife genommen" bewirkt. „Schleifenaustritt" erfolgt, wenn die Schleifenanweisung INST9 zum vierten Mal angetroffen wird und der Schleifenzähler R1 gleich Null ist, was zu einer Operation des Typs „Schleife nicht genommen" führt, die die Programmsteuerung an die Fall-through-Anweisung INST10 abgibt. Die Programmausführung fährt dann mit der sequentiellen Ausführung von Anweisungen (z.B. der Anweisung INST11 und dann INST12) fort, bis eine weitere Verzweigung bzw. ein weiterer Sprung angetroffen wird.

Ein Problem bei Prozessoren, die Anweisungspuffer verwenden (d.h. dem oben besprochenen Prozessor 1400 ähnliche Prozessoren) besteht darin, daß die bedingte Verzweigungsoperation einer Schleifenanweisung (d.h. ob die Schleifenanweisung genommen oder nicht genommen wird) entschieden wird, wenn die Schleifenanweisung ausgeführt wird (z.B. wenn die Schleifenanweisung an die LS-Pipeline 132 ausgegeben wird; siehe 14). Wie bereits erwähnt, wird, wenn die Schleifenanweisung INST9 genommen wird, die Programmsteuerung zu der Zielanweisung INST2 weitergeleitet (springt dort hin). Das Problem besteht darin, daß nach dem Abrufen der Schleifenanweisung INST9 der Programmzähler 111 und die MMU 112 weiter sequentiell adressierte Anweisungen aus dem Speicher 101 abrufen, bis die Ausführungsstufe den injizierten Zählerwert erzeugt, der der Zielanweisung INST2 zugeordnet ist. Das heißt, zum Zeitpunkt der Ausführung der Schleifenanweisung wurden mehrere Fall-through-Anweisungen (z.B. INST10–INST12) abgerufen und in den verschiedenen Stufen vor der Ausführungsstufe 130 gespeichert, und die Zielanweisung INST2 wurde noch nicht abgerufen. Folglich muß der Prozessor 1400 nach jeder Schleifeniteration (jedes Mal, wenn die Schleifenanweisung INST9 ausgeführt wird) warten, während die Zielanweisung INST2 und nachfolgende Schleifenhauptteilanweisungen abgerufen, durch die verschiedenen Prozessorstufen geleitet und an die Ausführungsstufe 130 ausgegeben werden. Folglich erzeugt jede Schleifeniteration einen „Schleife-genommen-Kostenfaktor", der in der Regel durch die Anzahl von Prozessortaktzyklen zwischen der Ausführung der Schleifenanweisung und der Ausführung der Zielanweisung dieser Schleife gemessen wird. Der Schleife-genommen-Kostenfaktor ist besonders groß, wenn wie im Fall des Prozessors 1400 ein Prozessor mehrere Stufen und einen Anweisungspuffer (d.h. DIB 122) vor der Ausführungsstufe enthält, aufgrund der Anzahl von Prozessortaktzyklen, die erforderlich ist, damit die Zielanweisung diese Stufen durchläuft.

Es wird ein Prozessor benötigt, der den Schleife-genommen-Kostenfaktor minimieren kann. Idealerweise wird ein Prozessor mit „Null-Overhead" benötigt, der den Schleife-genommen-Kostenfaktor eliminiert und Schleifenanweisungen ausführt, ohne jegliche Ausführungszyklen des Prozessors zu verbrauchen.

Eine Schaltung, welche eine unterbrechungsfreie Ausführung von Programmschleifen ermöglicht, ist aus Uh, G.-R. et al.; Techniques for Effectively Exploiting a Zero Overhead Buffer; In: Proceedings of the 9th International Conference on Compiler Construction, 2000; pp. 157–172; Springer-Verlag, London; [http://www.cs.fsu.edu/~whalley/papers/cc00.ps]; S. 1–15, bekannt. Die in dieser Druckschrift beschriebene Schaltung enthält einen dort als ZOLB (Zero Overhead Loop Buffer) bezeichneten Puffer, in welchem sämtliche Programmanweisungen einer Programmschleife gespeichert werden und aus diesem der die Programmanweisungen ausführenden Ausführungseinheit zugeführt werden. Nachteilig hieran ist, daß der ZOLB nur für kurze Programmschleifen, genauer gesagt nur für solche Programmschleifen zum Einsatz kommen kann, die nicht mehr Programmanweisungen umfassen als der ZOLB speichern kann. Nachteilig ist ferner, daß der ZOLB durch spezielle Programmanweisungen gesteuert werden muß, so daß er nur von bestimmten Programmen genutzt werden kann.

Aus der WO 03/019356 A1 ist eine Schaltung bekannt, die keinen zusätzlichen Puffer zur Speicherung von Programmanweisungen einer Programmschleife enthält und daher die damit verbundenen Einschränkungen nicht aufweist. Allerdings ist, wie beispielsweise aus den 3 und 4 dieser Druckschrift ersichtlich ist, mit dieser Schaltung keine unterbrechungsfreie Ausführung von Programmschleifen möglich. Zumindest beim Verlassen der Schleife müssen NOP-Befehle in die Prozessor-Pipeline injiziert werden.

Der vorliegenden Erfindung liegt daher die Aufgabe zugrunde, eine Möglichkeit zu finden, durch welche sich beliebig lange Programmschleifen einschließlich des Verlassens der Programmschleifen in beliebig compilierten Programmen unterbrechungsfrei abarbeiten lassen.

KURZE DARSTELLUNG DER ERFINDUNG

Diese Aufgabe wird erfindungsgemäß durch die in Patentanspruch 1 beanspruchte Schaltung gelöst.

Unter Verwendung dieser Schaltung läßt sich ein Prozessor realisieren, der einen Schleifenbetrieb mit Null-Overhead ermöglicht.

Die vorliegende Erfindung zeichnet sich unter anderem dadurch aus, daß vorhergesagt wird, ob eine cache-gespeicherte Schleifenanweisung während einer nächsten sequentiellen Schleifeniteration genommen oder nicht genommen wird, erkannt wird, wenn die cache-gespeicherte Schleifenanweisung in der nächsten sequentiellen Iteration ausgeführt wird und auf der Basis der Genommen-/nicht-genommen-Vorhersage entweder Anweisungen von innerhalb des Schleifenhauptteils oder Fall-through-Anweisungen abgerufen werden. Insbesondere werden während Schleifeniterationen, bei denen die Schleife genommen wird, Schleifenhauptteilanweisungen abgerufen, bevor die cache-gespeicherte Schleifenanweisung ausgeführt wird. Nach der Verifizierung der Schleife-genommen-Vorhersage werden die bereits abgerufenen Schleifenhauptteilanweisungen sofort an die Ausführungs-Pipeline des Prozessors ausgegeben. Folglich minimiert oder beseitigt die vorliegende Erfindung den in der Regel herkömmlichen Prozessoren zugeordneten Schleife-genommen-Kostenfaktor durch Beseitigung der „verschwendeten" Zyklen zwischen der Ausführung der Schleifenanweisung und der Ausführung des Schleifenhauptteils. Weiterhin werden während Schleifeniterationen, bei denen die Schleife nicht genommen wird, Fall-through-Anweisungen abgerufen, bevor die cache-gespeicherte Schleifenanweisung ausgeführt wird. Nach dem Verifizieren der Schleife-nicht-genommen-Vorhersage werden die bereits abgerufenen Fall-through-Anweisungen sofort an die Ausführungs-Pipeline des Prozessors ausgegeben, wodurch Verzögerungen beim Schleifenaustritt vermieden werden.

Eine weitere Besonderheit der vorliegenden Erfindung besteht darin, daß eine gewählte Schleifenanweisung und eine oder mehrere der Zielanweisung(en) der gewählten Schleife (d.h. die tatsächliche Zielanweisung und null oder mehr nachfolgende Anweisungen vom Inneren des Schleifenhauptteils) in einem speziellen Schleifen-Cache-Puffer (LCB) gespeichert werden, der von dem Anweisungspuffer des Prozessors (der als Decodieranweisungspuffer (DIB) bezeichnet ist) verschieden ist. Bei einer Ausführungsform wird die Schleifenanweisung beim Schleifeneintritt in der Vordecodierstufe des Prozessors erkannt und die Zielanweisung(en) wird sofort nach der Erkennung abgerufen. Die Zielanweisung(en) werden dann nach der nachfolgenden Ankunft in der Vordecodierstufe in dem LCB cache-gespeichert. Jedes Mal, wenn die cache-gespeicherte Schleifenanweisung nachfolgend ausgeführt und eine vorherige Schleife-genommen-Vorhersage verifiziert wird, werden die Zielanweisung(en) sofort aus dem LCB ausgegeben (statt aus dem DIB ausgegeben zu werden). Durch Cache-Speicherung einer oder mehrerer Zielanweisungen in dem LCB auf diese Weise werden potentielle Prozessorverzögerungen, die dem Schreiben der Zielanweisung(en) aus dem Systemspeicher in den DIB zugeordnet sind, vermieden. Außerdem werden durch Cache-Speicherung einer oder mehrerer Zielanweisungen in dem LCB auf diese Weise Verzögerungen, die einer falschen Schleife-nicht-genommen-Vorhersage zugeordnet sind, minimiert (d.h. weil die Zielanweisung(en) ausgeführt werden können, während der übrige Schleifenhauptteil abgerufen wird).

Eine weitere Besonderheit der vorliegenden Erfindung besteht darin, daß außerdem Trigger-Adresse und eine Nachzieladresse beim Schleifeneintritt in dem LCB gespeichert werden. Die Trigger-Adresse dient in nachfolgenden Schleifeniterationen zum Erkennen des Endes des Schleifenhauptteils (d.h. zum Auslösen des nächsten spekulativen Vorabrufens entweder von Schleifenhauptteilanweisungen oder von Fall-through-Anweisungen). Bei einer Ausführungsform entspricht die Trigger-Adresse der vorletzten Anweisung in dem Schleifenhauptteil (d.h. der Anweisung, die der cache-gespeicherten Schleifenanweisung unmittelbar vorausgeht), und die Nachzieladresse entspricht der Anweisung in dem Schleifenhauptteil, der der letzten in dem LCB gespeicherten Zielanweisung unmittelbar nachfolgt. Während des Prozessorbetriebs wird die gespeicherte Trigger-Adresse mit durch die Vorabrufstufe des Prozessors erzeugten Programmzählerwerten verglichen. Wenn eine Übereinstimmung auftritt und die Schleife als genommen vorhergesagt wird, wird die Nachzieladresse sofort an die Vorabrufstufe ausgegeben. Die so abgerufenen Nachzielanweisungen (d.h. die nicht in dem LCB cache-gespeicherten Schleifenhauptteilanweisungen) werden anschließend aus dem DIB an die Prozessorausführungsstufe ausgegeben, nachdem die cache-gespeicherten Zielanweisungen aus dem LCB ausgegeben sind, wodurch die Schleifenausführung mit Null-Overhead ermöglicht wird.

Eine weitere Besonderheit der vorliegenden Erfindung besteht darin, daß ein Prozessor sowohl eine „normale" Ausführungsstufe (Pipeline) als auch eine spezialisierte Schleifenausführungsschaltung enthält, die Schleifenanweisungen ausführen kann, wenn die Ausführungsstufe gleichzeitig eine oder mehrere Anweisungen von innerhalb des Schleifenhauptteils ausführt. Bei einer Ausführungsform empfängt die Schleifenausführungsschaltung die cache-gespeicherte Schleifenanweisung aus dem LCB zusammen mit einem zugeordneten Schleifenzählerwert. Die Schleifenausführungsschaltung verifiziert dann die vorherige Genommen-/nicht-genommen-Vorhersage (die in dem LCB gespeichert ist), erniedrigt den Zählerwert und aktualisiert dann die Genommen-/nicht-genommen-Vorhersage für die nächste Schleifeniteration. Die Vorhersageaktualisierung wird durchgeführt, indem man bestimmt, ob der erniedrige Zählerwert größer oder gleich „1" (eins) oder gleich „0" (Null) ist. Wenn der erniedrigte Zählerwert größer oder gleich eins ist, dann wird die nächste Schleifeniteration als genommen vorhergesagt. Wenn der erniedrigte Zählerwert gleich Null ist, dann wird die nächste Schleifeniteration als nicht genommen vorhergesagt. Wenn die vorherige Vorhersage „Schleife genommen" ist und der Zählerwert Null ist, dann werden Korrekturmaßnahmen eingeleitet (z.B. werden Fall-through-Anweisungen abgerufen). Wenn die vorherige Vorhersage „Schleife nicht genommen" und der Zählerwert größer oder gleich eins ist, dann werden die cache-gespeicherten Zielanweisungen ausgegeben, und der übrige Schleifenhauptteil wird abgerufen. Die Schleifenausführungsschaltung schreibt außerdem den erniedrigten Schleifenzählerwert zurück in sein zugeordnetes Register.

In einer vorteilhaften Weiterbildung der vorliegenden Erfindung werden ein oder mehrere Zeigerwerte in dem LCB gespeichert, um das Ausgeben von Anweisungen an die Schleifenausführungsschaltung und/oder die Ausführungsstufe zu koordinieren. Bei einer Ausführungsform dient ein (erster) Wert eines Schleifenausgabeindex zum Koordinieren des Ausgebens der cache-gespeicherten Schleifenanweisung aus dem LCB in die Schleifenausführungsschaltung, wenn der DIB-Ausgabezeiger die vorletzte Anweisung aus dem DIB in die Ausführungsstufe ausgibt. Folglich werden die cache-gespeicherte Schleifenanweisung und die vorletzte Anweisung gleichzeitig in der Schleifenausführungsschaltung bzw. der „normalen" Prozessorausführungsstufe ausgeführt. Wenn die Ausführung der Schleifenanweisung eine vorherige Schleife-genommen-Vorhersage verifiziert, dann wird, wie bereits erwähnt, die DIB-Ausgabesteuerung auf die in dem LCB cache-gespeicherten Zielanweisungen verlegt. Zusätzlich wird mit einem DIB-Zeigerwert die nächste Anweisung angezeigt, die nach der Ausführung der cache-gespeicherten Schleifenanweisung aus dem DIB ausgegeben werden soll. Das heißt, der DIB-Zeigerwert identifiziert das DIB-Register, das die erste Nachzielanweisung (falls Schleife genommen) oder die erste Fall-through-Anweisung (falls Schleife nicht genommen) enthält. Der Schleifenausgabeindexwert und der DIB-Zeigerwert werden in jeder Schleifeniteration aktualisiert. Folglich liefern diese Zeiger ein flexibles und effizientes Verfahren zum koordinierten Ausgeben von Anweisungen aus dem LCB und dem DIB, wodurch weiterhin Schleifenoperationen mit Null-Overhead ermöglicht werden.

In einer weiteren vorteilhaften Weiterbildung der vorliegenden Erfindung wird eine Vorabrufsperrfunktion für bestimmte kleine Schleifen verwendet (d.h. Schleifen mit Hauptteilen, die vollständig in den LCB und den DIB geschrieben werden können), bei der der Anweisungsabrufprozeß angehalten wird, während solche kleinen Schleifen ausgeführt werden. Ein in dem LCB gespeichertes Vorabrufsperrbit wird gesetzt, wenn eine kleine Schleife abgerufen wird, und der Schleifenausgabeindex und der DIB-Zeiger dienen zum wiederholten Ausführen des Schleifenhauptteils und der cache-gespeicherten Schleifenanweisung auf die oben beschriebene Weise. Schließlich wird das Vorabrufsperrbit ausgeschaltet, wenn die Schleifenausführungsschaltung eine Schleife-nicht-genommen-Vorhersage erzeugt, und an diesem Punkt werden Fall-through-Anweisungen auf die oben beschriebene Weise abgerufen und in den DIB geschrieben. Folglich wird eine hocheffiziente Schaltung zur Ausführung kleiner Schleifen bereitgestellt, die andernfalls bei herkömmlichen Prozessoren einen signifikanten Schleifenkostenfaktor erzeugen würden.

In einer weiteren vorteilhaften Weiterbildung der vorliegenden Erfindung wird ein Prozessor, der zwei oder mehr LCBs enthält, so gesteuert, daß jeder LCB „verriegelt" (reserviert) wird, wenn dieser LCB eine spekulative Vorabrufoperation erzeugt, und wird „entriegelt", wenn die aktuelle Genommen-/nicht-genommen-Vorhersage auf die oben beschriebene Weise validiert wird. Wenn mehr Schleifen als die Anzahl von LCBs angetroffen werden, wird die Zuweisung eines LCB zu der zuletzt angetroffenen Schleife gemäß einem verriegelbaren, modifizierten LRU-Schema (LRU = least recently used) bestimmt. Wenn zum Beispiel zwei LCBs vorgesehen sind und jeweils zwei Schleifen darin cache-gespeichert werden und dann eine dritte Schleife angetroffen wird, wird die dritte Schleife unter den folgenden Umständen in einem der beiden LCBs cache-gespeichert. Wenn sich die dritte Schleife „unterhalb" (außerhalb) der ersten und der zweiten Schleife befindet, dann wird der erste LCB, der „verfügbar" wird, zum Cache-Speichern der dritten Schleife verwendet (d.h. der LCB, der zuletzt benutzt wurde, behält seine Schleifeninformationen). Wenn die dritte Schleife in den ersten beiden Schleifen vernestet ist, dann wird die Schleife, die weniger oft iteriert wurde, durch die dritte Schleife ersetzt.

In einer weiteren vorteilhaften Weiterbildung der vorliegenden Erfindung basiert in Prozessoren, die Anweisungen, die Mehrfachanweisungsdatenwörter (z.B. Anweisungsdoppelwörter (IDWs)) verwenden, abrufen, die Entscheidung, eine erkannte Schleifenanweisung im Cache zu speichern, zum Beispiel auf der Position der Schleifenanweisung in ihrem Datenwort und der Anwesenheit anderer cache-gespeicherter Schleifenanweisungen in dem Datenwort. Ähnlich werden Trigger-Adressen und Nachzieladressen durch die Positionen der jeweiligen vorletzten und Nachzielanweisungen innerhalb der IDWs bestimmt.

Weitere vorteilhafte Weiterbildungen der Erfindung sind Gegenstand der Unteransprüche.

KURZE BESCHREIBUNG DER ZEICHNUNGEN

Diese und andere Merkmale, Aspekte und Vorteile der vorliegenden Erfindung werden im Hinblick auf die folgende Beschreibung, die angefügten Ansprüche und die beigefügten Zeichnungen besser verständlich. Es zeigen:

1 ein Blockschaltbild eines Prozessors, der Schleifenoperationen mit Null-Overhead ermöglicht, gemäß einer ersten Ausführungsform der vorliegenden Erfindung;

2 ein vereinfachtes Flußdiagramm einer durch eine Schleifenausführungsschaltung des in 1 gezeigten Prozessors durchgeführten Funktion;

3 ein vereinfachtes Flußdiagramm von Funktionen, die durch eine Schleifenoperationssteuerschaltung des in 1 gezeigten Prozessors durchgeführt werden;

4(A), 4(B) und 4(C) vereinfachte Darstellungen des in 1 gezeigten Prozessors, wobei während des Schleifeneintritts durchgeführte spezifische Operationen angegeben sind;

5(A) und 5(B) vereinfachte Darstellungen des in 1 gezeigten Prozessors, wobei während innerer Schleifenoperationen durchgeführte spezifische Operationen angegeben sind;

6(A) und 6(B) vereinfachte Darstellungen des in 1 gezeigten Prozessors, wobei während des Schleifenaustritts durchgeführte spezifische Operationen angegeben sind;

7(A) und 7(B) vereinfachte Darstellungen des in 1 gezeigten Prozessors, wobei als Reaktion auf falsche Schleife-genommen- und Schleife-nicht-genommen-Vorhersagen durchgeführte spezifische Operationen angegeben sind;

8 ein vereinfachtes Diagramm eines Teils eines Softwareprogramms, der eine beispielhafte kleine Schleife enthält;

9 eine vereinfachte Darstellung eines Prozessors gemäß einer weiteren Ausführungsform, wobei der Ausführung der in 8 abgebildeten kleinen Schleife zugeordnete spezifische Operationen angegeben sind;

10 ein Blockschaltbild eines Prozessors mit mehreren Schleifen-Cache-Puffern gemäß einer weiteren Ausführungsform der vorliegenden Erfindung;

11 ein vereinfachtes Diagramm eines Teils eines Softwareprogramms, der zwei vernestete Schleifen enthält;

12(A) und 12(B) vereinfachte Diagramme von Softwareprogrammteilen, die drei Schleifen enthalten;

13 ein Zustandsdiagramm eines verriegelbaren modifizierten LRU-Schemas (least-recently-used), das von dem Prozessor von 10 verwendet wird;

14 ein Blockschaltbild eines herkömmlichen Mikroprozessors; und

15 ein vereinfachtes Diagramm eines Teils eines Softwareprogramms, der eine Schleife enthält.

AUSFÜHRLICHE BESCHREIBUNG DER ZEICHNUNGEN

1 ist ein Blockschaltbild eines Mikroprozessors (im folgenden einfach als „Prozessor" bezeichnet) 100, der Schleifenoperationen mit Null-Overhead ermöglicht, gemäß einer vereinfachten ersten Ausführungsform der vorliegenden Erfindung. Der Prozessor 100 ist im allgemeinen in eine Prefetch- bzw. Vorabrufstufe 110A, eine Abruf-/Vordecodierstufe 115A, eine Decodierstufe 120A, die einen DIB (Anweisungspuffer) 122 enthält, und eine Ausführungsstufe 130 aufgeteilt. Jede dieser Stufen und deren Komponenten werden durch Bezugszahlen identifiziert, die entsprechenden Stufen/Komponenten des herkömmlichen Prozessors 1400 (der oben mit Bezug auf 14 beschrieben wird) ähneln, und funktioniert im wesentlichen wie oben beschrieben (mit den nachfolgend dargelegten Ausnahmen). Folglich wird die ausführliche Beschreibung der im wesentlichen herkömmlichen Funktionen, die durch diese Stufen/Komponenten durchgeführt werden, der Kürze halber im folgenden weggelassen.

Zusätzlich zu den obenerwähnten, im wesentlichen herkömmlichen Stufen/Komponenten enthält der Prozessor 100 einen Schleifen-Cache-Puffer (LCB) 150, eine Schleifenausführungsschaltung 160 und eine Schleifenoperationssteuerschaltung 170, die kooperativ wirken, um eine Schleifenausführung mit Null-Overhead auf die nachfolgend beschriebene Weise zu ermöglichen.

Schleifen-Cache-Puffer

Mit Bezug auf die obere linke Seite von 1 enthält der LCB 150 zahlreiche Datenfelder, mit denen verschiedene Anweisungsdatenwörter und Steuerdatenwörter bzw. -Bit cache-gespeichert werden, die von der Schleifenausführungsschaltung 160 und der Schleifenoperationssteuerschaltung 170 auf nachfolgend beschriebene Weise verwendet werden. Diese Datenfelder enthalten ein Feld 151 für die Schleifenanweisung (LOOP INST), ein Feld 152 für die Trigger-Adresse (TRIGGER_PC), ein Feld 153 für die Zielanweisung (TARGET INST), ein Feld 154A für die Zieladresse (TARGET_PC), ein Feld 154B für die Nachzieladresse (POST-TARGET_PC), ein Feld 155 für die Schleife-genommen-/nicht-genommen-Vorhersage (PREDICTION), ein Schleifenausgabeindexfeld 158 und ein DIB-Zeigerfeld 159. Die in jedem dieser Felder gespeicherten Daten werden nachfolgend eingeführt, und die Verwendung dieser Daten während des Betriebs des Prozessors 100 wird in nachfolgenden Beispielen angegeben.

Das Schleifenanweisungsfeld 151 dient zum Speichern von Informationen, die einer ausgewählten (cache-gespeicherten) Schleifenanweisung zugeordnet sind. Insbesondere werden, wenn eine Schleifenanweisung auf die nachfolgend beschriebene Weise cache-gespeichert wird, die folgenden, der Schleifenanweisung zugeordneten Informationen in dem Schleifenanweisungsfeld 151 gespeichert: Der Operationscode (opcode; d.h. Informationen, die den Schleifenanweisungstyp identifizieren), Daten, die identifizieren, ob die Schleifenanweisung bedingt oder unbedingt ist, die Schleifengröße (z.B. 16 Bit oder 32 Bit) und das zugeordnete Schleifenzählerregister. Wie nachfolgend beschrieben, dienen diese Informationen dann zur Ausführung der cache-gespeicherten Schleifenanweisung unter Verwendung der Schleifenausführungsschaltung 160.

Das Trigger-Adressenfeld 152 dient zum Erkennen (oder Vorhersagen), wenn die Schleifenanweisung, die in dem Feld 151 cache-gespeichert ist, in der Vorabrufstufe 110A abgerufen wird (oder davor steht). Bei einer Ausführungsform ist das Trigger-Adressenfeld 152 die tatsächliche oder virtuelle Speicheradresse (bzw. der Programmzählerwert) der Speicherstelle, die entweder die cache-gespeicherte Schleifenanweisung enthält (wenn mehrere Anweisungen zusammen aus dem Speicher 101 gelesen werden; siehe unten) oder die Adresse der vorletzten Anweisung. Unter nochmaliger Bezugnahme auf die beispielhafte Schleife von 15 und unter der Annahme, daß pro Abrufzyklus eine Anweisung geschrieben wird, kann zum Beispiel, wenn die Schleifenanweisung INST9 in dem Schleifenanweisungsfeld 151 cache-gespeichert wird, das Trigger-Adressenfeld 152 dann einen Wert enthalten, der der Speicheradresse X1000 (d.h. der Adresse, die der vorletzten Anweisung INST8 zugeordnet ist) entspricht. Die in dem Feld 152 gespeicherte Adresse wird nur dann aktualisiert, wenn die Schleife cache-gespeichert wird (d.h. während des Schleifeneintritts).

Das Zielanweisungsfeld 153 dient zum Speichern der tatsächlichen Zielanweisung (und von null oder mehr nachfolgenden Anweisungen) der in dem Schleifenanweisungsfeld 151 cache-gespeicherten Schleifenanweisung. Wenn zum Beispiel unter Verwendung des Beispiels von 15 die Schleifenanweisung INST9 in dem Feld 151 cache-gespeichert wird, dann wird die Zielanweisung INST2 in dem Zielanweisungsfeld 153 cache-gespeichert. Eine oder mehrere nachfolgende Anweisungen (d.h. INST3, INST4 usw.) können abhängig von der Größe des Zielanweisungsfelds 153 ebenfalls cache-gespeichert werden. Bei einer tatsächlichen Ausführungsform wird das Zielanweisungsfeld 153 so bemessen, daß es Anweisungen aus zwei 64-Bit-Mehrfachanweisungswörtern (Anweisungsdoppelwörtern (IDWs), die unten weiter behandelt werden) speichert.

Das Zieladressenfeld 154A ist die tatsächliche oder virtuelle Speicheradresse (bzw. der Programmzählerwert) der tatsächlichen Zielanweisung der cache-gespeicherten Schleifenanweisung. Wenn zum Beispiel das Zielanweisungsfeld 153 nur die Zielanweisung INST2 (15) cache-speichert, dann speichert das Zieladressenfeld 154A eine Adresse, die der Zielanweisung INST2 (z.B. Adresse X0010) zugeordnet ist. Das Zieladressenfeld 154A wird nur während des Schleifeneintritts verwendet.

Das Nachzieladressenfeld 154B ist die tatsächliche oder virtuelle Speicheradresse (oder der Programmzählerwert) der Anweisung, die der letzten in dem Zielanweisungsfeld 153 gespeicherten Anweisung unmittelbar nachfolgt. Wenn zum Beispiel das Zielanweisungsfeld 153 nur die Zielanweisung INST2 (15) cache-speichert, dann speichert das Nachzieladressenfeld 154B eine Adresse, die der „Nachziel"-Anweisung INST3 (z.B. Adresse X0011) zugeordnet ist. In einem anderen Beispiel speichert, wenn das Zielanweisungsfeld 153 sowohl die Zielanweisung INST2 als auch die Anweisung INST3 cache-speichert, das Nachzieladressenfeld 154B dann Adresseninformationen, die die „Nachziel"-Anweisung INST4 (z.B. Adresse X0100) identifizieren. Man beachte, daß das Zieladressenfeld 154A und das Nachzieladressenfeld 154B kombiniert werden können, indem nach dem Schleifeneintritt ein vorbestimmtes Offset zu der tatsächlichen Zieladresse addiert wird.

Das Vorhersagefeld 155 speichert Daten, die eine aktuelle Vorhersage anzeigen, ob die cache-gespeicherte Schleifenanweisung während einer nächsten sequentiellen Iteration genommen oder nicht genommen wird. Bei einer Ausführungsform basiert diese Genommen-/nicht-genommen-Vorhersage auf einem Schleifenzählerwert, der der cache-gespeicherten Schleifenanweisung zugeordnet ist, der jedes Mal, wenn die cache-gespeicherte Schleifenanweisung ausgeführt wird, um eins erniedrigt wird und Schleife genommen vorhersagt, während der Schleifenzählerwert größer oder gleich eins ist, und Schleife nicht genommen vorhersagt, wenn der Schleifenzählerwert gleich null ist. Zum Beispiel speichert mit Bezug auf das in 15 angegebene Beispiel das Vorhersagefeld 155 während der ersten drei Iterationen (z.B. während der Schleifenzähler R1 gleich drei, zwei bzw. eins ist) einen „True"-Wert (d.h. sagt Schleife genommen vorher), und wechselt dann auf einen „False"-Wert (d.h. sagt Schleife nicht genommen voraus), wenn der Schleifenzähler R1 auf null erniedrigt ist. Bei einer Ausführungsform wird das Vorhersagefeld 155 beim Schleifeneintritt immer auf den „True"-Wert gesetzt.

Das Schleifenausgabeindexfeld 158 und das DIB-Zeigerfeld 159 werden während des Ausgebens von Schleifenanweisungen aus dem Schleifenanweisungsfeld 151 (oder dem DIB 122) und von Zielanweisungen aus dem Zielanweisungsfeld 153 verwendet. Das Schleifenausgabeindexfeld 158 identifiziert die Speicherstelle der cache-gespeicherten Schleifenanweisung (während des Schleifeneintritts) und der vorletzten Schleifenanweisung im DIB 122 (während aller nachfolgenden Schleifeniterationen). Das heißt, während des Schleifeneintritts zeigt das Schleifenausgabeindexfeld 158 auf das DIB-Register, das die Schleifenanweisung speichert. Nach dem Schleifeneintritt wird jedes Mal, wenn die vorletzte Anweisung abgerufen wird, das Schleifenausgabeindexfeld 158 berechnet (d.h. weil sich diese Anweisung in jeder Iteration in einem verschiedenen DIB-Register befinden kann). Wenn man zum Beispiel annimmt, daß jedes Register des DIB 122 nur eine Anweisung speichert, würde, wenn die vorletzte Anweisung INST8 (15) während einer inneren Schleifeniteration in das Register REG2 geschrieben wird, der in dem Schleifenausgabeindexfeld 158 gespeicherte Wert das Register REG2 anzeigen. Mit dem DIB-Zeiger 159 wird die Speicherstelle der Nachzielanweisung in dem DIB 122, nachdem sie unter Verwendung des (oben besprochenen) Nachzieladressenfelds 154B abgerufen wurde, angezeigt. Ähnlich wie bei dem Schleifenausgabeindexfeld 158 wird der DIB-Zeiger 159 in jeder Schleifeniteration berechnet. Das Schleifenausgabeindexfeld 158 und der DIB-Zeiger 159 werden unten in zusätzlichem Detail besprochen.

Zusätzliche Datenfelder, die für Vielzweck- und Mehrfachschleifenausführungsformen der vorliegenden Erfindung verwendet werden, werden nachfolgend besprochen.

Schleifenausführungsschaltung

2 ist ein Flußdiagramm einer vereinfachten Darstellung der durch die Schleifenausführungsschaltung 160 durchgeführten Funktion. Die Schleifenausführungsschaltung 160 ist eine Schaltung, die spezifisch so konstruiert ist, daß sie Schleifenanweisungen außerhalb der allgemeinen Prozessor-Pipeline (d.h. außerhalb der LS-Pipeline 132 und/oder der IP-Pipeline 136) ausführt. Wie unten in zusätzlichem Detail beschrieben wird, wird während des Schleifeneintritts eine frisch cache-gespeicherte Schleifenanweisung in der Ausführungsstufe 130 ausgeführt, aber während aller anderen Iterationen (einschließlich Schleifenaustritt) durch die Schleifenausführungsschaltung 160. Mit Bezug auf den Anfang von 2 wird eine cache-gespeicherte Schleifenanweisung an die Schleifenausführungsschaltung 160 aus dem Schleifenanweisungsfeld 151 des LCB 150 (oben besprochen) ausgegeben, und ein zugeordneter Schleifenzählerwert wird aus dem Schleifenzählerregister 105A ausgegeben (gelesen) (beides ist in 1 gezeigt). Wie in 1 gezeigt, enthält die Schleifenausführungsschaltung 160 separate Ausführungsstufen EX1 und EX2/WB („WB" bedeutet „writeback"). Wieder mit Bezug auf 2 wird mit der Stufe EX1 bestimmt, ob der Zählerwert eine Vorhersageänderung erfordert (z.B. wenn der Zählerwert eins ist; Block 210). Mit dieser Bestimmung wird die vorherige Genommen-/nicht-genommen-Vorhersage (Block 220) verifiziert und außerdem werden damit Korrekturmaßnahmen eingeleitet (z.B. das Abrufen einer unvorhergesagten Anweisung und/oder das Invalidieren des aktuellen Inhalts des LCB 150, wie unten besprochen), wenn die vorherige Genommen-/nicht-genommen-Vorhersage als falsch bestimmt wird (Block 230). Der Zählerwert wird dann systematisch verändert (z.B. um eins erniedrigt; Block 240), ein aktualisierter Genommen-/nicht-genommen-Vorhersagewert wird erzeugt und in dem Feld 155 gespeichert (Block 250), und der erniedrigte Adressenzähler wird dann aus der Stufe EX2/WB wieder in das Schleifenzählerregister 105A zurückgeschrieben (Block 260). Wie unten ausführlicher dargelegt wird, ermöglicht die Schleifenausführungsschaltung 160 einen Betrieb mit Null-Overhead durch Ermöglichung der gleichzeitigen Ausführung der cache-gespeicherten Schleifenanweisung (in der Schleifenausführungsschaltung 160) und der vorletzten Anweisung (in der Ausführungsstufe 130).

Schleifenoperationssteuerschaltung

Die Schleifenoperationssteuerschaltung 170 verwendet einen oder mehrere Automaten (FSMs) und zugeordnete Schaltkreise zur Koordination des Betriebs des LCB 150 und der Schleifenausführungsschaltung 160 mit den Operationen der Vorabrufstufe 110A, der Abruf-/Vordecodierstufe 115A, der Decodierstufe 120 und der Ausführungsstufe 130 auf die nachfolgend beschriebene Weise. Bei einer Ausführungsform kann die Schleifenoperationssteuerschaltung 170 in drei Funktionsblöcke aufgeteilt werden: einen Vorabrufblock, der mit der Vorabrufstufe 110A in Wechselwirkung tritt, einen Vordecodierblock, der mit der Abruf-/Vordecodierstufe 115A in Wechselwirkung tritt, und einen Ausgabeblock, der mit der Decodierstufe 120A in Wechselwirkung tritt. Wie in dem folgenden Beispiel dargelegt wird, sind die durch diese Funktionsblöcke durchgeführten Operationen abhängig von der durchgeführten Schleifeniteration (d.h. Schleifeneintritt, innere Schleifeniterationen und Schleifenaustritt) unterschiedlich.

3 enthält eine Reihe von Flußdiagrammen, die Operationen abbilden, die durch die Schleifenoperationssteuerschaltung 170 während des Schleifeneintritts (äußerste linke Spalte), der inneren Schleife (mittlere Spalte) bzw. des Schleifenaustritts (äußerste rechte Spalte) durchgeführt werden, gemäß einer vereinfachten Ausführungsform der vorliegenden Erfindung. Weiterhin sind Operationen, die dem Vorabruffunktionsblock der Schleifenoperationssteuerschaltung 170 zugeordnet sind, im oberen Drittel von 3, Operationen, die dem Vordecodierfunktionsblock der Schleifenoperationssteuerschaltung 170 zugeordnet sind, in dem mittleren Drittel von 3 und Operationen, die dem Ausgabefunktionsblock der Schleifenoperationssteuerschaltung 170 zugeordnet sind, in dem unteren Drittel von 3 positioniert.

Die in 3 abgebildeten Flußdiagramme werden unten mit Bezug auf 4(A) bis 6(B) beschrieben, die sich ihrerseits auf den in 15 abgebildeten beispielhaften Softwareprogrammteil 1500 beziehen. Man beachte, daß die nachfolgende Beschreibung annimmt, daß der LCB 150 zu Anfang „leer" ist (d.h. keine Informationen enthält, die mit zuvor cache-gespeicherten Schleifenanweisungen zusammenhängen), und daß eine einzige relativ lange Schleife durch den Prozessor 100 ohne Unterbrechung ausgeführt wird (d.h. keine injizierten Anweisungen aus asynchronen Verzweigungen, Traps oder anderen Interrupt-Operationen).

Schleifeneintrittsphase

Mit Bezug auf die äußerste linke Spalte von 3 beginnt die Schleifeneintrittsphase der Schleifenausführung, wenn eine neue Schleifenanweisung identifiziert wird (Block 310), die bei der vorliegenden Ausführungsform durch den Vordecodierfunktionsblock der Schleifenoperationssteuerschaltung 170 durchgeführt wird. Nachdem die Schleifenanweisung identifiziert und eine Entscheidung, die Schleifenanweisung im Cache zu speichern, getroffen wurde (z.B. durch Bestimmung, daß der LCB verfügbar ist), wird das Ziel der Schleifenanweisung abgerufen und die Schleifenanweisung wird zum Aktualisieren mehrerer Felder des LCB 150 verwendet (Block 314).

4(A) ist ein Blockschaltbild eines Teils des Prozessors 100 während der Ausführung der Operationen, die den Blöcken 310 und 314 zugeordnet sind, gemäß einer vereinfachten Ausführungsform. Wie in 4(A) angegeben, wird die Schleifenanweisung INST9 identifiziert, wenn sie in die Vordecodierstufe 118A eintritt, indem zum Beispiel jede die Vordecodierstufe 118A durchlaufende Anweisung mit Opcodes verglichen wird, die bekannten Schleifenanweisungen zugeordnet sind. Wenn entschieden wird, die Schleifenanweisung INST9 im Cache zu speichern, wird die Adresse für die Zielanweisung INST2 (z.B. X0010) durch die Schleifenoperationssteuerschaltung 170 an die Vorabrufstufe 110A weitergeleitet. Zusätzlich werden verschiedene Informationen bezüglich der Schleifenanweisung INST9 in dem Schleifenanweisungsfeld 151 gespeichert, die Adresse der vorletzten Anweisung INST8 (z.B. X1000) wird in dem Trigger-Adressenfeld 152 gespeichert, die Nachzielanweisung (z.B. die Adresse der Anweisung INST3, d.h. X0011) wird berechnet und in dem Nachzieladressenfeld 154B gespeichert, die Genommen-/nicht-genommen-Vorhersage wird auf Schleife genommen („T") gesetzt, und der Schleifenausgabeindex wird auf das DIB-Register REG2 gesetzt. Man beachte, daß die Fall-through-Anweisung INST10 in der Abrufstufe 116 empfangen wird, wenn die Schleifenanweisung INST9 identifiziert und cache-gespeichert wird.

Wieder mit Bezug auf 3 wird die im Block 314 abgerufene Zielanweisung, wenn sie in der Vordecodierstufe des Prozessors ankommt, in dem LCB cache-gespeichert (Block 317).

4(B) ist ein Blockschaltbild des Prozessors 100 nach der dem Block 314 zugeordneten Operation gemäß dem etablierten vereinfachten Beispiel. Wie in 4(B) angegeben, wird die Zielanweisung INST2 aus der Vordecodierstufe 118A in das Zielanweisungsfeld (TRGT INST) 153 geschrieben, und das DIB-Zeigerfeld wird aktualisiert, um aus Gründen, die unten deutlich werden, das DIB-Register REG1 zu identifizieren. Man beachte, daß an diesem Punkt in dem Betrieb ein der Decodierstufe 120A zugeordneter Ausgabezeiger 410 auf das DIB-Register REG1 zeigt, das gerade die vorletzte Anweisung INST8 speichert. Man beachte außerdem, daß ein der Vordecodierstufe 118A zugeordneter DIB-Schreibzeiger auf das DIB-Register REG4 zeigt. Bei einer Ausführungsform wird die Zielanweisung INST2 in das DIB-Register REG4 geschrieben, wird aber aus dem LCB 150 ausgegeben, wie unten besprochen.

Mit Bezug auf den unteren linken Teil von 3 umfassen Operationen, die dem Ausgabefunktionsblock der Schleifenoperationssteuerschaltung 170 zugeordnet sind, das Ausgeben der Schleifenanweisung an die Ausführungs-Pipeline des Prozessors (Block 320) und das anschließende Weiterleiten der Ausgabesteuerung an den LCB per Schleifenausgabeindex, um die Zielanweisung(en) auszugeben (Block 324), und das nachfolgende Rückleiten der Ausgabesteuerung an den DIB per Schleifenzeiger, um die Nachzielanweisungen auszugeben (Block 327).

4(C) ist ein Blockschaltbild des Prozessors 100 nach der den Blöcken 320, 324 und 327 zugeordneten Operation gemäß dem etablierten vereinfachten Beispiel. Wie in 4(C) angegeben, gibt nach dem Erreichen des DIB-Registers REG2 (d.h. des DIB-Registers, das durch das Schleifenausgabeindexfeld 158 identifiziert wird) der DIB-Ausgabezeiger die Schleifenanweisung INST9 (die durch den Ausgabezeiger 410(t1) angezeigt wird), aus, verschiebt dann die Ausgabesteuerung an das Zielanweisungsregister 153 und gibt die cache-gespeicherte Zielanweisung INST2 (die durch den Ausgabezeiger 410(t2) angezeigt wird) aus. Man beachte, daß bei bestimmten Prozessoren das Ausgeben von Zielanweisung(en) aus dem LCB anstelle des DIB die Schleifenausführung verschnellern kann, wodurch gegenüber Prozessoren, die Zielanweisungen nicht in einem eigenen Puffer cache-speichern, ein Vorteil erreicht wird. Nach dem Ausgeben der Zielanweisung(en) wird die Ausgabesteuerung durch den in dem DIB-Zeigerfeld 159 gespeicherten Wert an das DIB-Register REG4 zurückgeschoben, wodurch die Nachzielanweisung INST3 (die durch den Ausgabezeiger 410(t3) angezeigt wird) ausgegeben wird. Man beachte, daß das Verwenden des DIB-Zeigerfelds 159 dem Prozessor 100 gestattet, die Fall-through-Anweisung INST10 zu „überspringen" (d.h. sie nicht auszugeben/auszuführen), die in das DIB-Register REG3 geschrieben wurde.

Innere Schleifenphase

Mit Bezug auf den Anfang der mittleren Spalte von 3 werden nun Operationen beschrieben, die dem Vorabruffunktionsblock der Schleifenoperationssteuerschaltung 170 während innerer Schleifeniterationen zugeordnet sind. Die nachfolgend gegebene Besprechung der inneren Schleifeniteration hängt mit der in 15 gezeigten zusammen (d.h. wo der Schleifenzähler R1=2 oder R1=1 ist). Während die Anweisungen aus dem Schleifenhauptteil sequentiell abgerufen und ausgeführt werden, erzeugt der Programmzähler schließlich einen Wert, der mit der gespeicherten Trigger-Adresse übereinstimmt (Block 330). Nach der Erkennung der Trigger-Adresse injiziert, weil die aktuelle Vorhersage darin besteht, daß die Schleife „genommen" werden wird, der Vorabruffunktionsblock der Schleifenoperationssteuerschaltung die cache-gespeicherte Nachzieladresse (Block 337), wodurch der Programmzähler auf einen Wert zurückgesetzt wird, der der Zielanweisung der Schleife zugeordnet ist.

5(A) ist ein Blockschaltbild des Prozessors 100 nach der den Blöcken 330 und 337 zugeordneten Operation gemäß dem etablierten vereinfachten Beispiel. Wie in 5(A) gezeigt, werden die sequentiell erzeugten Programmzählerwerte, die durch die Vorabrufstufe 110A erzeugt werden, durch die Schleifenoperationssteuerschaltung 170 überwacht und mit dem in dem Trigger-Adressenfeld 152 gespeicherten Wert verglichen. Wenn der Programmzählerwert, der der vorletzten Anweisung INST8 (d.h. X1000_PC(t4)) zugeordnet ist, durch die Schleifenoperationssteuerschaltung 170 erkannt wird, wird die in dem Nachzieladressenfeld 154B gespeicherte Nachzieladresse (POST-TARGET_PC(t5)) zu der Vorabrufstufe 110A gesendet, wodurch bewirkt wird, daß die Vorabrufstufe die Nachzielanweisung INST3 abruft.

Mit Bezug auf die Mitte der mittleren Spalte von 3 umfassen Operationen, die dem Vordecodierfunktionsblock der Schleifenoperationssteuerschaltung 170 während einer inneren Schleifeniteration zugeordnet sind, das Aktualisieren des Schleifenausgabeindex und des DIB-Zeigers (Block 340). Diese Operation ist in 5(A) durch das gestrichelte Oval t6 angegeben. Insbesondere wird das Schleifenausgabeindexfeld 158 aktualisiert, so daß es das DIB-Register REG1 identifiziert, und das DIB-Zeigerfeld 159 wird so aktualisiert, daß es das DIB-Register REG2 identifiziert.

Am Ende in der mittleren Spalte von 3 ist zu sehen, daß Operationen, die dem Ausgabefunktionsblock der Schleifenoperationssteuerschaltung 170 während einer inneren Schleifeniteration zugeordnet sind, mit dem Ausgeben der vorletzten Anweisung aus dem DIB an die Prozessorausführungs-Pipeline beginnen, und zum selben Zeitpunkt wird die cache-gespeicherte Schleifenanweisung aus dem LCB an die Schleifenausführungsschaltung ausgegeben (Block 350). Die Schleifenausführungsschaltung verarbeitet dann die Schleifenanweisung auf die oben beschriebene Weise, um die zuvor hergestellte Genommen-/nicht-genommen-Vorhersage zu verifizieren, und erzeugt dann eine aktualisierte Genommen-/nicht-genommen-Vorhersage, die für die nächste sequentielle Schleifeniteration bereitgestellt wird (Block 353). Unter der Annahme, daß die vorherige „Genommen"-Vorhersage gültig war, wird die Ausgabesteuerung dann verschoben, um die in dem LCB cache-gespeicherte Zielanweisung auszugeben (Block 355), und als letztes wird die Ausgabesteuerung verschoben, um die in dem DIB cache-gespeicherte Nachzielanweisung auszugeben (Block 357).

5(B) ist ein Blockschaltbild des Prozessors 100 während den Operationen, die den Blöcken 350, 353, 355 und 337 zugeordnet sind, gemäß dem etablierten vereinfachten Beispiel. Wie in 5(B) gezeigt wird, wenn der Ausgabezeiger 410(t7) das DIB-Register REG1 (das in dem Schleifenausgabeindex 158 identifiziert wird) erreicht und die vorletzte Anweisung INST8 ausgibt, die Schleifenanweisung INST9 aus dem Feld 151 an die Schleifenausführungsschaltung 160 ausgegeben (wie durch den Schleifenausführungszeiger 510(t7) angegeben). Auf der Basis des in 15 gezeigten Beispiels umfaßt die Ausführung cache-gespeicherter Schleifenanweisung während der inneren Schleifenphase das Verifizieren der vorherigen Vorhersage (d.h. daß der Schleifenzählerwert größer oder gleich eins ist, wie bei dem vorliegenden Beispiel), das Erniedrigen des Schleifenzählers, und dann wird das Vorhersagefeld 155 aktualisiert. Man beachte, daß für das Beispiel von 15, wenn der Schleifenzählerwert von eins auf null erniedrigt wird, das Vorhersagefeld 155 auf „Nicht genommen" (M) gewechselt wird, wie durch das gestrichelte Oval t8 angegeben. Da die vorherige Vorhersage als gültig befunden wurde, verschiebt sich anschließend die Ausgabesteuerung zu dem Zielanweisungsfeld 153, wie durch den Ausgabezeiger 410(t9) angegeben, und die cache-gespeicherte Zielanweisung INST2 wird an die Ausführungsstufe 130 ausgegeben. Als letztes verschiebt sich die Ausgabesteuerung zurück zu dem DIB-Register REG2 mittels des in dem DIB-Zeigerfeld 159 gespeicherten Werts und die Nachzielanweisung INST3 wird an die Ausführungsstufe 130 ausgegeben, wie durch den Ausgabezeiger 410(t10) angegeben.

Schleifenaustrittsphase

Mit Bezug auf den Anfang der äußersten rechten Spalte von 3 werden nun Operationen beschrieben, die dem Ausgabefunktionsblock der Schleifenoperationssteuerschaltung 170 während des Schleifenaustritts zugeordnet sind. Bei dem in 15 eingeführten Beispiel erfolgt der Schleifenaustritt, wenn der Schleifenzähler R1 gleich null ist. Ähnlich wie in der inneren Schleifenphase beginnt der Schleifenaustritt mit dem Erkennen des Übertragens der Trigger-Adresse durch die Prozessorvorabrufstufe (Block 360). Nach der Erkennung der Trigger-Adresse unternimmt der Vorabruffunktionsblock nichts, weil die aktuelle Vorhersage darin besteht, daß die Schleife „nicht genommen" wird, und die Vorabrufstufe erzeugt die Adresse, die den Fall-through-Anweisungen der Schleife zugeordnet ist (Block 365).

6(A) ist ein Blockschaltbild des Prozessors 100 nach den Operationen, die den Blöcken 360 und 367 zugeordnet sind, gemäß dem etablierten vereinfachten Beispiel. Wie in 6(A) gezeigt, werden die durch die Vorabrufstufe 110A erzeugten sequentiell erzeugten Programmzählerwerte durch die Schleifenoperationssteuerschaltung 170 überwacht und mit dem in dem Trigger-Adressenfeld 152 gespeicherten Wert verglichen. Wenn der Programmzählerwert, der der vorletzten Anweisung INST8 (d.h. X1000_PC(t11)) zugeordnet ist, durch die Schleifenoperationssteuerschaltung 170 erkannt wird, unternimmt die Schleifenoperationssteuerschaltung 170 wegen der Schleife-nicht-genommen-Vorhersage (angegeben durch das „N" in dem Vorhersagefeld 155) nichts. Wie auf der rechten Seite der Vorabrufstufe 110A angegeben, entspricht folglich die nächste zu dem Speicher 101 gesendete Adresse (d.h. X10011(t12)) der Fall-through-Anweisung INST10.

Mit Bezug auf die Mitte der äußersten rechten Spalte von 3 umfassen Operationen, die dem Vordecodierfunktionsblock der Schleifenoperationssteuerschaltung 170 während des Schleifenaustritts zugeordnet sind, das Aktualisieren des Schleifenausgabeindex (Block 370) auf ähnliche Weise wie oben mit Bezug auf innere Schleifeniterationen beschrieben. In diesem Beispiel wird, wie durch das gestrichelte Oval t13 in 6(A) gezeigt, das Schleifenausgabeindexfeld 158 so aktualisiert, daß es das DIB-Register REG3 identifiziert.

Wie am Ende der äußersten rechten Spalte von 3 gezeigt, beginnt ähnlich wie bei inneren Schleifenoperationen der Ausgabefunktionsblock der Schleifenoperationssteuerschaltung 170 während des Schleifenaustritts mit dem Ausgeben der vorletzten Anweisung aus dem DIB an die Prozessorausführungs-Pipeline, und gleichzeitig wird die cache-gespeicherte Schleifenanweisung aus dem LCB an die Schleifenausführungsschaltung ausgegeben (Block 380). Die Schleifenausführungsschaltung verarbeitet dann die Schleifenanweisung auf die oben beschriebene Weise, um die zuvor hergestellte Nicht-genommen-Vorhersage zu verifizieren (Block 384). Unter der Annahme, daß die vorherige „Nicht-genommen"-Vorhersage gültig war, wird die Ausgabesteuerung dann verschoben, um die erste in dem DIB cache-gespeicherte Fall-through-Anweisung auszugeben (Block 387), wodurch der Schleifenbetrieb beendet wird. Man beachte, daß das Ausgeben der ersten Fall-through-Anweisung ein Überspringen einer DIB-Registerspeicherstelle, die eine nicht ausgeführte Kopie der Schleifenanweisung speichert (siehe die Besprechung unten mit dem Thema Prozessoren, die IDWs verwenden) erfordern kann.

6(B) ist ein Blockschaltbild des Prozessors 100 während den Operationen, die den Blöcken 380, 384 und 387 zugeordnet sind, gemäß dem etablierten vereinfachten Beispiel. Wie in 6(B) gezeigt, wird, wenn der Ausgabezeiger 410(t14) das DIB-Register REG3 (das in dem Schleifenausgabeindex 158 identifiziert wird) erreicht und die vorletzte Anweisung INST8 ausgibt, die Schleifenanweisung INST9 aus dem Feld 151 an die Schleifenausführungsschaltung 160 ausgegeben (angegeben durch den Schleifenausführungszeiger 510(t14)). Auf der Basis des in 15 gezeigten Beispiels umfaßt die Ausführung cache-gespeicherter Schleifenanweisung das Verifizieren der vorherigen Nicht-genommen-Vorhersage (d.h. daß der Schleifenzählerwert gleich null ist). Da die vorherige Vorhersage als gültig befunden wurde, verschiebt sich die Ausgabesteuerung anschließend zu dem DIB-Register REG4 mittels des in dem DIB-Zeigerfeld 159 gespeicherten Werts, und die Fall-through-Anweisung INST10 wird an die Ausführungsstufe 130 ausgegeben, wie durch den Ausgabezeiger 410(t15) angegeben.

Spezialfälle

Während der Prozessor 100 (wie oben beschrieben) Operationen mit Null-Overhead ermöglicht, an denen eine einzige relativ lange ununterbrochene Schleifenanweisung beteiligt ist, werden außerdem mehrere zusätzliche neuartige Aspekte der vorliegenden Erfindung bereitgestellt, die das Behandeln von Mehrfachanweisungswörtern und das Auftreten falsch vorhergesagter Schleifen, injizierte Anweisungen aus asynchronen Verzweigungen oder anderen Interrupt-Mechanismen, kleine Schleifen, Schleifen mit Nullhauptteil und mehrfache (vernestete und nicht vernestete) Schleifenoperationen betreffen. Jeder dieser Spezialfälle wird nachfolgend beschrieben.

Falsche Genommen-/nicht-genommen-Vorhersagen

Gemäß einem weiteren Aspekt der vorliegenden Erfindung wird die einer cache-gespeicherten Schleife zugeordnete Genommen-/nicht-genommen-Vorhersage aus dem aktuellen Wert des Schleifenzählers, der systematischen Veränderung des der cache-gespeicherten Schleifenanweisung zugeordneten Schleifenzählerwerts und einer Annahme, daß der Schleifenzählerwert zwischen Ausführungen der cache-gespeicherten Schleifenanweisung nicht verändert wird, bestimmt. Unter Verwendung des oben dargelegten vereinfachten Beispiels wird, weil die cache-gespeicherte Schleifenanweisung INST9 von dem Typ ist, der den Schleifenzähler R1 in jeder Iteration um eins erniedrigt und austritt, wenn der Schleifenzähler R1 Null ist, die Schleife bei der nächsten Iteration als nicht genommen vorhergesagt, wenn der Schleifenzähler R1 gleich Null ist. In allen anderen Fällen (d.h. wenn der Schleifenzähler R1 größer oder gleich eins ist) wird die nachfolgende Schleifeniteration als genommen vorhergesagt.

Um einen Prozessorfehler aufgrund der falsch vorhergesagten Schleifenoperation zu verhindern, ist die Schleifenoperationssteuerschaltung 170 mit einem Fehlerkorrekturblock ausgestattet, der Vorhersageverifizierungssignal(e) aus der Schleifenoperationssteuerschaltung 170 empfängt und eine Fehlerkorrektur einleitet, wenn eine falsche Vorhersage auftritt (z.B. wenn der Schleifenzähler innerhalb des Schleifenhauptteils verändert wird). Solche Verifizierungssignale zeigen zwei Formen von Fehlern an: erstens wurde die Schleife als genommen vorhergesagt, aber der Zählerwert hat einen Nicht-genommen-Wert (z.B. Null); und zweitens wurde die Schleife als nicht genommen vorhergesagt, und der Zählerwert hat einen Genommen-Wert (z.B. eins oder mehr).

7(A) ist ein Blockschaltbild des Prozessors 100 während einer inneren Schleifenoperation (oben besprochen), wobei der Fall dargestellt ist, in dem die beispielhafte Schleife als genommen vorhergesagt wurde, aber der Schleifenzähler R1 zu Null bestimmt wurde. Wenn der Ausgabezeiger 410(t7) die vorletzte Anweisung INST8 ausgibt, wird wie oben beschrieben die Schleifenanweisung INST9 aus dem Feld 151 an die Schleifenausführungsschaltung 160 ausgegeben (wie durch den Schleifenausführungszeiger 510(t7) angegeben). In diesem Beispiel ist der Schleifenzählerwert Null (oder eine negative Zahl), wenn die vorherige Vorhersage verifiziert wird. Da die in dem Vorhersagefeld 155 gespeicherte Vorhersage „genommen" (T) ist, ist die abgerufene Anweisung, auf die der DIB-Zeiger 159 zeigt, die Nachzielanweisung INST3, und dies ist falsch, weil der Schleifenzählerwert Null ist. Um diesen Fehler zu korrigieren, injiziert die Schleifenoperationssteuerschaltung 170 dann den Programmzählerwert 2+TRIGGER_PC(t8A), der bewirkt, daß die Vorabrufstufe die Fall-through-Anweisung INST10 adressiert (d.h. die Adresse X1010(t8A) erzeugt). Zusätzlich wird der Ausgabezeiger bei Erkennung der Fall-through-Anweisung INST10 in der Vordecodierstufe 118A zurückgesetzt.

7(B) ist ein Blockschaltbild des Prozessors 100 während einer Schleifenaustrittsoperation (oben besprochen), wobei der Fall dargestellt ist, in dem die beispielhafte Schleife als nicht genommen vorhergesagt wurde, aber der Schleifenzähler R1 als größer als Null bestimmt wird. In diesem Fall gibt der Ausgabezeiger 410(t14) die vorletzte Anweisung INST8 aus, und der Schleifenausführungszeiger 510(t14) gibt die Schleifenanweisung INST9 an die Schleifenausführungsschaltung 160 aus. In diesem Beispiel ist der Schleifenzählerwert eins (oder ein anderer positiver Wert), wenn die vorherige Vorhersage verifiziert wird. Da die in dem Vorhersagefeld 155 gespeicherte vorherige Vorhersage „Nicht genommen" (N) ist, ist die abgerufene Anweisung, auf die der DIB-Zeiger 159 zeigt, die Fall-through-Anweisung INST10, und das ist wegen des positiven Schleifenzählerwerts falsch. Um diesen Fehler zu korrigieren, injiziert die Schleifenoperationssteuerschaltung 170 dann den Programmzählerwert POST-TRIGGER_PC(t15A), der bewirkt, daß die Vorabrufstufe die Nachtriggeranweisung INST3 adressiert (d.h. die Adresse X0011(t15A) erzeugt). Weiterhin wird der Ausgabezeiger 410(t15A) auf das Zielanweisungsfeld 153 verschoben, von dem aus die Zielanweisung INST2 ausgegeben wird, und der DIB-Zeiger wird nach der Erkennung der Zielanweisung INST3 in der Vordecodierstufe 118A zurückgesetzt. Man beachte, daß durch Speichern mehrerer Anweisungen in dem Zielanweisungsfeld 153 ein durch eine solche falsche Vorhersage verursachter Kostenfaktor (Verzögerung) vermieden werden kann. Das heißt, wenn Anweisungen aus dem Zielanweisungsfeld 153 ausgegeben werden, bis die Nachzielanweisung den DIB 122 erreicht, dann führt das falsch vorhergesagte Schleifenende zu einer Prozessorverzögerung von Null.

Unterbrechungen

Gemäß einem weiteren Aspekt der vorliegenden Erfindung wird eine cache-gespeicherte Schleife invalidiert, wenn eine asynchrone Verzweigung, ein Trap oder ein anderer Mechanismus eine Anweisung während des Schleifeneintritts (d.h. bevor der LCB 150 vollständig aktualisiert ist) von außerhalb des Schleifenhauptteils injiziert. Bei einer Ausführungsform ist ein LCB-gültig-Bit in dem LCB 150 vorgesehen, um einen Betrieb mit einem unvollständigen LCB-Datensatz zu verhindern. Das Gültig-Bit wird auf „false" gesetzt, wenn der LCB-Aktualisierungsprozeß beginnt (z.B. in dem in 4(A) angegebenen Zustand, wenn die Schleifenanweisung INST9 cache-gespeichert ist, aber bevor die Zielanweisung INST2 cache-gespeichert ist). Dieses Gültig-Bit wird nach dem Abschluß des LCB-Aktualisierungsprozesses (z.B. wenn die Zielanweisung INST2 cache-gespeichert ist und der Schleifenausgabeindex und DIB-Zeigerfelder aktualisiert sind) auf „true" gewechselt. Wenn eine Anweisung von außerhalb des Schleifenhauptteils bei der Vordecodierung während des Cache-Speicherns einer Schleifenanweisung (d.h. während des Schleifeneintritts) erkannt wird, dann wird das Gültig-Bit auf „false" gesetzt, und die Schleifen-Cache-Speicherung wird beendet (d.h. die Steuerung wird auf die injizierte Anweisung bzw. die injizierten Anweisungen übergewechselt). Andere mit Mehrfachschleifenoperationen zusammenhängende Gültigkeitsprobleme werden mit Bezug auf die unten dargelegte zweite Ausführungsform besprochen.

Kleine Schleifen

Kleine Schleifen (d.h. mit einer relativ kleinen Anzahl von Anweisungen) stellen ein Synchronisierungsproblem dar, wenn die Trigger-Adresse erkannt wird, wodurch der Start einer aktuellen Iteration angezeigt wird, bevor die cache-gespeicherte Schleifenanweisung aus einer vorherigen Iteration ausgeführt ist. Um diese Situation zu behandeln, wird in dem LCB ein Vorhersage-gültig-Bit vorgesehen, mit dem Operationen der Vorabrufstufe 110A mit denen der Schleifenausführungsschaltung 160 synchronisiert werden. Jedes Mal, wenn eine cache-gespeicherte Schleifenanweisung durch die Schleifenausführungsschaltung 160 ausgeführt wird, wird das Vorhersage-gültig-Bit auf einen „true"-Wert (z.B. 1) gesetzt, und ein nachfolgendes Abrufen der cache-gespeicherten Schleifenanweisung (tatsächlich der vorletzten Anweisung) setzt das Vorhersage-gültig-Bit auf einen „False"-Wert (z.B. 0). Wenn sowohl das Vorabrufen als auch die Ausführung gleichzeitig auftreten, dann bleibt das Vorhersage-gültig-Bit gleich (die Ausführung hebt den Effekt der Vorabrufung auf). Im Fall bestimmter kleiner Schleifen wird jedoch, wenn das Vorhersage-gültig-Bit „false" ist, wenn die Trigger-Adresse erkannt wird, das Vorabrufen angehalten, bis das Vorhersage-gültig-Feld 156 zu „true" wechselt.

Gemäß einem weiteren Aspekt der vorliegenden Erfindung stellen bestimmte kleine Schleifen (z.B. weniger als fünf Anweisungen in dem oben dargelegten vereinfachten Beispiel) insofern einen Spezialfall dar, als die Ausführung solcher kleinen Schleifen unter Verwendung des oben dargelegten Prozesses (d.h. Abrufen des Schleifenhauptteils aus dem Speicher 101 in jeder Schleifenoperation) unnötige Verzögerungen einführen könnte, während die Pipeline gefüllt wird. Um diese Verzögerungen zu vermeiden, wird, wie in dem nachfolgend angegebenen Beispiel dargelegt, der gesamte Schleifenhauptteil in dem Zielanweisungsfeld 153 (und notwendigenfalls in einem oder mehreren Registern des DIB 122) gespeichert, und das Abrufen von Anweisungen wird bis zum Schleifenaustritt gesperrt (d.h. es wird Schleife nicht genommen vorhergesagt).

8 ist ein vereinfachtes Diagramm eines Abschnitts 810 eines Softwareprogramms mit einer kleinen Schleife, die durch Anweisungen INST02 bis INST05 gebildet wird. Ähnlich wie bei dem in 15 angegebenen Beispiel setzt die Anweisung INST01 einen Schleifenzähler R2 auf einen ganzzahligen Wert von drei (angegeben durch „[R2==3]"), und die Schleifenanweisung INST05 ist eine Schleifenanweisung, die wie nachfolgend beschrieben arbeitet.

9 ist ein vereinfachtes Blockschaltbild eines Prozessors 100A zur Ausführung des Programmabschnitts 810 (8) gemäß einer weiteren Ausführungsform der vorliegenden Erfindung. Der Prozessor 100A ist dem (oben beschriebenen) Prozessor 100 ähnlich, mit der Ausnahme, daß der LCB 150A ein Sperrfeld 910 enthält (alle anderen Stufen und Schaltungen arbeiten im wesentlichen wie oben beschrieben). Wie bereits erwähnt, wird, wenn die kleine Schleife (z.B. die Anweisungen INST02 bis INST05) des Softwareprogrammabschnitts 810 aus dem Speicher 101 abgerufen wird, das Sperrfeld 910 auf „true" (Y) gesetzt, und das Vorabrufen wird angehalten. Wie in 9 gezeigt, wird an diesem Punkt jede Anweisung der kleinen Schleife entweder in dem LCB 150A oder in dem DIB 122 gespeichert. In diesem Beispiel werden die Schleifenanweisung INST05 und die Zielanweisung INST02 in den zugeordneten Feldern von 150A gespeichert, die Nachzielanweisung INST03 wird in dem DIB-Register REG1 gespeichert und die vorletzte Anweisung INST04 in dem DIB-Register REG2. Das Schleifenausgabeindexfeld 158 und der DIB-Zeiger 159 werden permanent (d.h. bis zum Schleifenaustritt) gespeichert. Folglich umfassen innere Schleifeniterationen das Ausgeben der Zielanweisung INST02 aus dem Zielanweisungsfeld 153 (angegeben durch den Zeiger 410(t21)) nach dem Verifizieren einer vorherigen Schleife-genommen-Vorhersage und das anschließende Verschieben der Ausgabesteuerung gemäß dem DIB-Zeigerfeld 159 (wie durch den Zeiger 410(t22) angegeben) zu dem DIB-Register REG1, wodurch die Nachzielanweisung INST03 ausgegeben wird. Die Ausgabesteuerung schreitet dann zu dem DIB-Register REG2 (angegeben durch den Zeiger 410(t23)) voran, wodurch die vorletzte Anweisung INST04 ausgegeben wird. Da das DIB-Register REG2 mit dem in dem Schleifenausgabeindexfeld 158 gespeicherten Wert übereinstimmt, wird die Schleifenanweisung INST05 auch aus dem LCB 150A (angegeben durch den Zeiger 150(t23)) an die Schleifenausführungsschaltung 160 ausgegeben, und dort wird die vorherige Vorhersage verifiziert und eine neue Vorhersage erzeugt. Dieser Prozeß wird fortgesetzt, bis die neue Vorhersage „nicht genommen" ist, wobei die Schleifenoperationssteuerschaltung 170A den Programmzähler für die Fall-through-Anweisung INST06 injiziert, wodurch bewirkt wird, daß die Vorabrufstufe 110A eine entsprechende Adresse (d.h. Y0110(t24)) ausgibt.

Schleifen mit Nullhauptteil

Eine Schleife mit Nullhauptteil ist eine Schleife, die keine Anweisungen in ihrem Hauptteil aufweist (d.h. die Schleifenanweisung führt in einer Schleife zu sich selbst). Eine Schleife, deren Ziel vor der Schleifenanweisung liegt, wird hier als eine Vorwärtsschleife bezeichnet. Diese beiden Schleifentypen werden in einer Ausführungsform der vorliegenden Erfindung funktional unterstützt (d.h. die Leistungsfähigkeit dieser Schleifentypen mit Null-Overhead wird ermöglicht), indem ein LCB-Bit zum Identifizieren solcher Schleifen vorgesehen wird. Diese Schleifen werden zum Beispiel dadurch identifiziert, daß die Zieladresse mit der Trigger-Adresse verglichen wird, wenn die Schleifenanweisung cache-gespeichert wird. Wenn das LCB-Bit eine Null-Hauptteil-Schleifenanweisung anzeigt, dann wird das Vorabrufen des Schleifenhauptteils nicht initialisiert und die Schleifenanweisung wird wie eine andere Verzweigungsanweisung behandelt, wobei in diesem Fall das Schleifenziel durch die EX1-Stufe der LS-Pipeline injiziert wird, wenn der Schleifenzähler von Null verschieden ist.

Mehrfache Schleifen

Gemäß einem weiteren Aspekt der vorliegenden Erfindung werden mehrfache Schleifen (z.B. vernestete Schleifen) behandelt, indem zwei oder mehr LCBs vorgesehen werden und die Schleifenoperationssteuerschaltung so modifiziert wird, daß sie die Schleifen-Cache-Speicherung in den beiden LCBs koordiniert.

10 ist ein vereinfachtes Diagramm eines Prozessors 100B, der Schleifenoperationen mit Null-Overhead ermöglicht, gemäß einer weiteren Ausführungsform der vorliegenden Erfindung. Der Prozessor 100B ist dem (oben beschriebenen) Prozessor 100 ähnlich, mit der Ausnahme, daß die beiden LCBs (LCB1 und LCB2) vorgesehen sind, wobei jeder dieser LCBs Felder zum Speichern der Anweisung, von Adressen- und Steuerdaten, wie oben mit Bezug auf den LCB 150 beschrieben, enthält. Andere Stufen und Komponenten des Prozessors 100B funktionieren im wesentlichen wie oben beschrieben (mit den nachfolgend angegebenen Ausführungen).

11 ist ein vereinfachtes Diagramm eines Abschnitts 1110 eines Softwareprogramms, der zwei vernestete Schleifen enthält, die durch die Anweisungen INST21 bis INST31 gebildet werden. Wenn sie durch den Prozessor 100B abgerufen werden, werden die Anweisungen INST21 bis INST27 auf die oben beschriebene Weise sequentiell abgerufen und ausgeführt. Nachdem die Schleifenanweisung INST28 das erste Mal (d.h. zu einem Zeitpunkt t1) erkannt wurde, prüft der Prozessor 100B auf verfügbare LCBs (an diesem Punkt in dem Beispiel werden beide als verfügbar angenommen). Als nächstes wird die durch die Anweisungen INST24 bis INST28 gebildete Schleife (die als die „vernestete Schleife" bezeichnet wird) cache-gespeichert und gemäß dem oben beschriebenen Prozeß unter Verwendung des LCB1 des Prozessors 110B ausgeführt. Insbesondere führt der Prozessor 100B folgendes durch: Cache-Speicherung der Schleifenanweisung INST28 in dem Feld 151 des LCB1, Abrufen der Zielanweisung INST24, Schreiben der Adresse der vorletzten Anweisung INST27 in das Feld 152 des LCB1 und Schreiben der Nachzieladresse, die der Nachzielanweisung INST24 zugeordnet ist, in das Feld 154Bdes LCB1. Zusätzlich wird ein dem LCB1 zugeordnetes „Verriegelungs"-Bit gesetzt, wenn das Vorabrufen der Zielanweisung INST24 eingeleitet wird. Wenn anschließend die Zielanweisung INST24 zu einem Zeitpunkt t2 in der Vordecodierstufe ankommt, wird sie in dem Feld 153 des LCB1 cache-gespeichert. Das „Verriegelungs"-Bit wird ausgeschaltet, wenn INST28 zu der EX1-Stufe (d.h. 161) des Prozessors 100B reicht, in der der Prozessor 100B die Genommen-/nicht-genommen-Vorhersage validiert (das „Verriegelungs"-Bit wird ausgeschaltet). Das „Verriegelungs"-Bit wird anschließend jedes Mal dann eingeschaltet, wenn ein spekulativ vorabgerufenes Ziel in den DIB 122 geschrieben wird (d.h. der LCB1 wird jedes Mal auf der Basis der vorabgerufenen Zielinformationen – Ausgabeindex und DIB-Zeiger – aktualisiert), und wird jedes Mal ausgeschaltet, wenn die aktuelle Genommen-/nicht-genommen-Vorhersage auf die oben beschriebene Weise validiert wird. Die vernestete Schleife wird auf diese Weise bis zum Schleifenaustritt verarbeitet, und an diesem Punkt wird die Steuerung an die Anweisung IMST29 abgegeben. Man beachte jedoch, daß die in dem LCB1 gespeicherten Werte gehalten werden.

Die Ausführung des Programmabschnitts 1110 wird dann fortgesetzt, bis die Schleifenanweisung INST31 erkannt wird. Obwohl der LCB1 verfügbar sein kann, wird die Schleifenanweisung INST31 zu einem Zeitpunkt t3 in dem Feld 151 des LCB2 cache-gespeichert (wie auf der rechten Seite von 11 angegeben). Zu diesem Zeitpunkt wird das Vorabrufen der Zielanweisung INST21, wie oben beschrieben, initialisiert, und es wird ein dem LCB2 zugeordnetes „Verriegelungs"-Bit gesetzt. Zusätzlich wird die Adresse der vorletzten Anweisung INST30 in dem Feld 152 des LCB2 gespeichert, und die der Nachzielanweisung INST22 zugeordnete Nachzieladresse wird auf der Basis von durch die Schleifenanweisung INST31 bereitgestellten Informationen in dem Feld 154B des LCB2 gespeichert.

Wenn nachfolgend die Zielanweisung INST21 in der Vordecodierstufe zu einem Zeitpunkt t4 ankommt, wird sie ebenfalls in dem Feld 153 des LCB2 cache-gespeichert. Wie bei LCB1 wird das LCB2 zugeordnete „Verriegelungs"-Bit anschließend bei jeder LCB2-Aktualisierung ein- und jedes Mal, wenn die vorherige Vorhersage verifiziert wird, ausgeschaltet.

Die sequentielle Anweisungsverarbeitung wird dann fortgesetzt, bis die vorletzte Anweisung INST30 ein zweites Mal erkannt wird (d.h. durch Vergleichen des ausgegebenen Programmzählers mit der in dem Feld 152 des LCB2 gespeicherten Trigger-Adresse). Die cache-gespeicherte Schleifenanweisung INST31 wird dann auf die oben beschriebene Weise aus dem LCB1 ausgegeben und ausgeführt. Wenn die äußere Schleife genommen wird, wird die Ausgabesteuerung auf die oben beschriebene Weise an die Zielanweisung INST21 zurückgegeben. Andernfalls wird die Steuerung an die Fall-through-Anweisung INST32 abgegeben.

Eine weitere Mehrfachschleifensituation entsteht, wenn mehr Schleifen in einem Programm angetroffen werden, als LCBs verfügbar sind. Wenn zum Beispiel sowohl der LCB1 als auch der LCB2 des Prozessors 110B belegt sind und eine dritte Schleife angetroffen wird, muß der Prozessor 100B bestimmen, ob er LCB1 ersetzen (überschreiben), LCB2 ersetzen oder die dritte Schleife einfach nicht cache-speichern soll. Wie durch das in 12(A) gezeigte vereinfachte Diagramm angegeben, wird, wenn sich eine dritte nicht vernestete Schleife (d.h. einschließlich der Schleifenanweisung LP-3) außerhalb der ersten beiden Schleifen befindet und beide LCBs nicht verriegelt sind (d.h. die sowohl LCB1 als auch LCB2 zugeordneten „Verriegelungs"-Bit sind ausgeschaltet), der erste verfügbare LCB (d.h. der LCB, der zuvor die der Schleifenanweisung LP-1 zugeordnete Schleife speichert) mit der Schleifenanweisung LP-3 ersetzt. Im Gegensatz dazu wird, wie durch das in 12(B)) gezeigte vereinfachte Diagramm gezeigt, wenn die dritte Schleife in den ersten beiden Schleifen vernestet ist, die Schleife (LP-1 oder LP-2), die weniger oft iteriert wird, ersetzt. Das heißt, in dem in 12(B) gezeigten Fall wird der die Schleifenanweisung LP-2 speichernde LCB mit der Schleifenanweisung LP-3 ersetzt.

13 ist ein Zustandsdiagramm eines verriegelbaren modifizierten Schemas des Typs LRU (least-recently-used), das von der Schleifenoperationsteuerschaltung 170B des Prozessors 100B (10) zum Zuweisen des LCB1 und des LCB2 gemäß einem weiteren Aspekt der vorliegenden Erfindung verwendet wird. Das LRU-Schema enthält vier Zustände: einen Zustand „0" (Null), in dem kein LCB cache-gespeichert wird, einen Zustand „1" (eins), in dem nur LCB1 cache-gespeichert wird, und Zustände „2" (zwei) und „3" (drei), in denen sowohl LCB1 als auch LCB2 cache-gespeichert werden. Wenn beide LCBs cache-gespeichert werden, verschiebt sich die Steuerung zwischen den Zuständen „2" und „3" abhängig davon, welche der cache-gespeicherten Schleifen am häufigsten iteriert wird (d.h. abhängig davon, welche LCBs „getroffen" werden).

Prozessoren, die IDWs verwenden

Die oben angegebene Beschreibung verwendet stark vereinfachte Beispiele zur Erläuterung. Zum Beispiel betreffen die oben angegebenen Beispiele einen vereinfachten Prozessor, bei dem in jedem Abrufzyklus eine Anweisung aus dem Systemspeicher gelesen wird. Wie bereits erwähnt, transferieren bestimmte Prozessoren jedoch Anweisungen unter Verwendung von Anweisungsdoppelwörtern (IDWs) aus dem Systemspeicher in die Prozessor-Abruf-/Vordecodierstufe. Diese Prozessoren leiten die abgerufenen IDWs (oder umgeordnete Teile davon) häufig bis zum Ausgeben aus dem DIB in die Ausführungsstufe durch die Prozessorstufen. Zum Beispiel ist der von der Infineon Technologies AG hergestellte TriCore-Mikroprozessor ein eingebetteter Doppel-Pipeline-RISC+DSP-Prozessor, der bei jeder Abrufanforderung 64 Bit adressenausgerichteten Programmcode abruft. Diese 64-Bit-Programmcode-IDWs werden auf ähnliche Weise wie oben beschrieben in die Abruf-/Vordecodierstufe des Prozessors abgerufen. Jede TriCore-Anweisung kann entweder eine 16-Bit-Anweisung oder eine 32-Bit-Anweisung sein und ist bezüglich Architektur entweder als eine IP-Anweisung (d.h. gekennzeichnet für Ausführung in der IP-Pipeline) oder als eine LS-Anweisung (z.B. Schleifenanweisungen sind LS-Anweisungen) definiert. Wenn eine 32-Bit-Anweisung in zwei 16-Bit-Teile aufgetrennt wird, die in zwei sequentiellen IDWs übertragen werden, werden die beiden Teile in der Vordecodierstufe vor der Ausgabe an den DIB wieder zusammengestellt. Während des nachfolgenden Ausgebens werden pro Prozessorzyklus maximal zwei Anweisungen aus dem DIB an die Ausführungsstufe ausgegeben (d.h. eine 16-Bit- oder 32-Bit-IP-Anweisung an die IP-Pipeline und/oder eine 16-Bit- oder 32-Bit-LS-Anweisung an die LS-Pipeline).

Da ein IDW bis zu vier Anweisungen (I1, I2, I3 und I4) aufweisen kann, könnten beliebige oder alle dieser vier Anweisungen eine cache-gespeicherte oder eine nicht cache-gespeicherte Schleifenanweisung sein. Da nur ein Schleifenzielvorabruf auf einmal eingeleitet werden kann, muß entschieden werden, welches Schleifenanweisungsziel für jedes IDW abgerufen werden soll. Bei einer Ausführungsform basiert die Entscheidung, eine nicht cache-gespeicherte Schleife (L.U) im Cache zu speichern, auf der Anordnung der Anweisungen I1–I4 in dem IDW (d.h. die in der Vordecodierstufe umgeordnet wird), die in Tabelle 1 (unten) gezeigt ist.

Legende:

  • L = Schleifenanweisung,
  • U = nicht cache-gespeichert,
  • nL = keine Schleife,
  • C = cache-gespeichert,
  • nT = nicht genommen (Vorhersage) und „–" = gleichgültig.

Nunmehr mit Bezug auf die (obige) Tabelle 1, wird jede nicht cache-gespeicherte Schleife (L.U) nur dann cache-gespeichert, wenn das (in der Vordecodierstufe umgeordnete) IDW zu einem der obigen 10 Typen gehört (jede Zeile der Tabelle stellt ein IDW in der Vordecodierung dar). Wenn zum Beispiel im Fall Nr. 1 in Tabelle 1 die nicht cache-gespeicherte Schleifenanweisung die erste Anweisung (I1) in einem IDW ist, dann wird die Schleifenanweisung cache-gespeichert (d.h. LCB-Aktualisierung ist qualifiziert). Mit Bezug auf Fall Nr. 5, wenn die erste Anweisung (I1) eine cache-gespeicherte Schleife ist, die als nicht genommen vorhergesagt wird (d.h. L.C.nT) und die zweite Anweisung (I2) eine nicht cache-gespeicherte Schleife ist, dann wird die nicht cache-gespeicherte Schleifenanweisung cache-gespeichert (d.h. LCB-Aktualisierung ist qualifiziert). Die übrigen Fälle geben andere Anordnungen an, in denen nicht cache-gespeicherte Schleifen cache-gespeichert werden. Man beachte, daß zusätzlich zu der Positionierung in einem IDW, wie in Tabelle 1 angegeben, das Schleifen-Cache-Speichern nur dann beginnen würde, wenn ein LCB verfügbar ist (die LCB-Verfügbarkeit wird zum Beispiel durch die in 13 gezeigte und oben besprochene LRU entschieden).

Zusätzlich zu den Entscheidungen bezüglich der Schleifen-Cache-Speicherung (oben besprochen) erfordert die Verwendung von IDWs außerdem eine Modifikation der Art der Definition der Felder jedes LCB. Falls zum Beispiel jedes DIB-Register zwei IDWs speichert und jeder LCB Register zum Speichern von zwei IDWs enthält, müssen der Schleifenausgabeindex und der DIB-Zeiger so modifiziert werden, daß sie jede der potentiellen Anweisungsadressen in diesen Schaltungen adressieren. Zum Beispiel kann eine cache-gespeicherte Zielanweisung in einem IDW enthalten sein, das Vorschleifenanweisungen enthält, die alle in einem zugeordneten LCB-Register cache-gespeichert werden. In diesem Fall wird ein Zeiger verwendet, um das Ausgeben aus der tatsächlichen Speicherstelle der Zielanweisung zu beginnen. Ähnlich würde die Trigger-Adresse jeder cache-gespeicherten Schleifenanweisung die tatsächliche Schleifenanweisung abrufen, wenn sich sowohl die Schleifenanweisung als auch die zugeordnete vorletzte Anweisung in demselben IDW befinden. Auch wenn die abgerufene Version der cache-gespeicherten Schleifenanweisung (und etwaiger Fall-through-Anweisungen) den DIB erreicht, wird wieder die tatsächliche cache-gespeicherte Schleifenanweisung aus dem LCB ausgegeben. Obwohl die vorliegende Erfindung mit Bezug auf bestimmte spezifische Ausführungsformen beschrieben wurde, ist für Fachleute ersichtlich, daß die erfindungsgemäßen Merkmale der vorliegenden Erfindung auch auf andere Ausführungsformen anwendbar sind, die alle in den Schutzumfang der vorliegenden Erfindung fallen sollen. Zum Beispiel kann das Zielfeld 153 (1) weggelassen werden, eine oder mehrere Zielanweisungen nicht cache-zu-speichern, kann jedoch die Schleifenausführung während des Schleifeneintritts verzögern und außerdem die Ausführung bestimmter kleinerer Schleifen verzögern. Obwohl die oben angegebenen Beispiele hauptsächlich eine Art von Prozessor und eine Art von Schleifenanweisung betreffen, ist außerdem für Fachleute erkennbar, daß neuartige Aspekte der vorliegenden Erfindung verwendet werden können, um den Betrieb mit Null-Overhead anderer Prozessortypen und für andere Schleifenanweisungstypen bereitzustellen.


Anspruch[de]
Schaltung in einem Prozessor,

a) der eine Prefetch-Stufe (110A) zum Abrufen von Programmanweisungen (INSTx) aus einer Systemspeichereinrichtung (101) und

b) eine Ausführungsstufe (130) zur Ausführung der abgerufenen Programmanweisungen (INSTx) enthält,

c) zur Steuerung einer iterativen Ausführung einer Gruppe von Programmanweisungen (INST2–INST9), die eine Schleifenanweisung (INST9) und eine Zielanweisung (INST2) umfassen,

c.1) wobei jede Iteration der Gruppe von Programmanweisungen (INST2–INST9) mit der Ausführung der Zielanweisung (INST2) beginnt und mit der Ausführung der Schleifenanweisung (INST9) endet und

c.2) wobei bei der Ausführung der Schleifenanweisung (INST9) am Ende jeder Iteration ein Schleifenzählerwert bestimmt, ob eine neue Iteration eingeleitet und die Zielanweisung (INST2) ausgeführt wird oder ob die iterative Ausführung beendet und eine darauf folgende Fall-through-Anweisung (INST10) ausgeführt wird,

wobei die Schaltung folgendes umfasst:

d) einen Schleifen-Cache-Puffer (150), in dem ein Teil der Gruppe von Programmanweisungen (INST2–INST9) zwischengespeichert wird, wobei der zwischengespeicherte Teil der Programmanweisungen zumindest die Schleifenanweisung (INST9) und die Zielanweisung (INST2) umfaßt,

e) eine Schleifenausführungsschaltung (160), die bei Ausführung der Schleifenanweisung (INST9) einer ersten Iteration aus dem aktuellen Schleifenzählerwert vorhersagt, ob am Ende der darauf folgenden zweiten Iteration eine dritte Iteration eingeleitet oder ob die iterative Ausführung am Ende der zweiten Iteration beendet wird, und

f) eine an die Prefetch-Stufe (110A) angekoppelte Schleifenoperationssteuerschaltung (170), die

f.1) durch einen Adressvergleich mit einer Trigger-Adresse erkennt, dass eine erste vorbestimmte Anweisung in der Gruppe der Programmanweisungen durch die Prefetch-Stufe (110A) abgerufen wurde; und daraufhin

f.2) die Prefetch-Stufe (110A) so steuert, dass sie eine zweite vorbestimmte, nicht im Schleifen-Cache-Puffer (150) zwischengespeicherte Anweisung der Gruppe der Programmanweisungen abruft, wenn durch die Schleifenausführungsschaltung (160) eine weitere Iteration vorhergesagt wurde, beziehungsweise

f.3) die Prefetch-Stufe (110A) so steuert, dass sie die Fall-through-Anweisung (INST10) abruft, wenn die Beendigung der iterativen Ausführung durch die Schleifenausführungsschaltung (160) vorhergesagt wurde.
Schaltung nach Anspruch 1, dadurch gekennzeichnet, daß die Schleifenausführungsschaltung (160) die Schleifenanweisung (INST9) ausführt, während die erste vorbestimmte Anweisung in der Ausführungsstufe (130) ausgeführt wird. Schaltung nach Anspruch 1, dadurch gekennzeichnet, daß der das Ergebnis der Vorhersage repräsentierende aktuelle Vorhersagewert gespeichert und am Ende einer jeden Iteration durch Vergleichen mit dem aktuellen Schleifenzählerwert verifiziert wird. Schaltung nach Anspruch 1, dadurch gekennzeichnet, daß die Schleifenausführungsschaltung (160) ein Mittel zum Lesen des Schleifenzählerwerts aus einem vordefinierten Register (105A), ein Mittel, das den Schleifenzählerwert erniedrigt, und ein Mittel zum Schreiben des erniedrigten Schleifenzählerwerts in das vordefinierte Register (105A) umfaßt. Schaltung nach Anspruch 1, dadurch gekennzeichnet,

daß ein Anweisungspuffer (122) zum Speichern mehrerer Programmanweisungen vorgesehen ist, wobei die im Anweisungspuffer (122) gespeicherten Programmanweisungen sequentiell aus dem Anweisungspuffer (122) ausgegebenen und in der Ausführungsstufe (130) ausgeführt werden,

daß die Schleifenausführungsschaltung (160) die Schleifenanweisung (INST9) ausführt, den Schleifenzählerwert aktualisiert, und ein Schleife-genommen-Steuersignal erzeugt, wenn der Schleifenzählerwert gleich einem vorbestimmten Wert ist, und

daß die Zielanweisung (INST2) aus dem Schleifen-Cache-Puffer (150) an die Ausführungsstufe (130) ausgegeben wird, wenn die Schleifenausführungsschaltung (160) das Schleife-genommen-Steuersignal erzeugt.
Schaltung nach Anspruch 1, dadurch gekennzeichnet, daß die Trigger-Adresse die Adresse der vor der Schleifenanweisung (INST9) auszuführenden Programmanweisung ist, und und die zweite vorbestimmte Anweisung die nach der Zielanweisung (INST2) auszuführende Programmanweisung ist. Schaltung nach Anspruch 1, dadurch gekennzeichnet,

daß ein Anweisungspuffer (122) zum Speichern mehrerer Programmanweisungen vorgesehen ist, wobei die im Anweisungspuffer (122) gespeicherten Programmanweisungen sequentiell aus dem Anweisungspuffer (122) ausgegebenen und in der Ausführungsstufe (130) ausgeführt werden,

daß im Schleifen-Cache-Puffer (150) ein erster Zeigerwert gespeichert ist, der auf eine erste Speicherstelle des Anweisungspuffers (122) zeigt, und ein zweiter Zeigerwert gespeichert ist, der auf eine zweite Speicherstelle des Anweisungspuffers (122) zeigt,

daß überprüft wird, ob ein Ausgabezeigerwert des Anweisungspuffers (122) gleich dem ersten Zeigerwert ist, und

daß der Ausgabezeigerwert auf den zweiten Zeigerwert gesetzt wird, nachdem die Zielanweisung aus dem Schleifen-Cache-Puffer (150) ausgegeben wurde.
Schaltung nach Anspruch 1, dadurch gekennzeichnet,

daß die Gruppe von Programmanweisungen (INST2–INST9) eine Schleifenanweisung (INST9), eine Zielanweisung (INST2) und eine Vielzahl von Nachzielanweisungen (INST3–INST8), die sequentiell zwischen der Schleifenanweisung und der Zielanweisung angeordnet sind, umfaßt, und

daß die Vorabrufstufe (110A) gesperrt wird, wenn die Vielzahl von Nachzielanweisungen kleiner oder gleich der der Anzahl der in einem Anweisungspuffer (122) des Prozessors speicherbaren Programmanweisungen ist.
Schaltung nach Anspruch 1, dadurch gekennzeichnet,

daß ein zweiter Schleifen-Cache-Puffer zum Speichern einer zweiten zweiten Schleifenanweisung vorgesehen ist, und

daß selektiv die erste oder die zweite Schleifenanweisung aus dem ersten bzw. zweiten Schleifen-Cache-Puffer an die Schleifenausführungsschaltung ausgegeben werden.
Schaltung nach Anspruch 9, dadurch gekennzeichnet, daß die Zuweisung des ersten Schleifen-Cache-Puffers zu einer dritten Schleifenanweisung zwischen der Einleitung des spekulativen Vorabrufprozesses, bis zur Ausführung der ersten Schleifenanweisung durch die Schleifenausführungsschaltung (160) verhindert wird.






IPC
A Täglicher Lebensbedarf
B Arbeitsverfahren; Transportieren
C Chemie; Hüttenwesen
D Textilien; Papier
E Bauwesen; Erdbohren; Bergbau
F Maschinenbau; Beleuchtung; Heizung; Waffen; Sprengen
G Physik
H Elektrotechnik

Anmelder
Datum

Patentrecherche

Patent Zeichnungen (PDF)

Copyright © 2008 Patent-De Alle Rechte vorbehalten. eMail: info@patent-de.com