DE102014000382A1 - Vorhersage indirekter Abzweigungen - Google Patents

Vorhersage indirekter Abzweigungen Download PDF

Info

Publication number
DE102014000382A1
DE102014000382A1 DE102014000382.5A DE102014000382A DE102014000382A1 DE 102014000382 A1 DE102014000382 A1 DE 102014000382A1 DE 102014000382 A DE102014000382 A DE 102014000382A DE 102014000382 A1 DE102014000382 A1 DE 102014000382A1
Authority
DE
Germany
Prior art keywords
register
instruction
switch statement
jump table
value
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
DE102014000382.5A
Other languages
English (en)
Inventor
Hugh Jackson
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
MIPS Tech LLC
Original Assignee
Imagination Technologies Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Imagination Technologies Ltd filed Critical Imagination Technologies Ltd
Publication of DE102014000382A1 publication Critical patent/DE102014000382A1/de
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30061Multi-way branch instructions, e.g. CASE
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3804Instruction prefetching for branches, e.g. hedging, branch folding
    • G06F9/3806Instruction prefetching for branches, e.g. hedging, branch folding using address prediction, e.g. return stack, branch history buffer
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • G06F9/3844Speculative instruction execution using dynamic branch prediction, e.g. using branch history tables

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Advance Control (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

Verfahren und Abzweig-Prädiktoren zum Vorhersagen einer Zielposition eines Sprungtabellen-Switch-Statements in einem Programm. Das Verfahren umfasst ein kontinuierliches Überwachen von Instruktionen am Abzweig-Prädiktor, um festzustellen, ob sie in Register schreiben, die dafür verwendet werden, eine Eingabevariable in ein Sprungtabellen-Switch-Statement zu speichern. Jede Aktualisierung eines überwachten Registers wird in einer Registertabelle gespeichert, die durch den Abzweig-Prädiktor verwaltet wird. Wenn dann die Zeit gekommen ist, eine Vorhersage für eine Sprungtabellen-Switch-Statement-Anweisung zu treffen, verwendet der Abzweig-Prädiktor den in der Tabelle gespeicherten Registerwert zum Vorhersagen, wohin das Sprungtabellen-Switch-Statement abzweigen wird.

Description

  • Hintergrund
  • Out-of-Order-Prozessoren umfassen in der Regel einen Abzweig-Prädiktor, der vorhersagt, welche Richtung der Programmfluss im Fall von Instruktionen nehmen wird, von denen man weiß, dass sie mögliche Flussänderungen verursachen, wie zum Beispiel Abzweiginstruktionen. Die Abzweigvorhersage ist nützlich, da sie es ermöglicht, Instruktionen spekulativ durch den Prozessor ausführen zu lassen, bevor das Ergebnis der Abzweiginstruktion bekannt ist.
  • Jedoch lassen sich indirekte Abzweige (zum Beispiel Abzweige, die auf einer Variable anstelle eines konstanten Wertes basieren) schwierig vorhersagen, da der Abzweig-Prädiktor zwei Dinge vorhersagen muss: ob der Abzweig genommen wird, und wo das Ziel sein wird. Dementsprechend sind viele Abzweig-Prädiktoren nicht in der Lage, indirekte Abzweige präzise vorherzusagen.
  • Eine Lösung für dieses Problem hat darin bestanden, den durch den Abzweig-Prädiktor verwendeten Vorhersage-Algorithmus zu verbessern. Das ist aber oft recht schwierig und zeitaufwändig.
  • Eine weitere Lösung hat darin bestanden, einen Kompilierer zu implementieren, der dafür ausgelegt ist, Code zu entfernen, der sich auf eine schalterartige Struktur bezieht, so dass kein indirekter Abzweig mehr erforderlich ist. Es ist jedoch schwierig, Situationen zu erkennen, in denen der Code entfernt werden kann.
  • Die unten beschrieben Ausführungsformen sind nicht auf Implementierungen beschränkt, die einige oder alle Nachteile beseitigen, die man von Out-of-Order-Prozessoren kennt.
  • Kurzfassung
  • Diese Kurzfassung wird bereitgestellt, um in einer vereinfachten Form eine Auswahl von Konzepten vorzustellen, die weiter unten in der Detaillierten Beschreibung ausgeführt werden. Diese Kurzdarstellung der Erfindung hat weder zur Aufgabe, Schlüsselmerkmale oder wesentliche Merkmale des beanspruchten Gegenstandes herauszustellen, noch soll sie dafür herangezogen werden, den Schutzumfang des beanspruchten Gegenstandes abzugrenzen.
  • Im vorliegenden Text werden Verfahren und Abzweig-Prädiktoren zum Vorhersagen einer Zielposition eines Sprungtabellen-Switch-Statements in einem Programm dargelegt. Das Verfahren umfasst ein kontinuierliches Überwachen von Instruktionen am Abzweig-Prädiktor, um festzustellen, ob sie in Register schreiben, die dafür verwendet werden, eine Eingabevariable in einem Sprungtabellen-Switch-Statement zu speichern. Jede Aktualisierung eines überwachten Registers wird in einer Registertabelle gespeichert, die durch den Abzweig-Prädiktor verwaltet wird. Wenn dann der Moment kommt, eine Vorhersage für eine Sprungtabellen-Switch-Statement-Anweisung zu treffen, die der Abzweig-Prädiktor verwendet, so wird der in der Tabelle gespeicherte Registerwert verwendet, um vorherzusagen, wohin das Sprungtabellen-Switch-Statement abzweigt.
  • Ein erster Aspekt stellt ein Verfahren zum Vorhersagen einer Zielposition eines Switch-Statements in einem durch einen Prozessor ausgeführten Programm bereit, wobei das Verfahren umfasst: Speichern, in einer durch einen Abzweig-Prädiktor verwalteten Registertabelle, eines aktuellen Wertes für wenigstens ein überwachtes Register, wobei zu jedem überwachten Register festgestellt wurde, dass es eine Eingabevariable in einem Sprungtabellen-Switch-Statement speichert, wobei ein Sprungtabellen-Switch-Statement ein Switch-Statement ist, das zu einer Sprungtabelle kompiliert wurde; Empfangen, am Abzweig-Prädiktor, einer Instruktion für eine Vorhersage; Feststellen, anhand des Abzweig-Prädiktors, ob die empfangene Instruktion in eines der überwachten Register einen Aktualisierungswert schreibt; in Reaktion auf die Feststellung, dass die empfangene Instruktion in eines der überwachten Register einen Aktualisierungswert schreibt, Aktualisieren des aktuellen Wertes in der Registertabelle für das Register, das mit dem Aktualisierungswert beschrieben wurde; und Vorhersagen, anhand des Abzweig-Prädiktors, der Zielposition einer Sprungtabellen-Switch-Statement-Anweisung anhand des aktuellen Wertes.
  • Ein zweiter Aspekt stellt einen Abzweig-Prädiktor bereit, der umfasst: eine Registertabelle (116, 534, 536), wobei die Registertabelle einen aktuellen Wert für wenigstens ein überwachtes Register speichert, wobei zu jedem überwachten Register festgestellt wurde, dass es eine Eingabevariable in einem Sprungtabellen-Switch-Statement speichert, wobei ein Sprungtabellen-Switch-Statement ein Switch-Statement ist, das zu einer Sprungtabelle kompiliert wurde; und eine Logikeinheit in Kommunikation mit der Registertabelle (116, 534, 536), wobei die Logikeinheit ausgelegt ist zum: Empfangen einer Instruktion für eine Vorhersage; Feststellen, ob die empfangene Instruktion in eines der überwachten Register einen Aktualisierungswert schreibt; in Reaktion auf die Feststellung, dass die empfangene Instruktion in eines der überwachten Register einen Aktualisierungswert schreibt, Aktualisieren des aktuellen Wertes in der Registertabelle für das Register, das mit dem Aktualisierungswert beschrieben wurde; und Vorhersagen der Zielposition einer Sprungtabellen-Switch-Statement-Anweisung anhand des aktuellen Wertes.
  • Ein dritter Aspekt stellt einen Prozessor bereit, der den Abzweig-Prädiktor gemäß dem zweiten Aspekt umfasst.
  • Ein vierter Aspekt stellt einen Prozessor im Wesentlichen in der Form bereit, wie es mit Bezug auf die 1 und 2 beschrieben ist.
  • Ein fünfter Aspekt stellt ein Verfahren zum Vorhersagen einer Zielposition einer Switch-Statement-Anweisung im Wesentlichen in der Form bereit, wie es mit Bezug auf 4 beschrieben ist.
  • Ein sechster Aspekt stellt einen Prozessor im Wesentlichen in der Form bereit, wie es mit Bezug auf die 2 und 5 beschrieben ist.
  • Das im vorliegenden Text beschriebene Verfahren kann durch Software in maschinenlesbarer Form auf einem berührbaren Speichermedium zum Beispiel in Form eines Computerprogramms ausgeführt werden, das ein Computerprogrammcodemittel umfasst, das dafür ausgelegt ist, alle Schritte eines der im vorliegenden Text beschriebenen Verfahren auszuführen, wenn das Programm auf einem Computer ablauft, und wobei das Computerprogramm auf einem computerlesbaren Medium verkörpert sein kann. Zu Beispielen von berührbaren (oder nicht-transitorischen) Speichermedien gehören Disks, Speichersticks, Speicherkarten usw., und umfassen keine sich ausbreitenden Signale. Die Software kann zur Ausführung auf einem parallelen Prozessor oder einem seriellen Prozessor geeignet sein, dergestalt, dass die Verfahrensschritte in jeder geeigneten Reihenfolge oder gleichzeitig ausgeführt werden können.
  • Damit wird anerkannt, dass Firmware und Software wertvolle, separat handelbare Handelsgüter sein können. Es ist beabsichtigt, in diese Definition Software, die auf ”unintelligenter” oder Standard-Hardware abläuft oder diese steuert, um die gewünschten Funktionen auszuführen. Es ist ebenfalls beabsichtigt, in diese Definition Software aufzunehmen, die die Konfiguration von Hardware ”beschreibt” oder definiert, wie zum Beispiel HDL(Hardware Description Language)-Software, wie sie zum Entwerfen von Siliziumchips oder zum Konfigurieren universeller programmierbarer Chips verwendet, um gewünschte Funktionen auszuführen.
  • Die bevorzugten Merkmale können, wie dem Fachmann einleuchtet, nach Bedarf kombiniert werden, und können mit jedem der Aspekte der Erfindung kombiniert werden.
  • Kurze Beschreibung der Zeichnungen
  • Ausführungsformen der Erfindung werden beispielhaft mit Bezug auf die folgenden Zeichnungen beschrieben, in denen Folgendes zu sehen ist:
  • 1 ist ein Schaubild eines beispielhaften Out-of-Order-Prozessors mit einem einzelnen Thread;
  • 2 ist ein Schaubild einer beispielhaften Registertabelle von 1;
  • 3 ist ein Flussdiagramm eines Verfahrens zum Überwachen von Registern, die für Switch-Statement-Variablen verwendet werden;
  • 4 ist ein Flussdiagramm eines Verfahrens zum Vorhersagen der Zielposition einer Switch-Statement-Anweisung anhand der Daten in der Registertabelle der 1 und 2; und
  • 5 ist ein Schaubild eines beispielhaften Out-of-Order-Prozessors mit mehreren Threads.
  • In allen Figuren werden gemeinsame Bezugszeichen verwendet, um ähnliche Merkmale zu kennzeichnen.
  • Detaillierte Beschreibung
  • Im Folgenden werden Ausführungsformen der vorliegenden Erfindung lediglich beispielhaft beschrieben. Diese Beispiele zeigen die beste Art und Weise des Praktizierens der Erfindung, die dem Anmelder derzeit bekannt ist, obgleich es noch weitere Möglichkeiten gibt, dies zu erreichen. Die Beschreibung zeigt die Funktionen des Beispiels und die Abfolge der Schritte zum Herstellen und Betreiben des Beispiels auf. Jedoch können die gleichen oder vergleichbare Funktionen und Abfolgen auch durch andere Beispiele erreicht werden.
  • Wie oben beschrieben, sind indirekte Abzweige (zum Beispiel Abzweige, die auf einer Variable anstelle eines konstanten Wertes basieren) schwierig vorherzusagen, da der Abzweig-Prädiktor zwei Dinge vorhersagen muss: ob der Abzweig genommen wird, und wo das Ziel sein wird. Das Ziel ist besonders schwierig vorherzusagen, weil es in der Regel auf einem Registerwert basiert, der sich periodisch ändert.
  • Indirekte Abzweige werden oft in endlichen Automaten verwendet, die als eine Schleife mit einem C-Switch-Statement darin angesehen werden können. Wie dem Fachmann bekannt ist, werden Switch-Statements als ein Substitut für lange If-Statements verwendet, die eine Variable mit verschiedenen Werten vergleichen. Das Basisformat für ein Switch-Statement ist nachstehend gezeigt.
  • Figure DE102014000382A1_0002
  • Figure DE102014000382A1_0003
  • Das Switch-Statement kann eine beliebige Anzahl von Fallinstanzen enthalten. Der Wert der Variable, der in den Schalter eingegeben wird (zum Beispiel ”<variable>” im Beispiel oben), wird mit dem Wert verglichen, der jedem Fall zugewiesen wird (zum Beispiel Wert A und Wert B im Beispiel oben), und wenn die Variable mit einem der Werte übereinstimmt, so führt der Prozessor das Programm ab diesem Punkt bis zum Ende des Textkörpers oder bis zu einem Break-Statement aus. Das Standardvorgabe-Statement wird ausgeführt, wenn die Variable mit keinem der Fallwerte übereinstimmt. Wenn das Standardvorgabe-Statement weggelassen wird und keine Fallübereinstimmung gefunden wird, so wird keines der Statements im Switch-Textkörper ausgeführt.
  • Beim Erzeugen eines endlichen Automaten wird die in dem Switch-Statement verwendete Variable innerhalb jedes der Fall-Statements aktualisiert. Dieses Switch-Statement lässt sich schwierig vorhersagen, auch wenn die Variable erst vor kurzem eingestellt wurde.
  • Das Folgende ist ein beispielhafter Code, der einen endlichen Automaten (EA) (der ein Switch-Statement umfasst) zum Analysieren einer Zahl implementiert.
  • Figure DE102014000382A1_0004
  • Figure DE102014000382A1_0005
  • Figure DE102014000382A1_0006
  • Figure DE102014000382A1_0007
  • Die Aufgabe des beispielhaften Codes ist es festzustellen, ob eine Zahl eine ganze Zahl oder eine Gleitkommazahl (zum Beispiel eine Zahl mit einem Dezimalkomma) ist. Genauer gesagt wird in dem beispielhaften Code die Zustandsvariable zunächst auf INT gesetzt, um anzuzeigen, dass die Zahl eine ganze Zahl ist. Dann wird jedes Zeichen der Zahl eins nach dem anderen gelesen, bis eines der Zeichen ein Komma ist oder ein ungültiger Zustand erreicht ist (zum Beispiel eine Zahl mit mehreren Dezimalkommata). Für jedes Zeichen wird festgestellt, ob das Zeichen ein Punkt (”.”) ist. Wenn eines der Zeichen ein Punkt (”.”) ist, so wird die Zustandsvariable auf POINT gesetzt, um anzuzeigen, dass ein Dezimalkomma gefunden wurde. Sobald ein einzelner Punkt (”.”) gefunden wurde, stellt der Algorithmus fest, ob das Zeichen, das unmittelbar auf den Punkt (”.”) folgt, ein Punkt (”.”) ist oder nicht. Wenn das Zeichen, das unmittelbar auf den ersten Punkt (”.”) folgt, ebenfalls ein Punkt (”.”) ist, so wird die Zustandsvariable auf INVALID gesetzt, um anzuzeigen, dass die Zahl nicht gültig ist. Wenn das Zeichen, das unmittelbar auf den ersten Punkt (”.”) folgt, kein Punkt (”.”) ist, so wird die Zustandsvariable auf FLOHT gesetzt, um anzuzeigen, dass die Zahl eine Gleitkommazahl ist. Der Algorithmus überprüft dann jedes der übrigen Zeichen, um zu bestätigen, dass sie keine Punkte (”.”) sind. Der Algorithmus beendet das Überprüfen von Zeichen, sobald der Zustand auf INVALID gesetzt ist oder ein Komma (”,”) erreicht wird.
  • Einige Kompilierer sind dafür ausgelegt, Switch-Statements in eine Reihe von Vergleichen und direkter bedingter Abzweige umzuwandeln, wenn sie kompiliert sind. Zum Beispiel kann das folgende Switch-Statement in den in Table 1 gezeigten Maschinen-Code umgewandelt werden.
    Figure DE102014000382A1_0008
    Tabelle 1
    Adresse Instruktion Anmerkung
    0 × 20 cmp eax, 0 × 1 Switch-Statement-Anweisung: Vergleiche Wert mit 1
    0 × 24 je 0 × 40 Wenn Wert 1 ist, springe zu Code für Fall 1
    0 × 28 cmp eax, 0 × D Vergleiche Wert mit 13
    0 × 2C je 0 × 80 Wenn Wert 13 ist, springe zu Code für Fall 13
    0 × 30 Code, wenn Wert nicht 1 oder 13 ist
    ...
    0 × 40 Code für Fall 1
    ...
    0 × 80 Code für Fall 13
  • Einige Kompilierer sind dafür ausgelegt, Switch-Statements mit einer relativ kleinen Zahl von im Wesentlichen sequenziellen Fallwerten zu optimieren, indem solche Switch-Statements in eine Sprungtabelle umgewandelt werden, wenn sie kompiliert sind. Wie dem Fachmann bekannt ist, ist eine Sprungtabelle eine Anordnung mit einem Element für jeden möglichen Wert der Switch-Statement-Variable (zum Beispiel ”state” im obigen Beispiel). Der Wert jedes Sprungtabellenelements ist eine Adresse, die dort ist, wo sich der Code für das entsprechende Fall-Statement im Speicher befindet. Der Code verwendet die Variable (zum Beispiel ”state”), um ein Element aus der Sprungtabelle zu lesen.
  • Ein beispielhafter Pseudo-Code, der eine Sprungtabelle für das obige EA-Beispiel implementiert, ist unten gezeigt.
  • Figure DE102014000382A1_0009
  • Hier ist jedes Element der Sprungtabelle eine Adresse zu Code, der den entsprechenden Fall implementiert. Zum Beispiel enthält Sprungtabelle [0] die Adresse case_INT, die auf den Block aus Instruktionen weist, die den Fall INT ausführen; Sprungtabelle [1] enthält die Adresse case_POINT, die auf den Block aus Instruktionen weist, die den Fall POINT ausführen, und Sprungtabelle [2] enthält die Adresse case_FLOAT, die auf den Block aus Instruktionen weist, die den Fall FLOHT ausführen.
  • Ein Switch-Statement, das in eine Sprungtabelle umgewandelt wurde (zum Beispiel, weil es eine kleine Zahl von Fallwerten aufweist, die im Wesentlichen sequenziell sind), wird im vorliegenden Text als ein Sprungtabellen-Switch-Statement bezeichnet.
  • In einigen Fällen wird die Sprungtabelle unter Verwendung einer seriellen Liste von unbedingten Abzweiginstruktionen implementiert, die in die Verwendung eines Versatzes abgezweigt wird, der durch Multiplizieren eines sequenziellen Index mit der Instruktionslänge (der Anzahl von Bytes im Speicher, die durch jede Instruktion belegt werden) generiert wird. Wenn ein Switch-Statement in eine Sprungtabelle umgewandelt wurde, so ist der Index zu der Sprungtabelle die Switch-Statement-Variable (zum Beispiel „state” in dem obigen Beispiel), und der Wert jedes Sprungtabellenelements ist eine unbedingte Abzweiginstruktion, zu einer Adresse zu springen, wo sich der Code für das entsprechende Fall-Statement im Speicher befindet. Dementsprechend wird die Switch-Statement-Variable (zum Beispiel ”state”) dafür verwendet, das richtige Sprungtabellenelement auszuwählen, und sobald das richtige Sprungtabellenelement ausgewählt wurde, springt das Programm zu der durch das Sprungtabellenelement spezifizierten Adresse.
  • Zum Beispiel kann das folgende Switch-Statement (das nur zwei sequenzielle Fallwerte aufweist (0 und 1)) in den in Tabelle 2 gezeigten Maschinen-Code umgewandelt werden.
    Figure DE102014000382A1_0010
    Figure DE102014000382A1_0011
    Tabelle 2
    Adresse Instruktion Anmerkung
    0 × 20 jmp nextPC + eax·4 Switch-Statement-Anweisung:
    0 × 24 jmp 0 × 40 Sprungtabelleneintrag 0: Springe zu Code für Fall 0
    0 × 28 jmp 0 × 80 Sprungtabelleneintrag 1: Springe zu Code für Fall 1
    ...
    0 × 40 Code für Fall 0
    ...
    0 × 80 Code für Fall 1
  • Switch-Statements, die in einer Sprungtabelle kompiliert wurden, die unter Verwendung einer seriellen Liste unbedingter Abzweiginstruktionen implementiert wurde, werden im vorliegenden Text als ein relatives Sprungtabellen-Switch-Statement bezeichnet, weil der Sprung relativ zur Adresse des Switch-Statements stattfindet.
  • In anderen Fällen, anstatt die Sprungtabelle als eine serielle Liste von Jump-Statements, wie in Tabelle 2 gezeigt, zu implementieren, kann die Sprungtabelle im Speicher als eine Reihe von Adressen gespeichert werden. In diesen Fällen wird die im Speicher gespeicherte Adresse beispielsweise durch ein Statement wie zum Beispiel PC = memory [JUMPTABLEBASE + INDEX] in den Programmzähler geladen, wobei JUMPTABLEBASE ein Zeiger zu einer Anordnung von Zeigern zu jedem der Fälle in dem Switch-Statement ist und INDEX der Wert der Switch-Statement-Variable ist (d. h. der Wert der Variable, die zu dem Switch-Statement weitergeleitet wird). Switch-Statements, die in einer Speicher-Sprungtabelle kompiliert wurden, werden im vorliegenden Text als ein indexiertes Sprungtabellen-Switch-Statement bezeichnet.
  • Verschiedene Kompilierer verwenden verschiedene Kriterien zum Feststellen, wann ein Switch-Statement als eine Sprungtabelle zu implementieren ist. Genauer gesagt, haben verschiedene Kompilierer unterschiedliche Kriterien zum Feststellen, wann ein Fall-Statement eine kleine Anzahl von Fallwerten aufweist und ob diese Fallwerte in im Wesentlichen sequenzielle Werte umgewandelt werden können. Eine Sprungtabelle besitzt in der Regel einen Eintrag für jeden der Werte zwischen dem kleinsten Fallwert und dem größten Fallwert, so dass es in der Regel null Einträge in der Tabelle für Fallwerte gibt, die nicht in dem Switch-Statement verwendet werden. Zum Beispiel wird ein Switch-Statement mit Fallwerten von 0 und 5 in eine Sprungtabelle mit Einträgen für Fall 0, Fall 1, Fall 2, Fall 3, Fall 4 und Fall 5 umgewandelt. Die Einträge für die Fälle 1, 2, 3 und 4 sind null oder ansonsten ungültig.
  • Dementsprechend gibt es – wenn die Fallwerte eines Switch-Statements nicht direkt sequenziell sind – einen Kompromiss zwischen der Effizienz einer Sprungtabelle und dem zusätzlichen Speicher, der benötigt wird, um null Werte für Fallwerte zu speichern, die nicht verwendet werden.
  • Da die Zieladresse einer relativen oder indexierten Sprungtabellen-Switch-Statement-Anweisung auf dem Wert der Switch-Statement-Variable basiert, kann eine genauere Vorhersage der Zieladresse einer Sprungtabellen-Switch-Statement-Anweisung getroffen werden, falls der Wert der Switch-Statement-Variable bekannt ist oder vorhergesagt wird.
  • Dementsprechend beziehen sich die im vorliegenden Text beschriebenen Ausführungsformen auf Verfahren und Abzweig-Prädiktoren, die Instruktionen auf einer frühen Stufe überwachen, um festzustellen, ob sie in Register schreiben, die für Sprungtabellen-Switch-Statement-Variablen verwendet werden, und die jüngsten Werte, die in diese Register geschrieben werden, werden in einer Tabelle gespeichert, die durch den Abzweig-Prädiktor verwaltet wird. Wenn die Zeit gekommen ist, eine Vorhersage für eine bestimmte Sprungtabellen-Switch-Statement-Anweisung zu treffen, so verwendet der Abzweig-Prädiktor den in der Tabelle gespeicherten Registerwert zum Vorhersagen, wohin das Sprungtabellen-Switch-Statement abzweigen wird.
  • Wenden wir uns nun 1 zu, die einen Out-of-Order-Prozessor mit einem einzelnen Thread 100 veranschaulicht, wobei Schreibvorgänge in Register, von denen festgestellt wurde, dass sie für Sprungtabellen-Switch-Statement-Variablen verwendet werden, überwacht und dafür verwendet werden festzustellen, wohin eine Sprungtabellen-Switch-Statement-Anweisung abzweigen wird. Der Prozessor 100 umfasst eine Hol-Stufe 102, die dafür ausgelegt ist, Instruktionen von einem Programm (in Programmreihenfolge) zu holen, so wie es durch einen Programmzähler (Program Counter, PC) angegeben wird, und eine Decodier- und Umbenennungsstufe 104, die dafür ausgelegt ist, die Instruktionen zu interpretieren und eine Registerumbenennung vorzunehmen.
  • Wenn eine Instruktion die Decodier- und Umbenennungsstufe 104 durchläuft, so wird sie in einen Neuordnungspuffer 106 (Reorder Buffer, ROB) eingespeist. Der Neuordnungspuffer 106 ist ein Puffer, der es ermöglicht, die Instruktionen außer der Reihenfolge (”out-of-order”) auszuführen, aber in der Reihenfolge (”in-order”) zu binden. Der Neuordnungspuffer 106 speichert die Instruktionen, die in ihn eingegeben werden, in Programmreihenfolge, aber die Instruktionen innerhalb des ROB 106 können außerhalb der Sequenz durch mehrere Out-of-Order-Pipelines 108 ausgeführt werden. In einigen Beispielen kann der Neuordnungspuffer 106 als ein zirkularer Puffer ausgebildet sein, der ein vorderes Ende besitzt, das zur ältesten Instruktion im ROB 106 weist, und ein hinteres Ende besitzt, das zur jüngsten Instruktion im ROB 106 weist. Instruktionen werden aus dem Neuordnungspuffer 106 in Programmreihenfolge ausgegeben. Oder anders ausgedrückt: Instruktionen werden vom vorderen Ende des ROB 106 ausgegeben, wenn diese Instruktion von den Out-of-Order-Pipelines 108 ausgeführt wurde, und das vordere Ende wird zur nächsten Instruktion im ROB 106 inkrementiert. Aus dem Neuordnungspuffer 106 ausgegebene Instruktionen werden in eine Übergabestufe 110 (”commit”) eingespeist, die die Ergebnisse der Instruktionen an das Register oder den Speicher übergibt.
  • Die Out-of-Order-Pipelines 108 greifen in der Regel auf eine oder mehrere Registerdateien 112 zu, um Lesevorgänge und/oder Schreibvorgänge aus den physischen Registern bzw. in die physischen Register vorzunehmen.
  • Der Prozessor 100 umfasst außerdem einen Abzweig-Prädiktor 114, der dafür ausgelegt ist vorherzusagen, welche Richtung der Programmfluss im Fall von Instruktionen nehmen wird, von denen man weiß, dass sie mögliche Flussänderungen verursachen, wie zum Beispiel Abzweiginstruktionen. Die Abzweigvorhersage ist nützlich, da sie es ermöglicht, Instruktionen spekulativ durch den Prozessor 100 ausführen zu lassen, bevor das Ergebnis der Abzweiginstruktion bekannt ist. Der Abzweig-Prädiktor 114 kann Eingaben von der Hol-Stufe 102 und der Decodier- und Umbenennungsstufe 104 in Bezug auf neue Instruktionen und Eingaben von den Out-of-Order-Pipelines 108 empfangen.
  • Wenn der Abzweig-Prädiktor 114 den Programmfluss genau vorhersagt, so verbessert dies die Leistung des Prozessors 100. Falls jedoch der Abzweig-Prädiktor 114 die Abzweigrichtung nicht korrekt vorhersagt, so kommt es zu einer Falschvorhersage, die korrigiert werden muss, bevor das Programm fortfahren kann. Um eine Falschvorhersage zu korrigieren, werden die an den ROB 106 gesendeten spekulativen Instruktionen beendet, und die Hol-Stufe 102 beginnt mit dem Holen von Instruktionen aus dem richtigen Programmabzweig.
  • Um die Genauigkeit der Vorhersage indirekter Abzweigungen zu verbessern, umfasst der Abzweig-Prädiktor 114 wenigstens eine Logikeinheit 115, die dafür ausgelegt ist, Sprungtabellen-Switch-Statements im Programm zu detektieren und Register zu identifizieren, die als Eingabe in die detektierten Switch-Statements verwendet werden. Die Eingabe in ein Switch-Statement wird im vorliegenden Text als eine Switch-Statement-Variable bezeichnet. Die Logikeinheit 115 sucht dann nach Instruktionen, die einen Augenblickswert (zum Beispiel einen konstanten Wert) in eines der identifizierten Register schreiben. Jeder in ein überwachtes Register geschriebene Augenblickswert wird dann in einer Registertabelle 116 gespeichert, die durch den Abzweig-Prädiktor 114 verwaltet wird. Die Registertabelle 116 ist von der oder den oben beschriebenen Hauptregisterdateien 112 separat und unabhängig. Eine beispielhafte Registertabelle 116 wird mit Bezug auf 2 beschrieben.
  • Zum Beispiel kann die Logikeinheit 115 Instruktionen überwachen, die aus der Hol-Stufe 102 geholt wurden. Falls die Logikeinheit 115 eine Instruktion detektiert, die einen Augenblickswert in ein Register schreibt, so decodiert die Logikeinheit 115 die Instruktion, um das beschriebene Register und den Augenblickswert zu bestimmen. Falls das decodierte Register eines der identifizierten Register ist (ein Register, das als Eingabe in ein Sprungtabellen-Switch-Statement verwendet wird), so wird der Augenblickswert in der Registertabelle 116 gespeichert. Da die Logikeinheit 115 Instruktionen auf einer sehr frühen Stufe in der Pipeline überwacht, wird die Registertabelle 116 viel früher als die Hauptregisterdatei(en) 112 beschrieben bzw. aktualisiert, wodurch die Zieladresse von Sprungtabellen-Switch-Statement-Instruktionen zu einem früheren Zeitpunkt genauer vorhergesagt werden kann. Insbesondere wird im Gegensatz zur Registertabelle 116, die aktualisiert wird, nachdem die Instruktion geholt wurde, die Hauptregisterdatei 112 in der Regel erst dann beschrieben bzw. aktualisiert, nachdem die Instruktion decodiert und ausgeführt wurde.
  • Wenn die Zeit gekommen ist, eine Vorhersage für eine bestimmte Sprungtabellen-Switch-Statement-Anweisung zu treffen, so verwendet die Logikeinheit 115 den in der Registertabelle 116 gespeicherten Registerwert zum Vorhersagen, wohin das Switch-Statement abzweigen wird. Beispielhafte Verfahren zum (a) Überwachen von Schreibvorgängen in ein Register und (b) Verwenden eines gespeicherten Registerwertes zum Vorhersagen, wohin eine Sprungtabellen-Switch-Statement-Anweisung abzweigen wird, werden mit Bezug auf die 3 bzw. 4 beschrieben.
  • Die Logikeinheit 115 kann unter Verwendung jeder geeigneten Hardware-Logik implementiert werden.
  • Wenden wir uns nun 2 zu, die eine beispielhafte Registertabelle 116 von 1 veranschaulicht. Die Registertabelle 116 wird dafür verwendet, (a) eine Liste von in einem Programm detektierten Sprungtabellen-Switch-Statementnstruktionen, (b) die als Eingabe in die Sprungtabellen-Switch-Statements verwendeten Register und (c) den in jedes dieser Register geschriebenen jüngsten Wert zu speichern.
  • In 2 ist die Registertabelle 116 in eine Anzahl von Zeilen 202, 204, 206 und 208 und Spalten 210, 212, 214 und 216 geteilt. Jede Zeile 202, 204, 206 und 208 stellt eine Sprungtabellen-Switch-Statement-Anweisung dar, die in dem Programm detektiert wurde. In dem in 2 gezeigten Beispiel wurden vier Sprungtabellen-Switch-Statement-Instruktionen in dem Programm detektiert, und somit gibt es vier Zeilen 202, 204, 206 und 208: eine für jede detektierte Sprungtabellen-Switch-Statement-Anweisung.
  • Jede Spalte 210, 212, 214 und 216 enthält eine spezielle Information bezüglich der detektierten Instruktion. In dem in 2 gezeigten Beispiel gibt es vier Spalten: eine Instruktionsidentifizierungstag-Spalte 210, eine Argumentregister-ID-Spalte 212, eine Argumentregisterwert-Spalte 214 und eine Argument-gültig-Spalte 216. In anderen Fällen kann die Registertabelle 116 mehr, weniger oder andere Spalten aufweisen.
  • Die Instruktionsidentifizierungstag-Spalte 210 speichert einen Tag, der eine detektierte Sprungtabellen-Switch-Statement-Anweisung identifiziert. Der Tag kann von dem Abzweig-Prädiktor 114 verwendet werden, um festzustellen, ob die Registertabelle 116 einen Eintrag für eine bestimmte Sprungtabellen-Switch-Statement-Anweisung umfasst. Wenn die Registertabelle 116 einen Eintrag für eine bestimmte Switch-Statement-Anweisung umfasst, so kann das Ziel für diese Switch-Statement-Anweisung anhand der Daten in der Registertabelle 116 vorhergesagt werden.
  • In einigen Fällen ist der Tag der Programmzähler für die Instruktion. In anderen Fällen ist der Tag nur ein Abschnitt des Programmzählers (zum Beispiel die unteren sechzehn Bits). Das Verwenden nur eines Abschnitts des Programmzählers reduziert die Größe der Registertabelle 116 im Vergleich zu Fällen, wo der gesamte Programmzähler verwendet wird. Jedoch kann in diesen Fällen der Abzweig-Prädiktor 114 nicht zu 100% sicher sein, dass sich die detektierte Sprungtabellen-Switch-Statement-Anweisung in der Registertabelle 116 befindet, da mehrere Instruktionen den gleichen Tag aufweisen können. In wieder anderen Fällen können andere geeignete Informationen verwendet werden, um die Position der Instruktion zu identifizieren.
  • In einigen Fällen braucht die Registertabelle 116 keine Instruktionsidentifizierungstag-Spalte 210 zu umfassen. In diesen Fällen kann der Abzweig-Prädiktor die in der Argumentregister-ID-Spalte 212 gespeicherte Argumentregister-ID verwenden, um festzustellen, ob die Registertabelle 116 einen Eintrag für eine bestimmte Sprungtabellen-Switch-Statement-Anweisung umfasst.
  • Die Argumentregister-ID-Spalte 212 speichert Informationen, die das Register identifizieren, das dafür verwendet wird, die Argumenteingabe oder -variable in das zugehörige Sprungtabellen-Switch-Statement einzugeben (zum Beispiel das Register, das für die „state”-Variable in dem EA-Beispiel oben verwendet wird). In einigen Fällen sind die Identifizierungsinformationen die Register-ID (zum Beispiel R8 oder D0.8). Sobald Identifizierungsinformationen für ein Register zu der Tabelle hinzugefügt wurden, wird das betreffende Register zu einem überwachten Register, und der Abzweig-Prädiktor überwacht die Instruktionen für Schreibvorgänge in dieses Register.
  • Die Argumentregisterwert-Spalte 214 speichert den jüngsten Augenblickswert (zum Beispiel aktuellen Wert), der in das Register geschrieben wird, das in der entsprechenden Argumentregister-ID-Spalte 212 identifiziert wurde. In einigen Fällen wird jedem Argumentregisterwert zunächst ein Standardvorgabewert zugewiesen (zum Beispiel „NA” in dem in 2 gezeigten Beispiel), um anzuzeigen, dass das Register nicht beschrieben wurde. Sobald das Register beschrieben wird, wird der Argumentregisterwert mit dem Aktualisierungswert aktualisiert. In einigen Fällen wird die Argumentregisterwert-Spalte 214 jedes Mal aktualisiert, wenn das zugehörige Register beschrieben wird.
  • Die Argument-gültig-Spalte 216 speichert Informationen darüber, ob der in der zugehörigen Registerwertspalte 214 gespeicherte Registerwert gültig ist. In einigen Fällen gilt ein Argumentregisterwert als gültig, wenn ein Augenblickswert (zum Beispiel ein konstanter Wert) wenigstens einmal in das Register geschrieben wurde, das in der Argumentregister-ID-Spalte 212 identifiziert wurde. In diesen Fällen kann jeder Argument-gültig-Wert zunächst so eingestellt werden, dass angezeigt wird, dass der Argumentregisterwert nicht gültig ist, und wird erst aktualisiert, um anzuzeigen, dass der Argumentregisterwert gültig ist, nachdem ein konstanter Wert in das Register geschrieben wurde. In diesen Fällen braucht die Argument-gültig-Spalte 216 nur einmal während der Ausführung aktualisiert zu werden (zum Beispiel das erste Mal, wenn das Register mit einem konstanten Wert beschrieben wird), oder es braucht überhaupt nicht aktualisiert zu werden, wenn niemals ein konstanter Wert in das Register geschrieben wird.
  • In einigen Fällen kann die Argument-gültig-Spalte durch ein einzelnes Bit implementiert werden, das entweder deaktiviert wird (zum Beispiel auf 0 gesetzt wird) oder aktiviert wird (zum Beispiel auf 1 gesetzt wird), oder durch einen Boole'schen Wert, der entweder auf TRUE oder auf FALSE gesetzt wird. In einigen Fällen kann das gültige Bit, nachdem es von einem Anfangszustand in einen anderen Zustand geändert wurde, nach einem zuvor festgelegten Zeitraum automatisch zurück in den Anfangszustand geändert werden.
  • In einigen Fällen braucht die Registertabelle 116 keine Argument-gültig-Spalte 216 aufzuweisen, sondern die Registertabelle 116 kann stattdessen eine (nicht gezeigte) Zählerspalte aufweisen, die Informationen darüber speichert, wie oft der Wert in der zugehörigen Argumentregisterwert-Spalte 214 seit seiner Aktualisierung zum Vorhersagen einer Zielposition verwendet wurde. Jedes Mal, wenn der Wert in der zugehörigen Argumentregisterwert-Spalte 214 aktualisiert wird, kann der Zähler auf einen Maximalwert zurückgesetzt werden. Des Weiteren kann jedes Mal, wenn der Wert in der zugehörigen Argumentregisterwert-Spalte 214 zum Vorhersagen des Ziels einer Switch-Statement-Anweisung verwendet wird, der Zähler dekrementiert werden. Diese Informationen können dann durch den Abzweig-Prädiktor 114 verwendet werden, um festzustellen, ob die Daten in der entsprechenden Argumentregisterwert-Spalte 214 gültig sind. Zum Beispiel braucht der Abzweig-Prädiktor 114 in einigen Fällen nur die Daten in der entsprechenden Argumentregisterwert-Spalte 214 zum Vorhersagen der Zielposition zu verwenden, falls der Zähler nicht auf oder unter einen Schwellenwert (zum Beispiel null) dekrementiert wurde.
  • Die dem Zähler zugewiesene Anzahl von Bits wird so gewählt, dass sie groß genug ist, um sicherzustellen, dass der Abzweig-Prädiktor 114 nach wie vor gültige Daten verwenden kann. Zum Beispiel können dem Zähler in einigen Fällen zwei Bits zugewiesen werden. Jedes Mal, wenn der Wert in der zugehörigen Argumentregisterwert-Spalte 214 aktualisiert wird, wird der Zähler auf drei (”11” in Binärform) gesetzt, und jedes Mal, wenn der Wert in der zugehörigen Argumentregisterwert-Spalte 214 zum Vorhersagen der Zielposition einer Switch-Statement-Anweisung verwendet wird, wird der Zähler dekrementiert.
  • In anderen Fällen braucht die Registertabelle 116 keine Argument-gültig-Spalte 216 aufzuweisen, sondern die Registertabelle 116 kann stattdessen eine (nicht gezeigte) Konfidenzspalte aufweisen, die einen Konfidenzwert speichert. Der Konfidenzwert kann die Wahrscheinlichkeit anzeigen, dass die Daten in der zugehörigen Argumentregisterwert-Spalte 214 die richtige Zielposition vorhersagen werden.
  • In einigen Fällen kann, wenn erstmals eine Switch-Statement-Anweisung detektiert und zu der Registertabelle 116 hinzugefügt wird, der Konfidenzwert auf null gesetzt werden (um zum Beispiel anzuzeigen, dass nur wenig oder gar kein Vertrauen in den Registerwert besteht, der in der entsprechenden Argumentregisterwert-Spalte 214 gespeichert ist). Wenn das Switch-Statement anschließend durch die Out-of-Order-Pipelines 108 ausgeführt wird, so können die Out-of-Order-Pipelines 108 die Aktualisierung des Programmzählers an den Abzweig-Prädiktor 114 übermitteln. Der Abzweig-Prädiktor kann dann den aktualisierten Programmzählerwert mit dem in der relevanten Argumentregisterwert-Spalte 214 gespeicherten Registerwert vergleichen. Wenn der aktualisierte Programmzähler und der gespeicherte Registerwert übereinstimmen, so kann der Konfidenzwert erhöht werden.
  • Wenn der aktualisierte Programmzähler und der gespeicherte Registerwert nicht übereinstimmen, so kann der Konfidenzwert verringert oder auf 0 gesetzt werden. In einigen Fällen braucht der Abzweig-Prädiktor 114 die Daten in der entsprechenden Argumentregisterwert-Spalte 214 nur zum Vorhersagen der Zielposition zu verwenden, wenn der Konfidenzwert oberhalb einer zuvor festgelegten Schwelle (zum Beispiel 0 oder 1) liegt. Das Verwenden einer Konfidenzmessgröße zum Feststellen, ob das Ziel anhand des gespeicherten Registerwertes vorhergesagt werden soll, kann die Anzahl von falsch vorhergesagten Zielen verringern.
  • In wieder anderen Fällen braucht die Registertabelle 116 keine Argument-gültig-Spalte aufzuweisen, sondern kann stattdessen eine (nicht gezeigte) Zählerspalte und eine (nicht gezeigte) Konfidenzspalte aufweisen, wie oben beschrieben wurde.
  • In einigen Fällen kann die Registertabelle 116 des Weiteren eine (nicht gezeigte) Switch-gültig-Spalte umfassen, die anzeigt, ob die Zeile gültig ist. In anderen Fällen kann der Tag auf einen zuvor festgelegten Wert (0 × 00000000) gesetzt werden, um anzuzeigen, dass die entsprechende Zeile nicht gültig ist. In einigen Fällen können die Switch-gültig-Spalte oder die Tags in der Registertabelle 116 auf einen Wert gesetzt werden, der anzeigt, dass die Daten in der entsprechenden Zeile nicht gültig sind, nachdem der Abzweig-Prädiktor 114 initialisiert oder zurückgesetzt wurde. Eine Initialisierung oder Rücksetzung des Abzweig-Prädiktors 114 kann zum Beispiel stattfinden, wenn der Prozessor zurückgesetzt wird oder wenn der Thread angehalten wird. In diesen Fällen werden, nachdem gültige Daten in eine Zeile geschrieben wurden (zum Beispiel nachdem eine Switch-Statement-Anweisung identifiziert wurde), die Switch-gültig-Spalte und/oder der Tag mit einem Wert aktualisiert, der anzeigt, dass die Daten in der Zeile gültig sind. Wenn die Registertabelle 116 eine feste Größe hat, so können die Switch-gültig-Spalte und/oder die Tag-Informationen verwendet werden, um zu bestimmen, in welche Zeile neue Daten angeordnet werden sollen.
  • In einigen Fällen kann ein Kompilierer dafür ausgelegt sein, geeignete Switch-Statements (d. h. Switch-Statements mit einer kleinen Anzahl von im Wesentlichen sequenziellen Fallwerten) in nur relative Sprungtabellen (d. h. eine serielle Liste von Jump-Statements) umzuwandeln. Wenn jedoch ein Kompilierer dafür ausgelegt sein kann, geeignete Switch-Statements in entweder eine relative Sprungtabelle oder eine indexierte Sprungtabelle umzuwandeln, so kann die Registertabelle 116 eine (nicht gezeigte) Spalte aufweisen, die anzeigt, ob das detektierte Sprungtabellen-Switch-Statement ein relatives Sprungtabellen-Switch-Statement oder ein indexiertes Sprungtabellen-Switch-Statement ist. Zum Beispiel kann die Registertabelle 116 eine relative oder indexierte Spalte umfassen, die ein einzelnes Bit umfasst, das zum Beispiel gesetzt wird, wenn der Abzweig-Prädiktor 114 detektiert hat, dass das Sprungtabellen-Switch-Statement ein relatives Sprungtabellen-Switch-Statement ist (d. h. das Sprungtabellen-Switch-Statement wurde durch den Kompilierer in eine serielle Liste von Jump-Statements umgewandelt) und nicht gesetzt wird, wenn zum Beispiel der Abzweig-Prädiktor 114 detektiert hat, dass das Sprungtabellen-Switch-Statement ein indexiertes Sprungtabellen-Switch-Statement ist (d. h. das Sprungtabellen-Switch-Statement wurde durch den Kompilierer in eine Speicherliste von Adressen umgewandelt). In diesen Fällen kann die Registertabelle 116 auch eine Spalte aufweisen, die verwendet wird, um die Basisadresse einer indexierten Sprungtabelle zu speichern, die (wie unten beschrieben) zum Vorhersagen der Zieladresse einer indexierten Sprungtabellen-Switch-Statement-Anweisung verwendet werden kann.
  • In einigen Fällen ist jede Zeile 202, 204, 206 und 208 zwischen 32 und 64 Bits lang. In anderen Fällen können die Zeilen 202, 204, 206 und 208 eine Länge haben, die oberhalb oder unterhalb dieses Bereichs liegt.
  • In einigen Fällen werden die Einträge (zum Beispiel Zeilen) in der Registertabelle 116 danach organisiert, wann sie zu der Registertabelle 116 hinzugefügt wurden. Zum Beispiel werden in einigen Fällen alle neuen Einträge oben zu der Tabelle hinzugefügt, und ältere Einträge werden ans untere Ende der Tabelle verschoben.
  • In anderen Fällen werden die Einträge (zum Beispiel Zeilen) in der Registertabelle 116 danach organisiert, wann das letzte Mal auf sie zugegriffen wurde. Zum Beispiel werden in einigen Fällen die Einträge (zum Beispiel Zeilen), auf die zuletzt zugegriffen wurde, oben in der Registertabelle 116 angeordnet, und die Einträge (zum Beispiel Zeilen), auf die zu früheren Zeitpunkten zugegriffen wurde, werden am unteren Ende der Registertabelle 116 angeordnet. Falls das in 2 gezeigte Beispiel in dieser Weise organisiert wäre, so wäre die erste Zeile 202 der Eintrag, auf den zuletzt zugegriffen wurde, und die vierte Zeile 208 wäre der Eintrag, dessen Benutzung am weitesten zurückliegt. In diesen Fällen wird, sobald ein Eintrag (zum Beispiel eine Zeile) hinzugefügt, modifiziert (zum Beispiel aktualisiert) oder auf sonstige Weise darauf zugegriffen (zum Beispiel gelesen) wurde, ans obere Ende der Registertabelle 116 hinzugefügt oder verschoben.
  • In einigen Fällen kann die Registertabelle eine feste Größe aufweisen (zum Beispiel zwei oder vier Einträge). Durch das Organisieren der Registertabelle 116 danach, wann zuletzt auf den Eintrag zugegriffen wurde, wird es möglich, dass eine Registertabelle 116 von fester Größe die Einträge behält, auf die zuletzt zugegriffen wurde, und ältere Einträge, auf die vor längerer Zeit zugegriffen wurde, überschreibt.
  • Das physische Verschieben der Einträge in der Registertabelle kostet Strom. Um also den Stromverbrauch zu senken, der mit dem Organisieren der Einträge in der Registertabelle 116 einhergeht, kann die Registertabelle in einem weiteren Beispiel eine (nicht gezeigte) Ordnungsspalte umfassen, die Informationen über die Reihenfolge der Einträge speichert. Die Daten in der Ordnungsspalte werden dann dafür verwendet, die ältesten Einträge von den neuesten Einträgen zu unterscheiden. Zum Beispiel kann die Ordnungsspalte eine Zahl speichern, die die Reihenfolge des Eintrags in der Registertabelle 116 darstellt. Die Zahl kann darstellen, vor welcher Zeit der Eintrag hinzugefügt wurde und/oder wann zum letzten Mal auf den Eintrag zugegriffen wurde.
  • Wenden wir uns nun 3 zu, die ein Verfahren 300, das durch den Abzweig-Prädiktor 114 implementiert werden kann, zum Überwachen von Registern veranschaulicht, die für Sprungtabellen-Switch-Statement-Variablen verwendet werden. Bei Schritt 302 wird die nächste Instruktion für eine Vorhersage von der Hol-Stufe 102 empfangen. Nachdem die nächste Instruktion empfangen wurde, schreitet das Verfahren 300 zu Schritt 304 voran.
  • Bei Schritt 304 wird festgestellt, ob die Instruktion einen Augenblickswert (zum Beispiel einen konstanten Wert) in eines der. überwachten Register (zum Beispiel eines der Register, die in der Registertabelle 116 gelistet sind) schreibt. Das Feststellen, ob die Instruktion einen Augenblickswert in eines der überwachten Register schreibt, kann umfassen, als erstes festzustellen, ob die Instruktion eine Schreibinstruktion ist. Wenn festgestellt wird, dass die Instruktion eine Schreibinstruktion ist, so kann anschließend festgestellt werden, ob die Schreibinstruktion einen Augenblickswert (zum Beispiel einen konstanten Wert) in ein Register schreibt. Wenn die Schreibinstruktion einen Augenblickswert (zum Beispiel einen konstanten Wert) in ein Register schreibt, so wird festgestellt, ob die Schreibinstruktion einen Augenblickswert in eines der überwachten Register schreibt. Das Feststellen, ob die Schreibinstruktion in eines der überwachten Register schreibt, kann umfassen, die Instruktion zu decodieren und die in der Registertabelle gelisteten Register-IDs mit der ID des Schreibregisters zu vergleichen, auf das in der decodierten Schreibinstruktion verwiesen wird.
  • In einigen Fällen kann das Decodieren durch einen Abzweig-Prädiktor ausgeführt werden, wie zum Beispiel den Abzweig-Prädiktor 114. Zum Beispiel kann der Abzweig-Prädiktor eine zuvor festgelegte Anzahl von Bits der Instruktion (zum Beispiel neun Bits) beurteilen, um festzustellen, ob es ein Augenblickswert-Schreibvorgang ist, und dann eine weitere zuvor festgelegte Anzahl von Bits der Instruktion (zum Beispiel fünf Bits) beurteilen, um die Register-ID zu bestimmen, und noch eine weitere zuvor festgelegte Anzahl von Bits der Instruktion (zum Beispiel sechzehn Bits) beurteilen, um den Augenblickswert zu bestimmen.
  • Wenn festgestellt wird, dass die Instruktion einen Augenblickswert in eines der überwachten Register schreibt, so schreitet das Verfahren zu Schritt 306 voran. Wenn jedoch festgestellt wird, dass die Instruktion keinen Augenblickswert in eines der überwachten Register schreibt, so kehrt das Verfahren 300 zu 302 zurück, wo die nächste Instruktion empfangen wird.
  • Bei Schritt 306 wird der Aktualisierungswert (zum Beispiel der Wert, der in das überwachte Register geschrieben wird) in der Registertabelle 116 gespeichert. Das Speichern des Aktualisierungswertes in der Registertabelle 116 kann umfassen, die relevante Zeile in der Registertabelle 116 anhand der Register-ID zu lokalisieren und dann den aktuellen Registerwert mit dem Aktualisierungswert zu aktualisieren. Nachdem der Aktualisierungswert in der Registertabelle 116 gespeichert wurde, kann ein beliebiges gültiges Bit und/oder ein beliebiger gültiger Zähler aktualisiert werden, um die Tatsache widerzuspiegeln, dass der Registerwert aktualisiert wurde. Nachdem die Registertabelle 116 aktualisiert wurde, kehrt das Verfahren 300 zu 302 zurück, wo der Prozess für die nächste Instruktion wiederholt wird.
  • Der Strombedarf steigt nur geringfügig an, um den Prozessor 100 zu betreiben, wenn das Verfahren 300 kontinuierlich ausgeführt wird.
  • Wenden wir uns nun 4 zu, die ein Verfahren 400 zum Vorhersagen der Zielposition einer Sprungtabellen-Switch-Statement-Anweisung anhand der Daten in der Registertabelle 116 veranschaulicht. Bei Schritt 402 wird die nächste Instruktion für eine Vorhersage von der Hol-Stufe 102 empfangen. In einigen Fällen wird die Instruktion an einem Abzweig-Prädiktor empfangen, wie zum Beispiel dem Abzweig-Prädiktor 114. Nachdem die nächste Instruktion empfangen wurde, schreitet das Verfahren 400 zu Schritt 404 voran.
  • Bei Schritt 404 wird festgestellt, ob die empfangene Instruktion eine Sprungtabellen-Switch-Statement-Anweisung ist. In einigen Fällen umfasst das Feststellen, ob die empfangene Instruktion eine Sprungtabellen-Switch-Statement-Anweisung ist, das Feststellen, ob die Instruktion ein vordefiniertes Muster aufweist. Zum Beispiel umfasst das Feststellen, ob eine Instruktion eine Sprungtabellen-Switch-Statement-Anweisung ist, in einigen Fällen das Feststellen, ob die Instruktion ein Muster aufweist, das anzeigt, dass es sich um eine Sprungtabelleninstruktion handelt. In einigen Fällen wird die Feststellung, ob die empfangene Instruktion eine Sprungtabellen-Switch-Statement-Anweisung ist, durch einen Abzweig-Prädiktor, wie zum Beispiel den Abzweig-Prädiktor 114, getroffen. Wenn festgestellt wird, dass die Instruktion eine Sprungtabellen-Switch-Statement-Anweisung ist, so schreitet das Verfahren 400 zu Schritt 406 voran. Wenn jedoch festgestellt wird, dass die Instruktion keine Sprungtabellen-Switch-Statement-Anweisung ist, so kehrt das Verfahren 400 zu 402 zurück, wo die nächste Instruktion für eine Vorhersage empfangen wird.
  • Bei Schritt 406 wird eine Registertabelle, wie zum Beispiel die Registertabelle 116, mit Informationen, die die Position der Instruktion (zum Beispiel den Programmzähler der Instruktion) identifizieren, und mit Informationen, die die ID des Argumentregisters identifizieren (zum Beispiel die Register-ID für das Register, das für das Switch-Statement oder die Sprungtabellenvariable verwendet wird), aktualisiert.
  • Wenn die Registertabelle bereits einen Eintrag (zum Beispiel eine Zeile) für die Instruktion enthält, so kann der relevante Eintrag (zum Beispiel eine Zeile) in der Registertabelle ans obere Ende der Registertabelle verschoben werden, oder die Ordnungszahl kann aktualisiert werden, um die Tatsache widerzuspiegeln, dass auf diesen Eintrag unlängst zugegriffen wurde. In einigen Fällen umfasst das Feststellen, ob die Registertabelle bereits einen Eintrag (zum Beispiel eine Zeile) für die Instruktion enthält, das Vergleichen des Programmzählers für die Switch-Statement-Anweisung mit den Instruktionsidentifizierungs-Tags in der Registertabelle 116. In anderen Fällen umfasst das Feststellen, ob die Registertabelle bereits einen Eintrag (zum Beispiel eine Zeile) für die Instruktion enthält, das Vergleichen der Register-ID des für die Switch-Statement-Variable verwendeten Registers mit den in der Registertabelle gelisteten Register-IDs.
  • In einigen Fällen wird die Registertabelle durch einen Abzweig-Prädiktor aktualisiert, wie zum Beispiel den Abzweig-Prädiktor 114. Nachdem die Registertabelle aktualisiert wurde, schreitet das Verfahren 400 zu Schritt 408 voran.
  • Bei Schritt 408 wird festgestellt, ob die Zielposition anhand des in der Registertabelle (wie zum Beispiel der Registertabelle 116) gespeicherten relevanten Argumentregisterwertes vorhergesagt werden soll. In einigen Fällen umfasst das Feststellen, ob die Zielposition anhand des in der Registertabelle gespeicherten relevanten Argumentregisterwertes vorhergesagt werden soll, das Anschauen des Argument-gültig-Wertes, um festzustellen, ob er anzeigt, dass die Registerwertdaten in der Registertabelle gültig sind. In diesen Fällen kann, wenn der Argument-gültig-Wert anzeigt, dass der Registerwert in der Registertabelle gültig ist, festgestellt werden, dass die Zielposition anhand des gespeicherten Registerwertes vorhergesagt werden soll. Umgekehrt kann, wenn der Argument-gültig-Wert anzeigt, dass der entsprechende Registerwert in der Registertabelle nicht gültig ist, festgestellt werden, dass die Zielposition nicht anhand des gespeicherten Registerwertes vorhergesagt werden soll.
  • In anderen Fällen kann das Feststellen, ob die Zielposition anhand des in der Registertabelle gespeicherten relevanten Argumentregisterwertes vorhergesagt werden soll, das Analysieren des Zählers und/oder der Konfidenzwerte in der Registertabelle umfassen. Zum Beispiel kann festgestellt werden, dass der gespeicherte Registerwert dafür verwendet werden soll, die Zielposition vorherzusagen, wenn der Zähler und/oder Konfidenzgrad oberhalb eines zuvor festgelegten Schwellenwertes liegt. Wie oben beschrieben, können der Zähler und die Konfidenzgrade verschiedene Schwellenwerte aufweisen, die ein Wert von null oder ungleich null sein können.
  • In einigen Fällen kann die Feststellung, ob die Zielposition anhand des gespeicherten Argumentregisterwertes vorhergesagt werden soll, durch einen Abzweig-Prädiktor, wie zum Beispiel den Abzweig-Prädiktor 114, getroffen werden. Wenn festgestellt wird, dass die Zielposition anhand des gespeicherten Argumentregisterwertes vorhergesagt werden soll, so schreitet das Verfahren 400 zu Schritt 410 voran. Wenn jedoch festgestellt wird, dass die Zielposition nicht anhand des gespeicherten Argumentregisterwertes vorhergesagt werden soll, so schreitet das Verfahren 400 zu Schritt 412 voran.
  • Bei Schritt 410 wird die Zielposition anhand des in der Registertabelle gespeicherten relevanten Registerwertes vorhergesagt. In einigen Fällen wird die Zielposition durch Kombinieren des Programmzählers für die Switch-Statement-Anweisung und des in der Registertabelle gespeicherten Registerwertes (auch als der aktuelle Wert bezeichnet) vorhergesagt.
  • Im Allgemeinen umfasst die (in dem relevanten Register gespeicherte) Switch-Statement-Variable einen der Werte in dem Switch-Statement (zum Beispiel „Wert A” oder „Wert B” in dem Switch-Statement-Grundbeispiel oben).
  • Wenn das Switch-Statement ein relatives Sprungtabellen-Switch-Statement ist (d. h. das Switch-Statement wurde in eine Reihe von Jump-Statements umgewandelt, wie oben beschrieben), so liegt die Zielposition X Instruktionen vor dem aktuellen Programmzähler, wobei X der Variablenwert (zum Beispiel der Registerwert) ist. Wenn jede Instruktion N Bytes lang ist, so kann die Zielposition berechnet werden, indem man die Position der nächsten Instruktion nach dem Programmzähler feststellt (der Programmzähler der Switch-Instruktion + N) und den Registerwert, multipliziert mit N (der Länge jeder Instruktion in Bytes), dazu addiert. Das kann durch die unten gezeigten Formeln (1) oder (2) dargestellt werden, wobei T die Zielposition ist, PC der Programmzähler (Program Counter) der Switch-Statement-Anweisung ist, N die Länge jeder Instruktion in Bytes ist und „current value” (aktueller Wert) der in der Registertabelle 116 gespeicherte Registerwert ist. T = (PC + N) + N·current value (1) T = PC + N·(current value + 1) (2)
  • Die Zielposition enthält dann einen direkten unbedingten Abzweig zum Textkörpers des Codes für jenen Fall, der unter Verwendung herkömmlicher Vorhersageverfahren vorhersagbar ist.
  • Zum Beispiel zeigt Tabelle 3 ein beispielhaftes relatives Sprungtabellen-Switch-Statement mit zwei Fällen (Fall 0 und Fall 1). In dem Beispiel ist jede Instruktion vier Bytes lang, und das Switch-Statement befindet sich bei Adresse 0 × 20. Gemäß Formel (1) ist die Zielposition gleich (0 × 20 + 4) + 4·gespeicherter Registerwert für R8. Wenn also der gespeicherte Registerwert für R8 0 ist, so ist das Ziel 0 × 24. Diese Adresse stellt einen direkten unbedingten Abzweig zur Adresse 0 × 40 bereit, die den Code für Fall 0 umfasst. Gleichermaßen ist, wenn der gespeicherte Registerwert für R8 = 1 ist, das Ziel 0 × 28. Diese Adresse stellt einen direkten unbedingten Abzweig zur Adresse 0 × 80 bereit, die den Code für Fall 1 umfasst. Tabelle 3
    Adresse Adresse der nächsten Instruktion Anmerkung
    0 × 20 (PC + 4) + 4·R8 Switch-Statement-Anweisung
    0 × 24 0 × 40 Fall 0:
    0 × 28 0 × 80 Fall 1:
    ...
    0 × 40 Code für Fall 0
    ...
    0 × 80 Code für Fall 1
  • Wenn das Switch-Statement ein indexiertes Sprungtabellen-Switch-Statement ist (d. h. das Switch-Statement wurde in eine Speicher-Sprungtabelle umgewandelt, wie oben beschrieben), so befindet sich die Adresse der nächsten Instruktion an der Speicheradresse JUMPTABLEBASE + INDEX, wobei JUMPTABLEBASE ein Zeiger zu einer Anordnung von Zeigern zu jedem der Fälle in dem Switch-Statement ist und INDEX der Wert der Switch-Statement-Variable ist (die Eingabe in das Switch-Statement oder die Sprungtabelle). Für diese Arten von Sprungtabellen-Switch-Statements kann der INDEX anhand der Daten in der Registertabelle 116 vorhergesagt werden. In einigen Fällen wird der vorhergesagte Index als ein Hinweis zu herkömmlichen indirekten Abzweig-Prädiktoren verwendet. In anderen Fällen (wie oben beschrieben) wird die JUMPTABLEBASE-Adresse auch in der Registertabelle 116 gespeichert und kann in Verbindung mit dem INDEX zum Vorhersagen der nächsten Adresse verwendet werden.
  • In einigen Fällen wird die Zielposition durch einen Abzweig-Prädiktor, wie zum Beispiel den Abzweig-Prädiktor 114, vorhergesagt. Nachdem die Zielposition vorhergesagt wurde, kehrt das Verfahren 400 zu 402 zurück, um die nächste Instruktion für eine Vorhersage zu empfangen.
  • Bei Schritt 412 wird die Zielposition unter Verwendung bekannter Indirekter-Abzweig-Vorhersagemittel vorhergesagt. Zum Beispiel kann in einigen Fallen die Zielposition beispielsweise unter Verwendung eines Abzweigzielpuffers (Branch Target Buffer, BTB) vorhergesagt werden. Wie dem Fachmann bekannt ist, ist ein BTB ein kleiner Cache, der Indirekte-Abzweig-Adressen in vorhergesagte Zieladressen hinein abbildet. Nachdem die Zielposition vorhergesagt wurde, kehrt das Verfahren 400 zu 402 zurück, um die nächste Instruktion für eine Vorhersage zu empfangen.
  • Das Verfahren 300 von 3 und das Verfahren 400 von 4 können parallel ausgeführt werden.
  • Im Fall eines endlichen Automaten befindet sich das Sprungtabellen-Switch-Statement in einer Schleife und wird mehrmals ausgeführt. Im Verfahren 400 wird das Sprungtabellen-Switch-Statement beim ersten Mal, wo es detektiert wird, zu der Registertabelle hinzugefügt. Nachdem die Switch-Statement-Anweisung zu der Registertabelle hinzugefügt wurde, überwacht das Verfahren 300 Instruktionen, die in dieses Argumentregister schreiben, und speichert alle Augenblickswerte (zum Beispiel konstante Werte), die in das Register in der Registertabelle geschrieben werden. Dann kann im Verfahren 400, wenn das Sprungtabellen-Switch-Statement anschließend detektiert wird, das Ziel anhand des in der Registertabelle gespeicherten Argumentregisterwertes vorhergesagt werden, wie oben beschrieben wurde.
  • In einigen Fällen kann das Implementieren der im vorliegenden Text beschriebenen Techniken und Verfahren eine Verkleinerung des herkömmlichen Abzweig-Prädiktors erlauben. Insbesondere brauchen, falls die im vorliegenden Text beschriebenen Techniken und Verfahren zum Vorhersagen wenigstens einer Teilmenge der indirekten Abzweige verwendet werden, diese indirekten Abzweige nicht unter Verwendung herkömmlicher Techniken (d. h. BTB) vorhergesagt zu werden. Dementsprechend kann die Größe des BTB verringert werden, um dem Rechnung zu tragen, wodurch wenigstens teilweise die zusätzliche Fläche wettgemacht wird, die zum Implementieren der im vorliegenden Text beschriebenen Techniken und Verfahren benötigt werden.
  • Switch-Statements werden oft in Code zum Analysieren einer Datei (zum Beispiel einer Textdatei) verwendet, wobei kontinuierlich ein neues Zeichen oder eine neue Variable gelesen wird und der Zustand oder die Variable anhand des aktuellen Zeichens oder der aktuellen Variable eingestellt wird. Die im vorliegenden Text beschriebenen Verfahren und Prinzipien verringern die Wahrscheinlichkeit einer falschen Vorhersage für ein Switch-Statement (und verringern somit die Gefahr eines Rewind) und können darum die Geschwindigkeit erhöhen, mit der diese Art von Code ausgeführt wird. Dementsprechend kann eine computergestützte Vorrichtung, in der die im vorliegenden Text beschriebenen Verfahren und Prinzipien implementiert werden, zu einem schnelleren Analysieren einer Konfigurationsdatei führen, die beim Hochfahren der computergestützten Vorrichtung oder beim Starten einer Anwendung verwendet wird. Dadurch kann erheblich die Zeit verkürzt werden, die die computergestützte Vorrichtung selbst benötigt, um hochzufahren oder zu booten, oder die eine Anwendung benötigt, die auf der computergestützten Vorrichtung läuft, um zu starten oder zu booten.
  • 5 dient der Veranschaulichung, wie die im vorliegenden Text beschriebenen Techniken und Verfahren auf einen Out-of-Order-Prozessor mit mehreren Threads angewendet werden können.
  • Wenden wir uns nun 5 zu, die ein Schaubild eines Out-of-Order-Prozessors mit mehreren Threads 500 veranschaulicht. Der Prozessor 500 umfasst zwei Threads 502 und 504, die im vorliegenden Text als Thread 0 bzw. Thread 1 bezeichnet werden. Jeder Thread 502 und 504 umfasst eine Hol-Stufe 506 oder 508, eine Decodier- und Umbenennungsstufe 510 oder 512, einen Neuordnungspuffer 514 oder 516, eine Übergabestufe 518 oder 520, eine oder mehrere Registerdateien 522 oder 524 und einen Abzweig-Prädiktor 526 oder 528, wie oben mit Bezug auf 1 beschrieben wurde. Die Threads 502 und 504 teilen sich die Out-of-Order-Pipelines 528, wie oben mit Bezug auf 1 beschrieben wurde. In dem in 5 gezeigten Beispiel umfasst jeder Abzweig-Prädiktor 526 oder 528 eine Logikeinheit 530 oder 532, die ihre eigene Registertabelle 534 und 536 verwaltet, wie oben für jeden Thread 502 und 504 beschrieben wurde. Jede Logikeinheit 530 oder 532 verwendet dann die Einträge in der entsprechenden Registertabelle 534 oder 536 zum Vorhersagen der Zielposition von Switch-Statement-Instruktionen für einen bestimmten Thread 502 oder 504.
  • In anderen Fällen können sich die Abzweig-Prädiktoren 526 und 528 in eine einzelne Registertabelle teilen, die eine zusätzliche Spalte umfasst, die anzeigt, zu welchem Thread 502 oder 504 die Instruktion gehört. Dies kann den physischen Platzbedarf zum Implementieren der Registertabelle(n) verringern; falls jedoch die Größe der einzelnen Registertabelle begrenzt ist, so kann sich die Gefahr erhöhen, dass ein Thread die Einträge eines anderen Threads hinauswirft oder überschreibt. In diesen Fällen verwendet die Logikeinheit 530 oder 532 die Einträge in der einzelnen Registertabelle zum Vorhersagen der Zielposition von Switch-Statement-Instruktionen für einen bestimmten Thread 502 oder 504.
  • Obgleich die im vorliegenden Text beschriebenen Techniken und Verfahren mit Bezug auf Out-of-Order-Prozessoren beschrieben wurden, ist dem Fachmann klar, dass die im vorliegenden Text beschriebenen Techniken und Verfahren gleichermaßen auf andere Prozessoren angewendet werden können, wie zum Beispiel In-Order-Prozessoren.
  • Alle Bereiche oder Vorrichtungswerte, die im vorliegenden Text angegeben wurden, können erweitert oder geändert werden, ohne dass der angestrebte Effekt verloren geht, wie dem Fachmann klar ist.
  • Es versteht sich, dass sich die oben beschriebenen Nutzeffekte und Vorteile auf eine einzelne Ausführungsform oder auf verschiedenen Ausführungsformen beziehen können. Die Ausführungsformen sind nicht auf jene beschränkt, die einige oder alle der angegebenen Probleme lösen, oder auf jene, die einige oder alle der angegebenen Nutzeffekte und Vorteile besitzen.
  • Ein Verweis auf ”ein” Element bezieht sich auf eines oder mehrere jener Elemente. Der Begriff ”umfassen” wird im vorliegenden Text in dem Sinne verwendet, dass die angegebenen Verfahrensblöcke oder Elemente enthalten sind, dass aber solche Blöcke oder Elemente keine exklusive Liste umfassen; und ein Verfahren oder eine Vorrichtung kann zusätzliche Blöcke oder Elemente enthalten.
  • Die Schritte der im vorliegenden Text beschriebenen Verfahren können nach Bedarf in jeder geeigneten Reihenfolge oder gleichzeitig ausgeführt werden. Zusätzlich können einzelne Blöcke aus beliebigen der Verfahren gelöscht werden, ohne vom Geist und Geltungsbereich des im vorliegenden Text beschriebenen Gegenstandes abzuweichen. Aspekte der oben beschriebenen Beispiele können mit Aspekten der anderen beschriebenen Beispiele kombiniert werden, um weitere Beispiele zu bilden, ohne den angestrebten Effekt zu verlieren. Wenn Elemente der Figuren durch Pfeile verbunden gezeigt sind, so versteht es sich, dass diese Pfeile nur einen beispielhaften Kommunikationsfluss (einschließlich Daten und Steuermeldungen) zwischen Elementen zeigen. Der Fluss zwischen Elementen kann in jeder Richtung oder in beiden Richtungen stattfinden.
  • Es versteht sich, dass die obige Beschreibung einer bevorzugten Ausführungsform lediglich beispielhaft ist und dass vom Fachmann verschiedene Modifikationen vorgenommen werden können. Obgleich oben verschiedene Ausführungsformen mit einer gewissen Detailliertheit oder mit Bezug auf eine oder mehrere einzelne Ausführungsformen beschrieben wurden, könnte der Fachmann zahlreiche Änderungen an den offenbarten Ausführungsformen vornehmen, ohne vom Geist oder Geltungsbereich dieser Erfindung abzuweichen.

Claims (15)

  1. Verfahren (300, 400) zum Vorhersagen einer Zielposition eines Switch-Statements in einem von einem Prozessor ausgeführten Programm, wobei das Verfahren umfasst: Speichern, in einer von einem Abzweig-Prädiktor verwalteten Registertabelle, eines aktuellen Wertes für wenigstens ein überwachtes Register, wobei zu jedem überwachten Register festgestellt wurde, dass es eine Eingabevariable in einem Sprungtabellen-Switch-Statement speichert, wobei ein Sprungtabellen-Switch-Statement ein Switch-Statement ist, das zu einer Sprungtabelle kompiliert wurde; Empfangen, am Abzweig-Prädiktor, einer Instruktion für eine Vorhersage (302); Feststellen, anhand des Abzweig-Prädiktors, ob die empfangene Instruktion in eines der überwachten Register einen Aktualisierungswert schreibt (304); in Reaktion auf die Feststellung, dass die empfangene Instruktion in eines der überwachten Register einen Aktualisierungswert schreibt, Aktualisieren des aktuellen Wertes in der Registertabelle für das Register, das mit dem Aktualisierungswert beschrieben wurde (306); und Vorhersagen, anhand des Abzweig-Prädiktors, der Zielposition einer Sprungtabellen-Switch-Statement-Anweisung anhand des aktuellen Wertes (410).
  2. Verfahren (300, 400) nach Anspruch 1, ferner umfassend: Empfangen, am Abzweig-Prädiktor, einer weiteren Instruktion für eine Vorhersage (402); Feststellen, am Abzweig-Prädiktor, ob die andere Instruktion eine Sprungtabellen-Switch-Statement-Anweisung (404) ist; in Reaktion auf die Feststellung, dass die andere Instruktion eine Sprungtabellen-Switch-Statement-Anweisung ist, Feststellen, ob die Registertabelle einen aktuellen Wert für die Eingabevariable zu der Sprungtabellen-Switch-Statement-Anweisung umfasst; und in Reaktion auf die Feststellung, dass die Registertabelle einen aktuellen Wert für die Eingabevariable zu der Sprungtabellen-Switch-Statement-Anweisung umfasst, Vorhersagen der Zielposition der Switch-Statement-Anweisung anhand des aktuellen Wertes (410).
  3. Verfahren (300, 400) nach Anspruch 2, wobei das Feststellen, ob die andere Instruktion eine Switch-Statement-Anweisung ist, ein Feststellen umfasst, ob die andere Instruktion ein zuvor festgelegtes Muster aufweist.
  4. Verfahren (300, 400) nach Anspruch 2 oder Anspruch 3, ferner umfassend: in Reaktion auf die Feststellung, dass die andere Instruktion eine Sprungtabellen-Switch-Statement-Anweisung ist, Umwandeln des Registers, das zum Speichern der Eingabevariable zu der Sprungtabellen-Switch-Statement-Anweisung verwendet wird, in ein überwachtes Register.
  5. Verfahren (300, 400) nach Anspruch 4, wobei das Umwandeln des Registers, das zum Speichern der Eingabevariable zu der Sprungtabellen-Switch-Statement-Anweisung verwendet wird, in ein überwachtes Register das Speichern, in der Registertabelle, von Informationen umfasst, die das Register identifizieren, das zum Speichern der Eingabevariable zu dem Sprungtabellen-Switch-Statement verwendet wird.
  6. Verfahren (300, 400) nach Anspruch 5, wobei das Feststellen, ob die empfangene Instruktion in eines der überwachten Register schreibt, das Vergleichen der Informationen in der Registertabelle, welche die Register identifiziert, die zum Speichern der Eingabevariablen zu den Sprungtabellen-Switch-Statements verwendet werden, mit Informationen in der empfangenen Instruktion, die ein Schreibregister identifizieren, umfasst.
  7. Verfahren (300, 400) nach einem der Ansprüche 2 bis 6, ferner umfassend: in Reaktion auf die Feststellung, dass die andere Instruktion eine Sprungtabellen-Switch-Statement-Anweisung ist, Feststellen, ob der aktuelle Wert zum Vorhersagen der Zielposition (408) verwendet werden soll; und in Reaktion auf die Feststellung, dass der aktuelle Wert zum Vorhersagen der Zielposition verwendet werden soll, Vorhersagen der Zielposition der Sprungtabellen-Switch-Statement-Anweisung anhand des aktuellen Wertes.
  8. Verfahren (300, 400) nach Anspruch 7, wobei die Registertabelle ein gültiges Bit für jedes überwachte Register umfasst, wobei jedes gültige Bit anzeigt, ob der aktuelle Wert für das überwachte Register gültig ist, und wobei das Feststellen, ob der aktuelle Wert zum Vorhersagen der Zielposition verwendet werden soll, ein Analysieren des gültigen Bits umfasst.
  9. Verfahren (300, 400) nach Anspruch 7, wobei die Registertabelle einen Zähler für jedes überwachte Register umfasst, wobei jeder Zähler anzeigt, wie viele Male der aktuelle Wert für das überwachte Register zum Vorhersagen einer Zielposition verwendet wurde, seit er aktualisiert wurde; und wobei das Feststellen, ob der aktuelle Wert beim Vorhersagen der Zielposition verwendet werden soll, ein Vergleichen des Zählers mit einem Schwellenwert umfasst.
  10. Verfahren (300, 400) nach Anspruch 7, wobei die Registertabelle einen Konfidenzwert für jedes überwachte Register umfasst, wobei jeder Konfidenzwert die Wahrscheinlichkeit anzeigt, dass der aktuelle Wert für das überwachte Register korrekt die Zielposition für das zugehörige Sprungtabellen-Switch-Statement vorhersagt; und wobei das Feststellen, ob der aktuelle Wert beim Vorhersagen der Zielposition verwendet werden soll, ein Vergleichen des Konfidenzwertes mit einem Schwellenwert umfasst.
  11. Verfahren (300, 400) nach einem der vorangehenden Ansprüche, wobei das Vorhersagen der Zielposition der Sprungtabellen-Switch-Statement-Anweisung anhand des aktuellen Wertes ein Kombinieren des Programmzählers für die Sprungtabellen-Switch-Statement-Anweisung und des aktuellen Wertes umfasst.
  12. Verfahren (300, 400) nach Anspruch 11, wobei das Kombinieren des Programmzählers für die Sprungtabellen-Switch-Statement-Anweisung und des aktuellen Wertes umfasst: Feststellen eines Programmzählers für die Instruktion, die unmittelbar auf die Sprungtabellen-Switch-Statement-Anweisung folgt, auf der Basis des Programmzählers für die Sprungtabellen-Switch-Statement-Anweisung; und Multiplizieren des aktuellen Wertes mit einem Faktor N, um einen skalierten aktuellen Wert zu generieren, wobei N die Größe einer Instruktion ist; und Summieren des Programmzählers für die Instruktion, die unmittelbar auf die Sprungtabellen-Switch-Statement-Anweisung folgt, und des skalierten aktuellen Wertes.
  13. Verfahren (300, 400) nach einem der vorangehenden Ansprüche, wobei die Registertabelle mehrere Zeilen umfasst und die Zeilen in der Registertabelle danach geordnet werden, wann das letzte Mal auf sie zugegriffen wurde.
  14. Abzweig-Prädiktor (114, 526, 528), umfassend: eine Registertabelle (116, 534, 536), wobei die Registertabelle (116, 534, 536) einen aktuellen Wert für wenigstens ein überwachtes Register speichert, wobei zu jedem überwachten Register festgestellt wurde, dass es eine Eingabevariable in einem Sprungtabellen-Switch-Statement speichert, wobei ein Sprungtabellen-Switch-Statement ein Switch-Statement ist, das zu einer Sprungtabelle kompiliert wurde; und eine Logikeinheit (115, 530, 532) in Kommunikation mit der Registertabelle (116, 534, 536), wobei die Logikeinheit (115, 530, 532) ausgelegt ist zum: Empfangen einer Instruktion für eine Vorhersage; Feststellen, ob die empfangene Instruktion in eines der überwachten Register einen Aktualisierungswert schreibt; in Reaktion auf die Feststellung, dass die empfangene Instruktion in eines der überwachten Register einen Aktualisierungswert schreibt, Aktualisieren des aktuellen Wertes in der Registertabelle (116, 534, 536) für das Register, das mit dem Aktualisierungswert beschrieben wurde; und Vorhersagen der Zielposition einer Sprungtabellen-Switch-Statement-Anweisung anhand des aktuellen Wertes.
  15. Prozessor (100, 500), der den Abzweig-Prädiktor (114, 526, 528) nach Anspruch 14 umfasst.
DE102014000382.5A 2013-01-14 2014-01-14 Vorhersage indirekter Abzweigungen Withdrawn DE102014000382A1 (de)

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
GB1300608.5 2013-01-14
GBGB1300608.5A GB201300608D0 (en) 2013-01-14 2013-01-14 Indirect branch prediction
GB1322389.6A GB2510966B (en) 2013-01-14 2013-12-18 Indirect branch prediction
GB1322389.6 2013-12-18

Publications (1)

Publication Number Publication Date
DE102014000382A1 true DE102014000382A1 (de) 2014-07-17

Family

ID=47757932

Family Applications (1)

Application Number Title Priority Date Filing Date
DE102014000382.5A Withdrawn DE102014000382A1 (de) 2013-01-14 2014-01-14 Vorhersage indirekter Abzweigungen

Country Status (4)

Country Link
US (1) US9298467B2 (de)
CN (1) CN103927149B (de)
DE (1) DE102014000382A1 (de)
GB (2) GB201300608D0 (de)

Families Citing this family (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20150206596A1 (en) * 2014-01-21 2015-07-23 Nvidia Corporation Managing a ring buffer shared by multiple processing engines
US11061682B2 (en) * 2014-12-15 2021-07-13 Hyperion Core, Inc. Advanced processor architecture
US20170046159A1 (en) * 2015-08-14 2017-02-16 Qualcomm Incorporated Power efficient fetch adaptation
EP3244300B1 (de) * 2016-02-24 2022-02-09 STMicroelectronics (Rousset) SAS Verfahren und instrument zur erzeugung eines konfigurierten programmcodes für die durchführung einer überprüfung des kontrollflusses eines anderen programmcodes, der indirekte verzweigungsbefehle enthält
CN108062236A (zh) * 2016-11-07 2018-05-22 杭州华为数字技术有限公司 一种软硬件协同分支指令预测方法及装置
CN107203403B (zh) * 2017-04-28 2020-08-07 李朝波 一种处理c语言switch/case语句的方法
US10884747B2 (en) 2017-08-18 2021-01-05 International Business Machines Corporation Prediction of an affiliated register
US10908911B2 (en) 2017-08-18 2021-02-02 International Business Machines Corporation Predicting and storing a predicted target address in a plurality of selected locations
US10534609B2 (en) 2017-08-18 2020-01-14 International Business Machines Corporation Code-specific affiliated register prediction
US11150908B2 (en) 2017-08-18 2021-10-19 International Business Machines Corporation Dynamic fusion of derived value creation and prediction of derived values in a subroutine branch sequence
US11150904B2 (en) 2017-08-18 2021-10-19 International Business Machines Corporation Concurrent prediction of branch addresses and update of register contents
US10248394B2 (en) * 2017-08-18 2019-04-02 International Business Machines Corporation Utilizing created character index for switch statements
US10719328B2 (en) 2017-08-18 2020-07-21 International Business Machines Corporation Determining and predicting derived values used in register-indirect branching
US10884745B2 (en) 2017-08-18 2021-01-05 International Business Machines Corporation Providing a predicted target address to multiple locations based on detecting an affiliated relationship
US10884746B2 (en) 2017-08-18 2021-01-05 International Business Machines Corporation Determining and predicting affiliated registers based on dynamic runtime control flow analysis
US10884929B2 (en) 2017-09-19 2021-01-05 International Business Machines Corporation Set table of contents (TOC) register instruction
US10713050B2 (en) 2017-09-19 2020-07-14 International Business Machines Corporation Replacing Table of Contents (TOC)-setting instructions in code with TOC predicting instructions
US11061575B2 (en) 2017-09-19 2021-07-13 International Business Machines Corporation Read-only table of contents register
US10725918B2 (en) 2017-09-19 2020-07-28 International Business Machines Corporation Table of contents cache entry having a pointer for a range of addresses
US10896030B2 (en) 2017-09-19 2021-01-19 International Business Machines Corporation Code generation relating to providing table of contents pointer values
US10705973B2 (en) 2017-09-19 2020-07-07 International Business Machines Corporation Initializing a data structure for use in predicting table of contents pointer values
US10620955B2 (en) 2017-09-19 2020-04-14 International Business Machines Corporation Predicting a table of contents pointer value responsive to branching to a subroutine
CN109783143B (zh) * 2019-01-25 2021-03-09 贵州华芯通半导体技术有限公司 用于流水线指令流的控制方法和控制设备
CN111258649B (zh) * 2020-01-21 2022-03-01 Oppo广东移动通信有限公司 处理器、芯片和电子设备

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5608886A (en) * 1994-08-31 1997-03-04 Exponential Technology, Inc. Block-based branch prediction using a target finder array storing target sub-addresses
EP1405174A1 (de) * 2001-06-29 2004-04-07 Koninklijke Philips Electronics N.V. Verfahren, vorrichtung und kompilierer zur vorhersage von indirekten verzweigungszieladressen
US7743238B2 (en) * 2003-05-09 2010-06-22 Arm Limited Accessing items of architectural state from a register cache in a data processing apparatus when performing branch prediction operations for an indirect branch instruction
US8639913B2 (en) * 2008-05-21 2014-01-28 Qualcomm Incorporated Multi-mode register file for use in branch prediction
US20110078425A1 (en) * 2009-09-25 2011-03-31 Shah Manish K Branch prediction mechanism for predicting indirect branch targets
US8555040B2 (en) * 2010-05-24 2013-10-08 Apple Inc. Indirect branch target predictor that prevents speculation if mispredict is expected
US20110320787A1 (en) * 2010-06-28 2011-12-29 Qualcomm Incorporated Indirect Branch Hint
US8935694B2 (en) * 2012-01-23 2015-01-13 International Business Machines Corporation System and method for selectively saving and restoring state of branch prediction logic through separate hypervisor-mode and guest-mode and/or user-mode instructions

Also Published As

Publication number Publication date
US9298467B2 (en) 2016-03-29
CN103927149A (zh) 2014-07-16
GB2510966B (en) 2015-06-03
GB2510966A (en) 2014-08-20
CN103927149B (zh) 2018-10-16
GB201322389D0 (en) 2014-02-05
GB201300608D0 (en) 2013-02-27
US20140201509A1 (en) 2014-07-17

Similar Documents

Publication Publication Date Title
DE102014000382A1 (de) Vorhersage indirekter Abzweigungen
DE102014003434B4 (de) Vorhersage indirekter Verzweigungen
DE69130858T2 (de) Überlappende Serienverarbeitung
DE69017178T2 (de) Datenverarbeitungssystem mit Vorrichtung zur Befehlskennzeichnung.
DE60308201T2 (de) Datenverarbeitungssystem mit externen und internen anweisungssätzen
DE112011101364B4 (de) Fehlerbehebung in Multithread-Code
DE69904083T2 (de) Anordnung und verfahren zum etikettieren und ungültig-erklären von spekulativ ausgeführten befehlen
DE10085375B4 (de) Verfahren und Einrichtung für einen pipeline-verschachtelten Multi-Thread-Befehlsdecodierer
DE3687744T2 (de) Aktualisierung der verzweigungsgeschichtstabelle in einem pipeline-verarbeitungssystem.
DE60038693T2 (de) Verfahren und vorrichtung zur ausschaltung eines taktsignals in einem vielfadenprozessor
DE69802209T2 (de) An bytebereiche innerhalb eines befehlscaches gebundene verzweigungsselektoren zur schnellen identifizierung von verzweigungsprädiktoren
DE3851488T2 (de) Registerverwaltungssystem mit Ausführung von Befehlen in Unordnung in einem Computerprozessor.
DE60005860T2 (de) Ablaufsteuerung zum ausgeben und wiederausgeben von ketten abhängiger befehle
DE69702350T2 (de) Verzweigungsvorhersageschema für cachespeicherzeile, das von sätzen eines set-assoziativen cachespeichers gemeinsam verwendet wird
DE3588182T2 (de) Vorausschauende Speicherabrufmethode und System für Verzweigung mit Ausführungsbefehlen
DE69224084T2 (de) Rechneranordnung mit Mehrfachpufferdatencachespeicher und Verfahren dafür
DE69623146T2 (de) Verfahren und Vorrichtung zum Koordinieren der Benutzung von physikalischen Registern in einem Mikroprozessor
DE102015101414A1 (de) Verbesserter Rücksprungstapelpuffer
DE112010004322T5 (de) Vorhersagen und Vermeiden von Operand-Speichervorgang-Vergleich-Gefahren in Mikroprozessoren mit abweichender Reihenfolge
DE112004002365T5 (de) Übergang vom Befehls-Cache-Speicher zum Ablaufverfolgungs-Cache-Speicher basierend auf Markengrenzen
DE2855106A1 (de) Einrichtung zur durchfuehrung von instruktionsverzweigungen
DE112013003731T5 (de) Neue befehls- und hocheffiziente Mikroarchitektur zum ermöglichen einer sofortigen Kontextumschaltung für Benutzerebenen-Threading
DE102014003799A1 (de) Systeme und Verfahren zur Übertragungseliminierung mit Bypass-Mehrfachinstanziierungstabelle
DE112010004963T5 (de) Synchronisieren von SIMD Vektoren
DE112006004005T5 (de) Kommunikation zwischen Mehrfach-Ausführungsfolgen in einem Prozessor

Legal Events

Date Code Title Description
R012 Request for examination validly filed
R016 Response to examination communication
R081 Change of applicant/patentee

Owner name: MIPS TECH, LLC (N.D.GES.D.STAATES DELAWARE), S, US

Free format text: FORMER OWNER: IMAGINATION TECHNOLOGIES LIMITED, KINGS LANGLEY, HERTFORDSHIRE, GB

R082 Change of representative

Representative=s name: CMS CAMERON MCKENNA NABARRO OLSWANG LLP, GB

Representative=s name: OLSWANG GERMANY LLP, DE

R082 Change of representative

Representative=s name: CMS CAMERON MCKENNA NABARRO OLSWANG LLP, GB

R119 Application deemed withdrawn, or ip right lapsed, due to non-payment of renewal fee