DE102015100705A1 - Vorhersage von werten stapelgespeicherter variablen - Google Patents

Vorhersage von werten stapelgespeicherter variablen Download PDF

Info

Publication number
DE102015100705A1
DE102015100705A1 DE102015100705.3A DE102015100705A DE102015100705A1 DE 102015100705 A1 DE102015100705 A1 DE 102015100705A1 DE 102015100705 A DE102015100705 A DE 102015100705A DE 102015100705 A1 DE102015100705 A1 DE 102015100705A1
Authority
DE
Germany
Prior art keywords
stack
value
entry
register
data structure
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
DE102015100705.3A
Other languages
English (en)
Inventor
c/o Imagination Technologies Ltd. Jackson Hugh
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 DE102015100705A1 publication Critical patent/DE102015100705A1/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/30181Instruction operation extension or modification
    • 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/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30043LOAD or STORE instructions; Clear instruction
    • 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/30098Register arrangements
    • 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/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • G06F9/30134Register stacks; shift registers
    • 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/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • G06F9/30138Extension of register space, e.g. register cache
    • 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/3824Operand accessing
    • 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/3824Operand accessing
    • G06F9/383Operand prefetching
    • G06F9/3832Value prediction for operands; operand history buffers
    • 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/3838Dependency mechanisms, e.g. register scoreboarding
    • G06F9/384Register renaming
    • 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • 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

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)
  • Executing Machine-Instructions (AREA)

Abstract

Verfahren zum Vorhersagen von Variablen, die in einem Stapel gespeichert sind, werden beschrieben. Wenn ein Befehl gesehen wird, der eine Variable in dem Stapel an eine Position speichert, die vom Stapelzeiger versetzt ist, wird ein Eintrag zu einer Datenstruktur hinzugefügt, der das physische Register, das den Stapelzeiger derzeit speichert, das physische Register, das den Wert der Variable speichert, und den Offset-Wert identifiziert. Dann wird, wenn ein Befehl gesehen wird, eine Variable aus dem Stapel aus einer Position zu laden, die durch Bezug auf den Stapelzeiger identifiziert wird, die Datenstruktur durchsucht, um zu prüfen, ob ein entsprechender Eintrag vorliegt, der denselben Offset und dasselbe den Stapelzeiger speichernde physische Register wie der Ladebefehl enthält. Falls ein entsprechender Eintrag gefunden wird, wird das Architekturregister im Ladebefehl auf das physische Register abgebildet, das den Wert der Variable aus dem Eintrag speichert.

Description

  • Hintergrund
  • Außer-der-Reihenfolge-Mikroprozessoren (engl. out-of-order microprocessors) können ein verbessertes Rechnerleistungsverhalten bereitstellen, indem sie Befehle in einer Sequenz, die sich von der Reihenfolge im Programm unterscheidet, ausführen, so dass Befehle ausgeführt werden, wenn ihre Eingangsdaten verfügbar sind, anstatt darauf zu warten, dass der vorhergehende Befehl im Programm ausgeführt wird. Um zu erlauben, dass Befehle auf einem Mikroprozessor außerhalb der Reihenfolge laufen, ist es sinnvoll, in der Lage zu sein, von den Befehlen verwendete Register umzubenennen. Dies erlaubt das Entfernen von „Gegenabhängigkeiten” (engl. write-after-read dependencies) von den Befehlen, da diese keine echten Abhängigkeiten sind. Durch die Verwendung von Registerumbenennung und dem Entfernen dieser Abhängigkeiten können mehr Befehle außerhalb der Programmsequenz ausgeführt werden und das Leistungsverhalten wird weiter verbessert. Registerumbenennung wird durchgeführt, indem eine Übersicht verwaltet wird, welche Register, die in diesen Befehlen genannt werden (als Architekturregister bezeichnet), auf die physischen Register des Mikroprozessors abgebildet werden. Diese Übersicht kann als „Registerumbenennungsübersicht” bezeichnet werden.
  • Da es eine begrenzte Anzahl an Architekturregistern gibt, können Compiler nicht immer alle Programmvariablen in Registern behalten und infolgedessen kann es erforderlich werden, manche Variablen, die in Registern gespeichert waren, in den Speicher zu speichern (üblicherweise in den Programmstapel), um die Architekturregister freizumachen. Wenn die Werte der Variablen dann benötigt werden, müssen die Werte aus dem Speicher (z. B. dem Stapel (Stack)) wieder in ein Register ausgelesen werden. Dieses Lesen aus dem Speicher führt zu einer Verzögerung.
  • Es gibt viele Situationen, in denen dieses Problem der unzureichenden Architekturregister auftreten kann. Beispielsweise, wenn es mehr Variablen als Architekturregister innerhalb einer Funktion gibt (was zu einem Überlaufen des Registers führt) und/oder wenn eine Funktion (die Elternfunktion) eine andere Funktion (die Kindfunktion) aufruft und es nicht ausreichend Architekturregister für sowohl die Eltern- als auch die Kindfunktion gibt. Obwohl eine Lösung wäre, die Anzahl der verfügbaren Architekturregister zu erhöhen, ist dies üblicherweise nicht möglich, da es die Größe des Befehlssatzes verändern würde.
  • Die unten beschriebenen Ausführungsformen sind nicht auf Implementierungen beschränkt, die manche oder alle der Nachteile der bekannten Verfahren zum Betreiben eines Prozessors lösen.
  • Zusammenfassung
  • Diese Zusammenfassung wird bereitgestellt, um eine Auswahl von Konzepten in vereinfachter Form vorzustellen, die nachfolgend in der detaillierten Beschreibung weiter ausgeführt werden. Diese Zusammenfassung soll keine Schlüsselmerkmale oder Hauptmerkmale des beanspruchten Gegenstandes identifizieren, noch ist sie als Hilfe beim Bestimmen des Schutzbereichs des beanspruchten Gegenstandes vorgesehen.
  • Verfahren zum Vorhersagen von Werten von Variablen, die in einem Stapel gespeichert sind, werden beschrieben. Wenn ein Befehl gesehen wird, der eine Variable in den Stapel an eine Position, die vom Stapelzeiger versetzt liegt, speichert, wird ein Eintrag in eine Datenstruktur hinzugefügt, die das physische Register, das den Stapelzeiger derzeit speichert, das physische Register, das den Wert der Variable speichert, und den Offset-Wert identifiziert. Dann wird, wenn ein Befehl, eine Variable aus dem Stapel von einer Position zu laden, die durch Bezug auf den Stapelzeiger identifiziert wird, gesehen wird, die Datenstruktur durchsucht, um zu sehen, ob es einen entsprechenden Eintrag gibt, der denselben Offset-Wert und dasselbe den Stapelzeiger speichernde physische Register wie der Ladebefehl umfasst. Wird ein entsprechender Eintrag gefunden, wird das Architekturregister in dem Ladebefehl auf das physische Register, das den Wert der Variable aus dem Eintrag speichert, abgebildet.
  • Ein erster Aspekt stellt ein Verfahren zum Vorhersagen von Werten von Variablen bereit, die in einem Stapel in einem Prozessor gespeichert sind, wobei der Stapel einen Stapelzeiger aufweist und das Verfahren umfasst: in Reaktion auf ein Detektieren eines Befehls, der eine Variable in den Stapel mit Bezug auf den Stapelzeiger speichert, Speichern eines Dateneintrags in einer Datenstruktur, welcher eine eindeutige ID für den Stapelzeiger, einen den Wert der Variablen vor dem Speichern in den Stapel darstellenden Parameter und einen Offset zum Stapelzeiger, an dem die Variable gespeichert ist, umfasst; in Reaktion auf ein nachfolgendes Detektieren eines Befehls, der eine Variable mit Bezug auf den Stapelzeiger aus dem Stapel lädt, Durchsuchen der Datenstruktur nach einem Eintrag, der dem detektierten Befehl entspricht; und in Reaktion auf ein Auffinden eines entsprechenden Eintrags in der Datenstruktur, Aktualisieren eines Effektivwerts eines im detektierten Befehl referenzierten Architekturregisters unter Verwendung der im entsprechenden Eintrag gespeicherter Information.
  • Ein zweiter Aspekt stellt eine Vorrichtung bereit, die umfasst: eine Hardware-Logik, die dazu ausgelegt ist, Werte von Variablen, die in einem Stapel in einem Prozessor gespeichert sind, vorherzusagen, wobei der Stapel einen Stapelzeiger aufweist; und einen Speicher, der dazu ausgelegt ist, einen stapelgespeicherten Variablenspeicher zu speichern, wobei die Hardware-Logik dazu ausgelegt ist: in Reaktion auf ein Detektieren eines Befehls, der eine Variable mit Bezug auf den Stapelzeiger in den Stapel speichert, einen Dateneintrag, der eine eindeutige ID für den Stapelzeiger, einen Parameter, der einen Wert der Variable vor dem Speichern in den Stapel darstellt, und einen Offset vom Stapelzeiger, an dem die Variable gespeichert ist, umfasst, in den stapelgespeicherten Variablenspeicher zu speichern; in Reaktion auf ein nachfolgendes Detektieren eines Befehls, eine Variable mit Bezug auf den Stapelzeiger aus dem Stapel zu laden, den stapelgespeicherten Variablenspeicher nach einem dem detektierten Befehl entsprechenden Eintrag zu durchsuchen; und in Reaktion auf ein Auffinden eines entsprechenden Eintrags im stapelgespeicherten Variablenspeicher einen Effektivwert eines im detektierten Befehl referenzierten Architekturregisters unter Verwendung von Information, die im entsprechenden Eintrag im stapelgespeicherten Variablenspeicher gespeichert ist, zu aktualisieren.
  • Ein dritter Aspekt stellt ein computerlesbares Speichermedium bereit, das einen darauf codierten computerlesbaren Programmcode zum Erzeugen eines Prozessors, der die Vorrichtung wie hier beschrieben umfasst, aufweist.
  • Ein vierter Aspekt stellt ein computerlesbares Speichermedium bereit, das einen darauf codierten computerlesbaren Programmcode zum Erzeugen eines Prozessors aufweist, der dazu ausgelegt ist, ein Verfahren wie hier beschrieben durchzuführen.
  • Weitere Aspekte stellen ein Verfahren im Wesentlichen wie mit Bezug auf 2 und 4 der Zeichnungen beschrieben und einen Prozessor im Wesentlichen wie mit Bezug auf 3 der Zeichnungen beschrieben bereit.
  • Die hier beschriebenen Verfahren können durch einen Computer durchgeführt werden, der mit Software in maschinenlesbarer Form konfiguriert ist, die auf einem physischen Speichermedium gespeichert ist, z. B. in Form eines Computerprogramms, das computerlesbaren Programmcode zum Konfigurieren eines Computers zur Durchführung der Bestandteile von beschriebenen Verfahren umfasst oder in Form eines Computerprogramms, das Computerprogrammcodemittel, die zum Durchführen aller Schritte eines beliebigen der hier beschriebenen Verfahren adaptiert sind, umfasst, wenn das Programm auf einem Computer ausgeführt wird und wo das Computerprogramm auf einem computerlesbaren Speichermedium enthalten sein kann. Beispiele für physische (oder nichtflüchtige) Speichermedien umfassen Platten, USB-Sticks, Speicherkarten etc. und umfassen keine gesendeten Signale. Die Software kann für die Ausführung auf einem Parallelprozessor oder einem Serienprozessor geeignet sein, so dass die Schritte des Verfahrens in jeder geeigneten Reihenfolge oder gleichzeitig ausgeführt werden können.
  • Die hier beschriebenen Hardware-Komponenten können durch ein nichtflüchtiges computerlesbares Speichermedium, das darauf codierten computerlesbaren Programmcode aufweist, erzeugt werden.
  • Dies bestätigt, dass Firmware und Software getrennt verwendet und von Wert sein können. Es ist vorgesehen, dass Software umfasst ist, die auf „unintelligenter” oder Standard-Hardware läuft oder diese steuert, um die gewünschten Funktionen auszuführen. Es ist auch vorgesehen, dass Software umfasst ist, die die Konfiguration von Hardware „beschreibt” oder definiert, wie etwa HDL (Hardwarebeschreibungssprache), wie sie zum Konzipieren von Siliciumchips oder zum Konfigurieren programmierbarer Universalchips, zum Ausführen der gewünschten Funktionen eingesetzt wird.
  • Die bevorzugten Merkmale können auf geeignete Weise kombiniert werden, wie es für einen Fachmann auf dem Gebiet der Erfindung offensichtlich wäre, und können mit jedem der Aspekte der Erfindung kombiniert werden.
  • Kurze Beschreibung der Zeichnungen
  • Ausführungsformen der Erfindung werden beispielhaft mit Verweis auf die nachfolgenden Zeichnungen beschrieben, in denen:
  • 1 eine schematische Darstellung eines Stapels ist;
  • 2 ein Flussdiagramm eines beispielhaften Verfahrens zum Vorhersagen des Werts im Stapel gespeicherter Variablen zeigt;
  • 3 eine schematische Darstellung eines beispielhaften Prozessors zeigt, in dem die hier beschriebenen Verfahren implementiert werden können;
  • 4 ein Flussdiagramm optionaler zusätzlicher Schritte im beispielhaften Verfahren des Vorhersagens des Werts von im Stapel gespeicherten Variablen zeigt;
  • 5 ein Beispiel eines stapelgespeicherten Variablenspeichers zeigt;
  • 6 ein Flussdiagramm eines beispielhaften Verfahrens der Vorhersage eines Stapelzeigerwerts ist;
  • 7 eine schematische Darstellung des Wachsens und Schrumpfens eines beispielhaften Stapels zeigt;
  • 8 eine schematische Darstellung eines beispielhaften Prozessors zeigt;
  • 9 ein Flussdiagramm eines von einer Lade-Speicher-Einheit implementierten beispielhaften Verfahrens des Zwischenspeicherns eines Stapelzeigerwerts zeigt;
  • 10 ein Flussdiagramm ist, das einen Vorgang aus dem Verfahren aus 6 in größerem Detailgrad zeigt;
  • 11 ein Flussdiagramm ist, das einen Vorgang aus dem Verfahren aus 6 in größerem Detailgrad zeigt;
  • 12 ein Flussdiagramm eines weiteren beispielhaften Verfahrens des Vorhersagens eines Stapelzeigerwerts ist;
  • 13 ein Flussdiagramm eines weiteren beispielhaften Verfahrens des Vorhersagens eines Stapelzeigerwerts ist;
  • 14 ein Flussdiagramm ist, das ein implementiertes Verfahren beim Auftreten einer Unterbrechung zeigt; und
  • 15 ein Flussdiagramm eines noch weiteren beispielhaften Verfahrens des Vorhersagens eines Stapelzeigerwerts ist.
  • Die gleichen Bezugszeichen werden in den Figuren verwendet, um ähnliche Merkmale zu bezeichnen.
  • Detaillierte Beschreibung
  • Ausführungsformen der vorliegenden Erfindung werden nachfolgend lediglich beispielhaft beschrieben. Diese Beispiele stellen die dem Anmelder derzeit bekannten besten Wege dar, die Erfindung in die Praxis umzusetzen, obwohl es nicht die einzigen Wege sind, auf die dies erreicht werden kann. Die Beschreibung legt die Funktionen des Beispiels und die Sequenz der Schritte zum Konstruieren und Ausführen des Beispiels dar. Jedoch können dieselben oder gleichwertige Funktionen und Sequenzen durch andere Beispiele erreicht werden.
  • Wie oben beschrieben gibt es eine beschränkte Anzahl an Architekturregistern in einem Prozessor und somit kann es sein, dass manche Variablen, die in Registern gespeichert waren, in den Stapel gespeichert werden müssen, um Architekturregister freizumachen.
  • Der Stapel ist eine Datenstruktur, die üblicherweise verwendet wird, um eine temporäre Speicherregion für die Verwendung durch ein Programm bereitzustellen und ist als eine Last-In-First-Out-Datenstruktur (LIFO) implementiert (die auch alternativ als eine First-In-Last-Out-Datenstruktur (FILO) bezeichnet werden kann), so dass die Daten vom Stapel in streng umgekehrter Reihenfolge, in der sie zum Stapel hinzugefügt wurden, entfernt werden. Der Stapel kann von einem Stapelursprung nach oben oder nach unten wachsend betrachtet werden; jedoch ist in beiden Fällen die Spitze des Stapels, welche das dem Stapel zuletzt hinzugefügte Element ist, durch einen Stapelzeiger identifiziert, der üblicherweise auf den nächsten nichtbenutzten Eintrag zeigt. Der Wert des Stapelzeigers kann in einem Hardware-Register innerhalb eines Prozessors gespeichert werden. Wenn ein Datenelement dem Stapel hinzugefügt (oder „gepusht” wird), wird es an die Position geschrieben, auf die der Stapelzeiger zeigt, und der Wert des Stapelzeigers wird aktualisiert (so dass er zum nächsten nichtbenutzten Eintrag zeigt), z. B. indem der Zeiger um 4 (d. h. 4 Byte = 32 Bits) inkrementiert wird. Wird ein Datenelement anschließend vom Stapel entfernt (oder „gepoppt”), wird das Datenelement entfernt und der Stapelzeiger wird aktualisiert, so dass er auf den nächsten nichtbenutzten Eintrag auf dem kürzeren Stapel zeigt.
  • Für die Zwecke der nachfolgenden Beschreibung und wie in 1 gezeigt wird ein Stapel 100 (mit einem durch Pfeil 102 markierten Stapelursprung) als nach unten wachsend betrachtet, so dass der Wert des Stapelzeigers abnimmt, wenn Daten auf den Stapel abgelegt werden (z. B. wenn der Stapelzeiger sich von der durch Pfeil 104 markierten Position zu der durch Pfeil 106 markierten Position bewegt, wenn Daten 108 hinzugefügt werden), und sich erhöht, wenn Daten vom Stapel genommen werden (z. B. wenn der Stapelzeiger sich von der durch Pfeil 106 markierten Position zu der durch Pfeil 104 markierten Position bewegt, wenn Daten 108 entfernt werden). Es versteht sich jedoch, dass die hier beschriebenen Verfahren gleichermaßen anwendbar sind, wenn der Stapel als nach oben wachsend betrachtet wird (wenn der Wert des Stapelzeigers sich erhöht, wenn Daten auf den Stapel abgelegt werden und abnimmt, wenn Daten vom Stapel genommen werden).
  • Wenn von einem Programm verwendete Variablen im Stapel 100 gespeichert werden (z. B. weil es nicht ausreichend Architekturregister gibt), werden diese Variablen in einer Position (z. B. der schattierten Position 110 in 1) gespeichert, auf die durch einen Offset 112 von der derzeitigen Stapelzeigerposition (wie durch Pfeil 114 markiert) verwiesen werden kann. Alternativ dazu kann, wenn ein dynamisches Stapelwachstum in der Funktion vorliegt, auf die Position durch einen Offset von dem Rahmenzeiger anstelle des Stapelzeigers verwiesen werden. Wenn die im Stapel gespeicherten Variablen danach in ein Register zurückgelesen werden, so dass sie verwendet werden können, führt dies zu einer signifikanten Wartezeit.
  • Verfahren zum Vorhersagen des Wertes einer stapelgespeicherten Variablen werden nachfolgend beschrieben. Durch Vorhersagen des Werts anstatt ihn aus dem Speicher auszulesen wird die mit dem Auslesen des Werts aus dem Stapel assoziierte Wartezeit eliminiert. In den nachfolgend beschriebenen Verfahren wird, wenn eine Variable in den Stapel gespeichert wird, um ein Architekturregister freizumachen, ein Dateneintrag in einer Datenstruktur gespeichert, die das physische Register notiert, in dem der Wert der Variable gespeichert war (bevor sie in den Stapel gespeichert wurde), gemeinsam mit Details darüber, wo im Stapel die Variable gespeichert wird. Nachfolgend kann, wenn es einen Befehl gibt, die Variable aus dem Stapel zu laden, der zuvor gespeicherte Dateneintrag verwendet werden, um zu identifizieren, welches physische Register den Wert der Variable enthält und das neue Architekturregister kann auf dieses physische Register abgebildet werden. In manchen Beispielen wird das Laden aus dem Speicher nicht durchgeführt, während in anderen Beispielen das Laden aus dem Speicher noch durchgeführt werden kann, aber der vorhergesagte Wert wird verwendet, um zu ermöglichen, dass abhängige Befehle parallel zu dem Laden ausgeführt werden und das Laden wird nur verwendet, um zu überprüfen, dass der vorhergesagte Wert (d. h. der Wert, der im physischen Register gespeichert ist, das in der Datenstruktur identifiziert wurde und auf das das neue Architekturregister abgebildet ist) korrekt ist. Ferner werden auch Verfahren beschrieben, die das Funktionieren des Verfahrens nach einem Funktionsaufruf und/oder wenn keine Registerumbenennung eingesetzt wird, ermöglichen.
  • 2 zeigt ein Flussdiagramm eines beispielhaften Verfahrens zum Vorhersagen des Werts von im Stapel gespeicherten Variablen. Wie in 2 gezeigt, wird, wenn ein Befehl, der einen Wert speichert (der in Konstrukten höherer Ebene auch als Variable bezeichnet werden kann) mit Bezug auf den Stapelzeiger (Block 202) gesehen wird, ein dem Speicherbefehl entsprechender Dateneintrag in eine neue Datenstruktur gespeichert, die hier als „stapelgespeicherter Wertspeicher” bezeichnet werden kann (Block 204). Der Befehl kann beispielsweise detektiert werden (in Block 202) durch Prüfen des Befehls, nach einem Befehl zu suchen, der vor dem Umbenennen die folgende Form aufweist:
    ST Reg, [SP + #offset]
    (wobei Reg ein beliebiger Wert sein kann, #offset ein buchstäblicher Wert ist und SP sich auf den Architekturstapelzeiger bezieht) und in manchen Beispielen können auch PC-basierte (programmzählerbasierte) Vertrauenstabellen verwendet werden. Jeder Datensatz umfasst drei Elemente: Die Register-ID des physischen Registers, das den derzeitigen Stapelzeigerwert (PSP) speichert, die Register-ID des physischen Registers, das den Wert der Variable vor dem Speichern in den Stapel (P) speichert, und den Offset zum derzeitigen Stapelzeiger, an dem die Variable gespeichert ist (O). In manchen Beispielen sind alle drei Elemente (PSP, P und O) zur Gänze innerhalb eines Dateneintrags umfasst. In anderen Beispielen kann, anstatt PSP zur Gänze zu umfassen, ein Teilsatz (Teilmenge) der Bits von PSP umfasst sein, und ähnlich dazu kann, anstatt O zur Gänze zu umfassen, ein Teilsatz der Bits von O umfasst sein. In anderen Beispielen kann eine Kombination aus Bits von PSP und O (anstatt PSP und O zur Gänze) verwendet werden, z. B. ein ,Hash' aus PSP und O, wie etwa das Ergebnis einer Kombination aus den Bits von PSP mit den Bits von O unter Verwendung einer XOR-Logik-Funktion.
  • Wie oben beschrieben kann es in dem Fall, in dem es ein dynamisches Stapelwachstum in der Funktion gibt, die Position durch einen Offset vom Rahmenzeiger anstelle des Stapelzeigers referenziert werden und in diesem Fall, anstatt die Register-ID des physischen Registers, das den derzeitigen Stapelzeigerwert (PSP) speichert, wird die Register-ID des physischen Registers, das den derzeitigen Rahmenpunktwert speichert, an der Stelle (PFP) gespeichert. Der Offset, O, der gespeichert wird, ist dann der Offset zum derzeitigen Rahmenzeiger, an dem die Variable gespeichert ist. Der Lookup-Prozess bleibt unverändert, ungeachtet dessen, ob PSP oder PFP gespeichert wird, da die Tabelle in beiden Fällen physische Register-IDs speichert. Aus Gründen der Klarheit bezieht sich die nachfolgende Beschreibung auf das Speichern von PSP, aber es versteht sich, dass die Beschreibung auch auf Situationen, in denen PFP gespeichert wird, anwendbar ist.
  • Es kann viele Dateneinträge im stapelgespeicherten Wertspeicher geben und der Speicher kann so ausgelegt sein, dass er die Daten auf jede geeignete Weise speichert und die unten beschriebenen Beispiele stellen lediglich einige Beispiele bereit. In einem Beispiel kann jeder Dateneintrag eine 5-Bit-Register-ID für den Stapelzeiger, eine 5-Bit-Register-ID, die die Variable vor dem Speichern in den Stapel hält, und einen Offset umfassen, der beispielsweise eine Größe von 16 Bits aufweisen kann, wenn das gesamte Spektrum möglicher Offsets innerhalb des Stapels untergebracht wird. Jedoch kann, da der tatsächliche Offset vermutlich viel kleiner ist, die Größe der im stapelgespeicherten Variablenspeicher gespeicherten Offsets auf eine Größe von beispielsweise 5 Bits beschränkt sein.
  • Wenn die Größe des Offsets, der in den stapelgespeicherten Variablenspeicher gespeichert werden kann, beschränkt ist (z. B. auf einen 5-Bit-Eintrag), gibt es eine Reihe verschiedener Mechanismen, die verwendet werden können, um das unwahrscheinliche Problem anzugehen, dass der tatsächliche Offset größer ist, als im verfügbaren Eintrag gespeichert werden kann. In einem ersten Beispiel wird ein Eintrag nicht gespeichert, so dass der Wert der Variable danach nicht vorhergesagt werden kann und stattdessen aus dem Stapel ausgelesen werden muss. In einem zweiten Beispiel werden nur die unteren (d. h. die am wenigsten signifikanten) Bits gespeichert. Das kann zu einer inkorrekten Vorhersage führen, wenn die 5 Bits, die gespeichert werden, zu einem anderen Eintrag im stapelgespeicherten Wertspeicher passen. In einem dritten Beispiel ist der gespeicherte Offset-Wert möglicherweise kein tatsächlicher Offset-Wert, sondern ein Hash des Offset-Werts, der einen 5-Bit-Wert erzeugt (was das Risiko eines Übereinstimmens zwischen zwei Einträgen im stapelgespeicherten Wertspeicher reduziert).
  • In einem Beispiel kann der nachfolgende Befehl, der einen Wert mit Bezug auf einen Stapelzeiger speichert, identifiziert werden (in Block 202):
    ST R2 8[SP]
    wobei R2 das in den Stapel zu speichernde Architekturregister ist und dies an einem Offset von 8 vom Stapelzeiger (SP) zu speichern ist. Dies kann (unter Verwendung der Registerumbenennungsübersicht) von der Dekodier- und Umbenennungsstufe in einem Prozessor wie folgt übersetzt werden:
    ST P8 8[P4]
    angenommen, dass in diesem Beispiel das Architekturregister R2 derzeit auf das physische Register P8 abgebildet ist und der derzeitige Stapelzeiger im physischen Register P4 gespeichert ist. Dies führt zu einem Eintrag im stapelgespeicherten Variablenspeicher, der die folgenden drei Elemente umfasst: P4, P8 und 8.
  • In einem Beispiel kann der stapelgespeicherte Wertspeicher in Form einer Tabelle vorliegen:
    P4 P8 8
    wobei die erste Spalte die dem Stapelzeiger (PSP) entsprechende Register-ID speichert, die zweite Spalte die Register-ID, auf die das Architekturregister vor dem Schreiben in den Stapel (P) abgebildet ist, speichert und die dritte Spalte den Offset-Wert (O) speichert.
  • Wenn es ein begrenztes Platzangebot im stapelgespeicherten Variablenspeicher gibt, können Dateneinträge entfernt werden, um Raum für neue Dateneinträge zu schaffen und dies kann beispielsweise auf einem Least-Recently-Used-Algorithmus (LRU-Algorithmus), der einen am längsten nicht verwendeten Dateneintrag entfernt, um, wenn der stapelgespeicherte Variablenspeicher voll wird, Raum für einen neuen Dateneintrag zu schaffen, oder jeden anderen Ersetzungsalgorithmus basieren. Zusätzlich dazu oder stattdessen können Einträge aus dem stapelgespeicherten Variablenspeicher entfernt werden, wenn das Programm aus einer Funktion zurückkehrt. In einem solchen Beispiel werden alle Einträge von einer Funktion aus dem stapelgespeicherten Variablenspeicher entfernt, wenn das Programm von dieser Funktion zurückkehrt und eine Bestimmung, welche Einträge im stapelgespeicherten Variablenspeicher entfernt werden sollten, kann auf dem Stapelzeiger basieren. Dies ist deshalb, weil alle Einträge aus einer Funktion denselben Stapelzeigerwert aufweisen werden, sofern keine dynamische Speicherzuweisung eingesetzt wird. Wenn eine dynamische Speicherzuweisung verwendet wird, wird PFP anstatt PSP gespeichert und dasselbe Räumungsverfahren kann eingesetzt werden (was in Folge alle Einträge mit demselben PFP entfernen wird).
  • In manchen Beispielen kann das Verfahren auf Verdoppelung prüfen, d. h. eine Speicherung an dieselbe Stelle wie ein bestehender Eintrag im stapelgespeicherten Variablenspeicher (d. h. dieselben Werte für sowohl PSP als auch O). Wenn ein Befehl gesehen wird, der eine Speicherung an dieselbe Stelle wie ein bestehender Eintrag betrifft, dann kann dieser bestehende Eintrag im stapelgespeicherten Variablenspeicher mit dem neuen Eintrag überschrieben werden. Falls das Verfahren nicht auf Verdoppelung prüft, ist der Umfang der zum Implementieren des Verfahrens erforderlichen Logik reduziert, aber zu Lasten einer reduzierten Vorhersagekorrektheit.
  • Wenn danach ein Befehl, der eine Variable aus dem Stapel in ein Architekturregister lädt, gesehen wird (Block 206), wird der stapelgespeicherte Variablenspeicher durchsucht (Block 208), um zu schauen, ob ein dem Ladebefehl (gesehen in Block 206) entsprechender Eintrag vorliegt, d. h. ein Eintrag, der denselben Offset von demselben Stapelzeiger (d. h. dieselbe physische Register-ID, an der der Stapelzeigerwert gespeichert ist) umfasst. Der Befehl kann beispielsweise detektiert werden (in Block 206), indem der Befehl geprüft wird, nach einem Befehl zu suchen, der vor der Umbenennung die folgende Form aufweist:
    LD Reg, [SP + #offset]
  • Es gibt viele verschiedene Wege, wie die Suche (in Block 208) durchgeführt werden kann und dies wird zumindest teilweise von der Struktur des stapelgespeicherten Variablenspeichers abhängen. Verschiedene Strukturen und ihre Auswirkung auf den Suchvorgang werden nachfolgend detaillierter beschrieben.
  • In einem Beispiel kann der stapelgespeicherte Variablenspeicher die folgenden Einträge umfassen:
    P2 P3 6
    P4 P8 8
    P6 P7 2
    wobei, wie oben beschrieben, die erste Spalte die dem Stapelzeiger (PSP) entsprechende Register-ID speichert, die zweite Spalte die Register-ID, auf die das Architekturregister vor dem Schreiben in den Stapel (P) abgebildet ist, speichert und die dritte Spalte den Offset-Wert (O) speichert.
  • Wenn ein Ladebefehl der folgenden Form gesehen wird (in Block 206):
    LD R3 [SP + #8]
    wobei R3 das Architekturregister ist, in das der aus dem Stapel geladene Wert zu speichern ist (was zuvor als ,neues Architekturregister' bezeichnet wurde, um es vom ursprünglichen Architekturregister, das vor dem Speichern in den Stapel der Variable zugeordnet war, zu differenzieren), kann dies (unter Verwendung der Registerumbenennungsübersicht) wie folgt übersetzt werden:
    LD P10 [P4 + #8]
    da Architekturregister R3 derzeit auf das physische Register P10 abgebildet ist und der Stapelzeigerwert derzeit im physischen Register P4 gespeichert ist (was auch so beschrieben werden kann, dass der Stapelzeiger derzeit auf P4 abgebildet ist).
  • Die Suche (in Block 208) sucht daher nach einem entsprechenden Eintrag, der einen Offset von 8 und einen Stapelzeiger von P8 umfasst. In diesem Beispiel erfüllt der zweite Eintrag im stapelgespeicherten Variablenspeicher diese Kriterien und somit wird ein entsprechender Eintrag im stapelgespeicherten Variablenspeicher gefunden (,Ja' in Block 210).
  • In Reaktion auf ein Auffinden eines entsprechenden Eintrags im stapelgespeicherten Variablenspeicher (,Ja' in Block 210) könnte das Verfahren fortfahren, indem es den derzeit im identifizierten Register im entsprechenden Eintrag (z. B. P8 im obigen Beispiel) gespeicherten Variablenwert in das physische Register, auf das das (im Ladebefehl identifizierte) Architekturregister (z. B. P10 im obigen Beispiel) abgebildet ist, verschiebt. Jedoch muss diese Verschiebung nicht durchgeführt werden und stattdessen kann eine Registerumbenennung erfolgen, um das im Ladebefehl identifizierte Architekturregister auf das im entsprechenden Eintrag identifizierte physische Register (Block 212) abzubilden, d. h. die Registerumbenennungsübersicht kann direkt mit dem physischen Register, das im entsprechenden Eintrag identifiziert wurde, aktualisiert werden. Somit wird im obigen Beispiel, anstatt den Wert aus dem physischen Register P8 in das physische Register P10 zu verschieben, die Registerumbenennungsübersicht aktualisiert, so dass das Architekturregister R3 auf P8 anstatt auf P10 abgebildet wird (in Block 212).
  • In diesem Beispiel wird der Ladebefehl nie durchgeführt; jedoch kann in anderen Beispielen das Laden aus dem Stapel wie unten beschrieben nach wie vor durchgeführt werden. In beiden Situationen ist der Wert der Variable für die Verwendung durch einen anderen Befehl (z. B. einen abhängigen Befehl) ohne Wartezeit, die auf das Warten bis die Variable aus dem Stapel in ein Register zurückzuführen ist, verfügbar.
  • Wenn die Suche (in Block 208) nicht zum Auffinden eines entsprechenden Eintrags im stapelgespeicherten Variablenspeicher führte (,Nein' in Block 210), wird die Variable auf die herkömmliche Weise (Block 214) aus dem Stapel in das identifizierte physische Register (d. h. das direkt auf das im Ladebefehl identifizierte Architekturregister abgebildet ist) geladen.
  • 3 zeigt eine schematische Darstellung eines Beispiels für einen Außerder-Reihenfolge-Prozessor 300, in dem die hier beschriebenen Verfahren implementiert werden können. In diesem Beispiel ist der Prozessor 300 ein Einzel-Thread-Prozessor; jedoch sind die Verfahren auch auf Multi-Thread-Prozessoren anwendbar (wobei jeder Thread mittels getrennter Stapelzeiger einen getrennten Stapel verwalten würde).
  • Der Prozessor 300 umfasst eine Abrufstufe 302, eine Dekodier- und Umbenennungsstufe 304, einen Reorganisationspuffer 306, eine Übergabestufe (Commit) 308 und eine oder mehrere Funktionseinheiten 310, die jeweils eine oder mehrere Ausführungspipelines umfassen. Der Prozessor 300 umfasst ferner eine Registerumbenennungsübersicht (oder Registerumbenennungstabelle) 312, die von der Dekodier- und Umbenennungsstufe 304 (oder von einem Registerumbenennungsmodul innerhalb der Dekodier- und Umbenennungsstufe 304) verwaltet wird.
  • Die Abrufstufe 302 ist dazu ausgelegt, Befehle aus einem Programm (in Programmreihenfolge) wie von einem Programmzähler (PC) angegeben abzurufen. Sobald ein Befehl abgerufen wird, wird er der Dekodier- und Umbenennungsstufe 304 bereitgestellt, die dazu ausgelegt ist, die Befehle zu interpretieren und die Registerumbenennung durchzuführen. Insbesondere kann jeder Befehl eine Register-Schreiboperation; eine oder mehrere Register-Ausleseoperation; und/oder eine arithmetische oder logische Operation umfassen. Eine Register-Schreiboperation schreibt in ein Zielregister und eine Register-Ausleseoperation liest aus einem Quellregister. Während der Registerumbenennung wird jedes Architekturregister, das in einem Befehl referenziert wird (z. B. jedes Quell- und Zielregister) durch ein physisches Register ersetzt (oder umbenannt).
  • Für Register-Schreiboperationen wird dem referenzierten Architekturregister (z. B. Zielregister) ein unbenutztes (oder verfügbares) physisches Register zugewiesen. Jede Zuweisung kann in der Registerumbenennungsübersicht 312 gespeichert werden, wobei die Registerumbenennungsübersicht 312 eine Datenstruktur ist, die die Abbildung zwischen jedem Architekturregister und dem physischen Register zeigt, die dem Befehl im Programmfluss zugewiesen sind. Für Register-Leseoperationen kann das korrekte physische Register für ein bestimmtes Architekturregister (z. B. Quellregister) aus einem vom Architekturregister indexierten Eintrag in der Registerumbenennungsübersicht 312 bestimmt werden.
  • Die oben mit Bezug auf 2 beschriebenen Verfahren können innerhalb der Dekodier- und Umbenennungsstufe 304 implementiert werden und in einem Beispiel kann die Dekodier- und Umbenennungsstufe 304 ein stapelgespeichertes Variablenvorhersagemodul 314 umfassen, das das in 2 und oben beschriebene Verfahren durchführt. Wie oben beschrieben verwaltet dieses Modul 314 (oder die Dekodier- und Umbenennungsstufe 304) eine Datenstruktur, die hier als stapelgespeicherter Variablenspeicher 316 bezeichnet wird.
  • Nachdem ein Befehl durch die Dekodier- und Umbenennungsstufe 304 hindurchtritt, wird er in einen Reorganisationspuffer 306 (ROB) eingefügt und zur Ausführung an eine Funktionseinheit 310 versandt. Die Funktionseinheit 310, an die der Befehl versandt wird, kann auf der Art des Befehls basieren. Der Reorganisationspuffer 306 ist ein Puffer, der ermöglicht, dass die Befehle außerhalb der Reihenfolge ausgeführt, aber in der Reihenfolge übergeben werden. Der Reorganisationspuffer 306 hält die Befehle, die in ihn eingefügt werden, in der Programmreihenfolge, aber innerhalb des ROB 306 können die Befehle von den Funktionseinheiten 310 außerhalb der Sequenz ausgeführt werden. In manchen Beispielen kann der Reorganisationspuffer 306 als kreisförmiger Puffer mit einem Kopfteil, der auf den ältesten Befehl im ROB 306 zeigt, und mit einem Endteil, der auf den jüngsten Befehl im ROB 306 zeigt, ausgebildet sein. Befehle werden in Programmreihenfolge vom Reorganisationspuffer 306 an die Übergabestufe 308 ausgegeben. In anderen Worten, ein Befehl wird vom Kopfteil des ROB 306 ausgegeben, wenn dieser Befehl ausgeführt wurde, und der Kopfteil des ROB 306 wird auf den nächsten Befehl im ROB 306 inkrementiert. Vom Reorganisationspuffer 306 ausgegebene Befehle werden einer Übergabestufe 308 bereitgestellt, die die Ergebnisse der Befehle an das Register/den Speicher übergibt.
  • Jede Funktionseinheit 310 ist verantwortlich für die Ausführung von Befehlen und kann für die Ausführung spezieller Befehlsarten ausgelegt sein. Beispielsweise können die Funktionseinheiten 310 eine oder mehrere Lade-Speicher-Einheiten, eine Integer-Einheit, eine Gleitkommaeinheit (FPU), eine digitale Signalverarbeitungs-(DSP-)/Single-Instruction-Multiple-Data-(SIMD-)Einheit oder eine Multiply-Accumulate-(MAC-)Einheit umfassen. Eine Integereinheit führt Integeranwendungen durch, eine FPU führt Gleitkommabefehle aus, eine DSP/SIMD-Einheit weist mehrere Verarbeitungselemente, die dieselbe Operation auf mehreren Datenpunkten gleichzeitig ausführen, auf und eine MAC-Einheit berechnet das Produkt zweier Zahlen und addiert dieses Produkt zu einem Akkumulator. Die Pipelines innerhalb der Funktionseinheiten können unterschiedliche Längen und/oder Komplexitäten aufweisen. Beispielsweise ist eine FPU-Pipeline üblicherweise länger als eine Integerausführungspipeline, da sie allgemein kompliziertere Operationen durchführt.
  • Der Prozessor 300 kann auch andere als die in 3 gezeigten Funktionselemente umfassen (z. B. kann er einen Registerspeicher-Cache (RFC) und einen Registerspeicher (RF) umfassen). Der Prozessor kann ferner einen Abzweigungsprädiktor umfassen, der dazu ausgelegt ist, vorherzusagen, welche Richtung der Programmfluss einschlagen wird, falls von Befehlen bekannt ist, dass sie mögliche Flussveränderungen verursachen, wie etwa Zweigbefehlen. Abzweigungsvorhersage ist nützlich, da sie ermöglicht, dass Befehle spekulativ vom Prozessor 400 ausgeführt werden, bevor das Ergebnis des Abzweigungsbefehls bekannt ist. Wenn der Abzweigungsprädiktor den Programmfluss richtig vorhersagt, verbessert dies das Leistungsverhalten des Prozessors 300. Jedoch wenn der Abzweigungsprädiktor die Abzweigungsrichtung inkorrekt vorhersagt, tritt eine Fehlvorhersage auf, die korrigiert werden muss, bevor das Programm fortsetzen kann. Um eine Fehlvorhersage zu korrigieren, werden die an den ROB 406 gesendeten spekulativen Befehle verworfen und die Abrufstufe 302 beginnt, Befehle vom korrekten Programmzweig abzurufen.
  • Es versteht sich, dass andere Prozessoren möglicherweise nicht alle in 3 gezeigten Funktionselemente aufweisen (d. h. eines oder mehrere der in 3 gezeigten Funktionselemente können weggelassen werden) und zusätzliche Funktionselemente umfassen können, die in 3 nicht gezeigt sind.
  • Wie in 3 gezeigt wird der stapelgespeicherte Variablenspeicher 316 separat von und parallel zur Pflege der Registerumbenennungsübersicht 312 von der Dekodier- und Umbenennungsstufe 304 verwaltet. Alternativ dazu können die beiden zu einer einzigen Datenstruktur kombiniert werden, in der ein Teil (der der Registerumbenennungsübersicht 312 entspricht) vom Architekturregister indexiert wird und der andere Teil (der dem stapelgespeicherten Variablenspeicher 316 entspricht) von PSP und O indexiert wird, aber die beiden Teile nach wie vor unabhängig voneinander aktualisiert werden. Die Dekodier- und Umbenennungsstufe 304 kann ein stapelgespeichertes Variablenvorhersagemodul 314 umfassen, das dazu ausgelegt ist, die Werte im stapelgespeicherten Variablenspeicher 316 (z. B. wie oben mit Bezug auf 2 beschrieben) zu speichern.
  • Obwohl es alternativ dazu möglich sein kann, Werte von Architekturregistern in der Lade-Speicher-Einheit (welche eine der Funktionseinheiten 310 ist) zwischenzuspeichern, wird durch Vorhersagen des Werts stapelgespeicherter Variablen in der Dekodier- und Umbenennungsstufe 304 wie hier beschrieben der Wert früher vorhergesagt und somit besteht keine Notwendigkeit, Werte aus einem Cache zu laden (stattdessen umfasst die Vorhersage einen Umbenennungsvorgang).
  • Wie oben beschrieben wird der Ladebefehl (siehe in Block 206) in manchen Beispielen möglicherweise nicht durchgeführt. In anderen Beispielen kann der Ladebefehl jedoch ausgeführt werden, um zu überprüfen, dass der Wert, der im physischen Register gespeichert ist, das im entsprechenden Eintrag des stapelgespeicherten Variablenspeichers identifiziert wurde, korrekt ist, wie in 4 gezeigt. In einem solchen Beispiel wird die Ladung jedoch (Block 402) parallel zu anderen Befehlen (Block 404) ausgeführt, d. h. andere Befehle warten nicht, bis der Wert aus dem Stapel geladen ist. Wenn der Wert aus dem Stapel geladen wurde (in Block 402), wird der geladene Wert mit dem vorhergesagten Wert verglichen (Block 406), d. h. der geladene Wert wird mit dem Wert verglichen, der im physischen Register gespeichert ist, das im entsprechenden Eintrag des stapelgespeicherten Variablenspeichers identifiziert wurde. Wenn die Werte übereinstimmen (,Ja' in Block 406), dann ist die Überprüfung bestanden und keine Rückabwicklung ist erforderlich. Stimmen die Werte jedoch nicht überein (,Nein' in Block 406), werden alle vom vorhergesagten Wert abhängigen Befehle rückabgewickelt (Block 408). In manchen Beispielen können mehr Befehle als die, die vom vorhergesagten Wert abhängen, rückabgewickelt werden, z. B. können alle Befehle, die parallel ausgeführt wurden, rückabgewickelt werden.
  • Das Fehlen einer Übereinstimmung von Werten (was zu einem ,Nein' in Block 406 führt) kann auftreten, weil das im entsprechenden Befehl identifizierte physische Register im Zeitraum zwischen dem Speicherbefehl (gesehen in Block 202) und dem Ladebefehl (gesehen in Block 206) überschrieben wurde oder weil etwas den Variablenwert im Stapel aktualisiert hat.
  • Durch das parallele Durchführen des Ladens (wie in 4 gezeigt) kommt es zu einer erhöhten Kohärenz des vorhergesagten Werts mit anderen Threads oder dem Debugger (die im Stapel gespeicherte Registerwerte aktualisieren wollen können). Da es unwahrscheinlich ist, dass die im Stapel gespeicherten Registerwerte von anderen Threads oder dem Debugger verändert werden, ist die Fehlvorhersagerate wahrscheinlich sehr gering.
  • Der stapelgespeicherte Variablenspeicher 316 kann jedes in Speichercaches eingesetzte Zwischenspeicherverfahren verwenden, wie etwa ein beliebiges Assoziativitätsniveau von direkt abgebildet bis vollständig assoziativ. In einem Beispiel können eines oder mehrere der Offset-Bits als ein Index in den stapelgespeicherten Variablenspeicher verwendet werden, der die Anzahl von Einträgen, die zum Auffinden eines entsprechenden Eintrags durchsucht werden müssen (z. B. in Block 208 in 2), reduziert. 5 zeigt ein Beispiel eines stapelgespeicherten Variablenspeichers 500, in dem die 3 am wenigsten signifikanten Bits (LSBs) des Offsets verwendet werden, um die Einträge im Speicher 500 zu indexieren. In einem solchen Beispiel gibt es 8 Zeilen 5057, die den drei LSBs des Offsets entsprechen, der 000–111 im Binärformat (0–7 im Dezimalformat) ist.
  • Wenn ein Dateneintrag gespeichert wird (z. B. in Block 204 in 2) wird ein Eintrag in einer Zeile gemäß den drei LSBs des Offsets im Dateneintrag gespeichert, der Dateneintrag selbst umfasst dann die Register-ID des Stapelzeigers (PSP), die ID des physischen Registers, das den Wert, der in den Stapel gespeichert wird (P), hält, und die verbleibenden Bits des Offsets (O'). In einem Beispiel, in dem der Offset 5 Bits umfasst, umfasst O' nur zwei Bits (d. h. die zwei am meisten signifikanten Bits).
  • Beim Suchen nach einem Dateneintrag (z. B. in Block 208 von 2) ist es nur nötig, die Zeile des stapelgespeicherten Variablenspeichers 316, die den drei LSBs des Offsets entspricht, zu durchsuchen. Beispielsweise ist es, wenn die drei LSBs des Offsets 001 sind, nur nötig, in der zweiten Reihe 51 nach einem Eintrag zu suchen, der die korrekten verbleibenden Bits des Offsets (d. h. den entsprechenden Wert von O') und denselben Stapelzeiger (d. h. den entsprechenden Wert von PSP) enthält.
  • In verschiedenen Beispielen kann die Arbeitsweise des Compilers gemäß der Art, auf die der stapelgespeicherte Variablenspeicher ausgelegt und indexiert ist, geändert werden. Beispielsweise ist, wenn der stapelgespeicherte Variablenspeicher wie in 5 gezeigt von einem Teilsatz des Offsets indexiert wird, die Suche am effizientesten, wenn die Variablen an der Spitze des Stapels gespeichert sind (d. h. was zu kleinen Offsetwerten vom Stapelzeiger führt), in welchem Fall der Compiler so modifiziert werden kann, dass er die am häufigsten zugegriffenen Variablen an oder in der Nähe der Stapelspitze speichert.
  • Obwohl das in 5 gezeigte Beispiel den stapelgespeicherten Variablenspeicher durch den Offset oder einen Teilsatz von Bits vom Offset indexiert (wobei der Begriff Teilsatz hier verwendet wird, um einen richtigen Teilsatz zu bezeichnen) können in anderen Beispielen andere Parameter verwendet werden, um den stapelgespeicherten Variablenspeicher zu indexieren. Beispielsweise kann der Speicher von der Register-ID, die den Stapelzeiger speichert, indexiert werden, so dass alle Einträge, die derselben Register-ID entsprechen, sich in derselben Zeile/Spalte des Speichers befinden. Wenn dies in Kombination mit dem Löschen von Einträgen aus dem Speicher nach der Rückkehr von einem Funktionsaufruf verwendet wird, ist es nur notwendig, die Reihe/Spalte zu löschen, die der jeweiligen Register-ID für den Stapelzeiger der Funktion entspricht. In einem anderen Beispiel kann der Speicher von einem Hash der PSP- oder O-Felder oder jedem Teilsatz/Kombination/Funktion dieser Felder indexiert sein und die Mischfunktion und/oder -felder können ausgewählt werden, um einen Index mit einer für die Implementierung geeigneten Größe bereitzustellen.
  • In verschiedenen Beispielen kann der Stapelzeiger nach einem Funktionsaufruf auf den Wert vor dem Funktionsaufruf zurückgesetzt werden; jedoch werden, da der Stapelzeigerwert nun in einem anderen physischen Register gespeichert wird, etwaige Einträge im stapelgespeicherten Variablenspeicher, die vor dem Funktionsaufruf gespeichert wurden, in einer Suche nach entsprechenden Einträgen in der Datenstruktur nicht länger aufgefunden werden (z. B. in Block 208 in 2). Wenn jedoch der Stapelzeiger nach einem Funktionsaufruf auf dasselbe physische Register als vor dem Funktionsaufruf zurückgesetzt wird, werden die zuvor im stapelgespeicherten Wertspeicher gespeicherten Daten weiterhin nutzbar bleiben.
  • Dies kann durch folgendes Beispiel demonstriert werden, in dem vor einem Funktionsaufruf zwei Einträge im stapelgespeicherten Wertspeicher gespeichert werden (in Block 204 in 2):
    P4 P3 6
    P4 P8 8
  • Beide dieser Einträge beziehen sich auf denselben Stapelzeigerwert, S, der in einem physischen Register P4 gespeichert ist. Wenn, in einem ersten Szenario, der Stapelzeigerwert S nach einem Funktionsaufruf zurückgesetzt wird, aber anstatt im physischen Register P4 im physischen Register P5 gespeichert wird, wird ein nachfolgender Ladebefehl:
    LD R3 [SP + #8]
    zu einer Suche nach einem entsprechenden Eintrag, der den Stapelzeiger P5 und einen Offset von 8 umfasst, führen. Es gibt keinen solchen Eintrag im stapelgespeicherten Wertspeicher und somit muss das Laden ausgeführt werden (in Block 214 in 4).
  • Wenn im Gegensatz dazu in einem zweiten Szenario der Stapelzeigerwert S nach einem Funktionsaufruf auf sein ursprüngliches physisches Register P4 zurückgesetzt wird (oder wenn dieses Register während dem Funktionsaufruf tatsächlich nicht geändert wurde, wird der Stapelzeiger auf das ursprüngliche physische Register P4 erneut abgebildet), dann wird die Suche nach einem entsprechenden Eintrag das Suchen nach einem Eintrag, der den Stapelzeiger P4 und einen Offset von 8 umfasst, umfassen. Dies führt zum Auffinden eines entsprechenden Eintrags (des zweiten Eintrags) und somit kann das Architekturregister R3 auf das Register P8 (in Block 212) abgebildet werden und die nachfolgende Ausführung ist, während das Laden aus dem Speicher geschieht, nicht verzögert.
  • In verschiedenen Beispielen kann die niederschwellige Steuerung der physischen Register verwendet werden, um sicherzustellen, dass die ursprünglichen physischen Register (die im stapelgespeicherten Variablenspeicher referenziert sind) nicht für ungültig (Invalidierung) erklärt werden, während sie im stapelgespeicherten Variablenspeicher referenziert sind. Beispielsweise kann die Invalidierungslogik/Freiliste wissen, welche Register derzeit vom stapelgespeicherten Wertspeicher benutzt werden und wird diese nicht für ungültig erklären. Sobald die Einträge, die die jeweilige Register-ID enthalten, aus dem stapelgespeicherten Variablenspeicher gelöscht wurden, können die physischen Register für ungültig erklärt/wiederverwendet etc. werden. In manchen Beispielen kann die Invalidierungslogik/Freiliste diese Register bei Bedarf wiederverwenden und in diesem Fall wird der stapelgespeicherte Variablenspeicher benachrichtigt, damit er die zugeordneten Einträge entfernen kann.
  • 6 zeigt ein Verfahren zum Vorhersagen des Werts eines Stapelzeigers, das zum Wiederherstellen des Stapelzeigers nach einem Funktionsaufruf auf dasselbe physische Register, das er vor dem Funktionsaufruf eingenommen hat, führt. Durch die Verwendung dieses Verfahrens können die oben beschriebenen Verfahren auch nach einem Funktionsaufruf verwendet werden.
  • Wenn ein den Stapel vergrößernder Befehl gesehen wird (Block 602), wird die Register-ID für das physische Register, das derzeit den Stapelzeigerwert hält (vor dem Anwachsen des Stapels), gemeinsam mit einem Größenwert des Stapels (Block 604) gespeichert. Die Register-ID und der Größenwert können in einer neuen Datenstruktur gespeichert werden (in Block 604), die dazu ausgelegt sein kann, N Paare von Werten zu umfassen (wobei N eine Frage der Konzeption ist). Diese Datenstruktur kann auch die Form eines Stapels (d. h. eine LIFO- oder eine FILO-Datenstruktur) annehmen, wobei die Einträge strikt in umgekehrter Reihenfolge zu der Reihenfolge, in der sie zum Stapel hinzugefügt wurden, entfernt werden, und kann hier als ,Vorhersagestapel' bezeichnet werden, um ihn vom Hauptstapel (wie in 2 gezeigt), auf den sich die in den Blöcken 602 und 606 aus 1 gesehenen Befehle beziehen, zu unterscheiden.
  • In einem Beispiel kann der den Stapel vergrößernde Befehl (wie in Block 602 gesehen) das Ergebnis eines Funktionsaufrufs (d. h. das Eingeben einer Funktion) sein und der Befehl kann beispielsweise die folgende Form annehmen:
    SUB P8 P2 16
    wobei P8 die ID des neuen physischen Registers ist, das dem Stapelzeigerwert zugewiesen wurde und wo der neue Stapelzeigerwert zu speichern ist, P2 die ID des physischen Registers ist, das dem Stapelzeiger derzeit zugewiesen ist (und somit den Stapelzeigerwert hält, bevor er Daten dem Stapel hinzufügt) und 16 die Erhöhung der Größe des Stapels ist.
  • Bezugnehmend auf den in 1 gezeigten Beispielstapel 100 hält das physische Register P2 den Stapelzeigerwert, der dem Pfeil 104 entspricht, und das physische Register P8 ist der Speicherort des neuen Werts des Stapelzeigers, der Pfeil 106 entspricht, was ermöglicht, dass die Daten (in diesem Beispiel vier Variablen 108 mit einer Breite von jeweils 32 Bits) dem Stapel 100 hinzugefügt werden.
  • Wenn die Datenstruktur (oder der Vorhersagestapel) ursprünglich leer war, können nach dem obigen Beispielbefehl die Inhalte der Datenstruktur wie folgt sein:
    P2 4
    wobei die erste Spalte die Register-ID enthält und die zweite Spalte den Größenwert (in Byte) enthält. Obwohl die Datenstruktur einen Größenwert von 16 speichern könnte, was genau dem Größenwert im den Stapel vergrößernden Befehl entspricht, wie in diesen Beispieldaten ist 32 Bits breit (4 Byte), wird der Größenwert in Befehlen immer ein Vielfaches von 4 sein (und somit wird ein Teilsatz der Bits im Größenwert konstant sein und nicht gespeichert werden müssen). In diesem Beispiel ist N = 4, da es in der Datenstruktur Platz für vier Einträge gibt. Es versteht sich, dass diese Größe und Format der Datenstruktur lediglich als Beispiel dient und die Datenstruktur in anderen Beispielen, wobei sie dieselben Datenpaare (Register-ID und Größenwert) enthält, anders ausgelegt sein kann.
  • Der Speicherplatz (z. B. Speicher oder Flipflops), der für die Datenstruktur erforderlich ist, hängt vom Wert von N und der Anzahl von Bits, die erforderlich sind, um sowohl die Register-ID (z. B. 4 oder 6 Bits) als auch den Größenwert (z. B. 4 oder 6 Bits) zu speichern, ab. In manchen Beispielen ist N = 1, was zu einer Datenstruktur führt, die nur sehr geringen Speicherplatz benötigt. In anderen Beispielen ist jedoch N > 1, beispielsweise um wie unten beschrieben geschachtelte Funktionen zu ermöglichen.
  • Nachdem ein den Stapel vergrößernder Befehl gesehen wurde (in Block 602), kann ein den Stapel schrumpfender Befehl gesehen werden (Block 606), der beispielsweise die Folge des Zurückkehrens nach einer Funktion (d. h. das Verlassen einer Funktion) sein kann. Dieser Befehl kann beispielsweise die folgende Form annehmen:
    ADD P9 P8 16
    wobei P9 die ID des neuen physischen Registers ist, das dem Stapelzeiger zugewiesen wurde und wo der neue Stapelzeigerwert zu speichern ist, P8 die ID des physischen Registers ist, das derzeit dem Stapelzeiger zugewiesen ist (und somit den Stapelzeigerwert enthält, bevor die Daten aus dem Stapel entfernt werden), und 16 die Abnahme in der Stapelgröße ist.
  • In Reaktion auf ein Detektieren eines den Stapel schrumpfenden Befehls (in Block 606) wird der Größenwert in diesem Befehl mit dem/den in der Datenstruktur gespeicherten Größenwert(en) verglichen (Block 608). Für die Zwecke der vorliegenden Erklärung wird der Größenwert im Befehl mit dem Größenwert im obersten Eintrag in der Datenstruktur (d. h. dem zuletzt hinzugefügten Eintrag in der Datenstruktur) verglichen.
  • Bezugnehmend auf die oben gezeigte beispielhafte Datenstruktur ist offensichtlich, dass die Größenwerte in diesem Beispiel einander entsprechen (,Ja' in Block 608), da der gespeicherte Wert 4 einer Veränderung der Stapelgröße von 16 entspricht (da aus oben angeführten Gründen der in diesem Beispiel in der Datenstruktur gespeicherte Wert durch die Änderung in der Stapelgröße geteilt durch 4 gegeben wird). In Reaktion auf ein Detektieren der Entsprechung oder des Übereinstimmens (,Ja' in Block 608) wird die Registerumbenennungstabelle aktualisiert, um zu zeigen, dass das neue physische Register, das dem Stapelzeigerwert zugewiesen wurde, der gespeicherten Register-ID entspricht (Block 610), z. B. P2 im obigen Beispiel, und das im den Stapel schrumpfenden Befehl identifizierte physische Register (P9 im obigen Beispiel) nicht benutzt wird. Es ist folglich nicht nötig, die Berechnung durchzuführen, um den neuen Wert des Stapelzeigers zu errechnen (da er bereits im in der Datenstruktur identifizierten physischen Register gespeichert ist, z. B. P2 im obigen Beispiel), was einen ALU-Vorgang spart und RAW-Risiken bricht (was eine größere Ausführung außerhalb der Reihenfolge erlaubt). Zusätzlich dazu kann das physische Register, das im den Stapel schrumpfenden Befehl identifiziert wird (z. B. P9 im obigen Beispiel), für einen anderen Zweck verwendet werden (z. B. kann es auf einer Liste der freien Register verbleiben, wenn eine solche Liste geführt wird. Der Eintrag aus der Datenstruktur, der den entsprechenden Größenwert enthält, wird aus der Datenstruktur entfernt (Block 612), was im obigen Beispiel die Datenstruktur leer lässt.
  • Im obigen Beispiel umfasste der den Stapel schrumpfende Befehl (der in Block 606 identifiziert wurde) einen Größenwert, der einem oberen Eintrag in der Datenstruktur entspricht (,Ja' in Block 608). Wenn jedoch der den Stapel schrumpfende Befehl wie folgt war:
    ADD P9 P8 24
    dann entsprechen sich die Größenwerte nicht (,Nein' in Block 608, da 24/4 = 6 und 6 ≠ 4). Wenn es keine Entsprechung gibt, werden alle Einträge in der Datenstruktur entfernt (so dass die Datenstruktur leer ist) und der den Stapel schrumpfende Befehl wird auf normalem Wege ausgeführt.
  • Wie aus der obigen Beschreibung hervorgeht, stellt der zwischen den Dateneinträgen in der Datenstruktur und dem den Stapel schrumpfenden Befehl durchgeführte Vergleich sicher, dass eine Vorhersage nur gemacht wird, wenn sie korrekt sein wird (d. h. wenn sich die Größenwerte entsprechen) und dass keine Vorhersage des Stapelzeigerwerts in anderen Situationen (d. h. wenn die Größenwerte nicht entsprechen) gemacht wird.
  • In dem gerade beschriebenen Beispiel wird der den Stapel schrumpfende Befehl mit dem obersten Eintrag in der Datenstruktur verglichen, jedoch kann in anderen unten beschriebenen Beispielen der Vergleich auch andere Einträge in der Datenstruktur umfassen.
  • In verschiedenen Beispielen kann eine niederschwellige Steuerung der physischen Register verwendet werden, um sicherzustellen, dass die ursprünglichen physischen Register (die im Vorhersagestapel referenziert sind) nicht invalidiert werden, während sie im Vorhersagestapel referenziert werden. Ein beispielhaftes Verfahren wäre, eine Art Seitenband dem stapelvergrößernden Befehl mitzugeben, so dass die Logik, die physische Register später freigibt/invalidiert, das physische Register, das den im Vorhersagestapel referenzierten Stapelzeiger hält, nicht freigibt. In einem anderen beispielhaften Verfahren signalisiert die Logik, die den Vorhersagestapel verwaltet (z. B. das in 8 gezeigte Stapelzeigerwertvorhersagemodul 820), welche Register in Verwendung sind, so dass die Freigabe-/Invalidierungs-Logik sie nicht freigibt/invalidiert. Sobald die Einträge, die die entsprechende Register-ID enthalten, aus dem Vorhersagestapel gelöscht werden, können die physischen Register invalidiert/wiederverwendet etc. werden.
  • Da physische Register, die im Vorhersagestapel referenziert sind, nicht invalidiert werden, können zusätzliche physische Register erforderlich sein, wobei die Mindestanzahl an physischen Registern eins plus der Summe der Anzahl an Architekturregistern entspricht, der Höchstanzahl an physischen Registern, die im Vorhersagestapel referenziert sein können (die gleich N ist). Üblicherweise weist ein Prozessor jedoch viel mehr physische Register als dieser Mindestwert auf.
  • Im oben beschriebenen Beispiel folgte der den Stapel schrumpfende Befehl (gesehen in Block 606) auf den den Stapel vergrößernden Befehl (gesehen in Block 602), ohne dass dazwischen andere Daten zum Stapel hinzugefügt und/oder von diesem entfernt wurden. In manchen Beispielen, zum Beispiel für verschachtelte Funktionen, können Daten mehr als einmal zum Stapel hinzugefügt werden, bevor überhaupt Daten aus dem Stapel entfernt werden und dies kann in einem anderen Beispiel beschrieben werden, das mit Bezug auf 7 beschrieben werden kann.
  • In diesem Beispiel wird ein erster den Stapel vergrößernder Befehl gesehen (in Block 602):
    SUB P8 P2 16
  • Und somit wird, wie oben beschrieben, die den derzeitigen Stapelzeiger speichernde Register-ID (P2) in der Datenstruktur gespeichert (in Block 604) gemeinsam mit dem Größenwert (16/4 = 4):
    P2 4
  • Wie im ersten beispielhaften Stapel 701 in 7 gezeigt, werden vier Datenelemente dem Stapel hinzugefügt (wie durch Pfeil 71 angegeben) und der Stapelzeiger wird vom Pfeil 706 entsprechenden Ursprungswert (wie im physischen Register P2 gespeichert) auf einen Pfeil 708 entsprechenden neuen Wert, der im physischen Register P8 gespeichert ist, aktualisiert.
  • Der nächste gesehene Befehl, der den Stapel manipuliert (d. h. vergrößert oder schrumpft) kann beispielsweise ein weiterer Befehl, der den Stapel vergrößert (wie in Block 602 gesehen), sein, wie durch den gepunkteten Pfeil von Block 604 bis Block 602 in 6 angegeben. In diesem Beispiel kann der zweite Befehl, der den Stapel vergrößert, wie folgt sein:
    SUB P4 P8 8
  • Und so wird, wie oben beschrieben, die Register-ID des derzeitigen Stapelzeigers (P8) in der Datenstruktur gespeichert (in Block 604) zusammen mit dem Größenwert (8/4 = 2):
    P2 4
    P8 2
  • Dieser neue Eintrag gilt nun als oberster Eintrag in der Datenstruktur. Wie im zweiten Beispielstapel 702 in 7 gezeigt, werden zwei Datenelemente dem Stapel hinzugefügt (wie durch Pfeil 72 angedeutet) und der Stapelzeiger wird vom Pfeil 708 entsprechenden Wert (wie im physischen Register P8 gespeichert) auf einen Pfeil 710 entsprechenden neuen Wert, der im physischen Register P4 gespeichert ist, aktualisiert.
  • Danach kann ein den Stapel schrumpfender Befehl gesehen werden (in Block 606):
    ADD P3 P4 8
  • Dieser Größenwert (8) in diesem Befehl wird mit dem Größenwert im obersten Eintrag in der Datenstruktur verglichen (in Block 608) und es geht aus diesem Beispiel hervor, dass eine Entsprechung (,Ja' in Block 608, da 8/4 = 2 und 2 = 2) vorliegt. Folglich wird die Abbildung des den Stapelzeiger speichernden physischen Registers aktualisiert (in Block 610) auf die Register-ID im obersten Eintrag in der Datenstruktur (P8) und der oberste Eintrag wird aus der Datenstruktur entfernt (in Block 612), wodurch Folgendes bleibt:
    P2 4
  • Wie im dritten Beispielstapel 703 in 7 gezeigt, werden zwei Datenelemente aus dem Stapel (wie durch Pfeil 73 dargestellt) entfernt und der Stapelzeiger wird vom Pfeil 710 entsprechenden Wert, wie im physischen Register P4 gespeichert, auf den Pfeil 708 entsprechenden Wert, der zuvor im physischen Register P8 gespeichert war, aktualisiert.
  • Der nächste gesehene Befehl, der den Stapel manipuliert (d. h. vergrößert oder schrumpft), kann beispielsweise ein weiterer Befehl sein, der den Stapel schrumpft (wie in Block 606 gesehen), wie durch den gepunkteten Pfeil von Block 612 bis Block 606 in 6 angedeutet. In diesem Beispiel kann der zweite Befehl, der den Stapel schrumpft, wie folgt sein:
    ADD P7 P8 16
  • Dieser Größenwert (16) in diesem Befehl wird mit dem Größenwert im obersten Eintrag der Datenstruktur verglichen (in Block 608) und aus diesem Beispiel geht hervor, dass eine Entsprechung vorliegt (,Ja' in Block 608, weil 16/4 = 4 und 4 = 4). Folglich wird die Abbildung des den Stapelzeiger speichernden physischen Registers auf die Register-ID (P2) im obersten Eintrag in der Datenstruktur aktualisiert (in Block 610) und der oberste Eintrag wird aus der Datenstruktur entfernt (in Block 612), was eine leere Datenstruktur lässt.
  • Wie im vierten Beispielstapel 704 in 7 gezeigt, werden vier Datenelemente aus dem Stapel entfernt (wie durch Pfeil 74 angedeutet) und der Stapelzeiger wird vom Pfeil 708 entsprechenden Wert, wie im physischen Register P8 gespeichert, auf den Pfeil 706 entsprechenden Wert, der zuvor im physischen Register P2 gespeichert war, aktualisiert.
  • Dieses Beispiel, in dem mehrere den Stapel vergrößernde Befehle gefolgt von mehreren den Stapel schrumpfenden Befehlen vorliegen, kann beispielsweise verschachtelten Funktionen entsprechen, in denen beispielsweise in der Befehlssequenz:
    SUB P8 P2 16
    SUB P4 P8 8
    ADD P3 P4 8
    ADD P7 P8 16
    das äußere Befehlspaar einer ersten Funktion entspricht und das innere Befehlspaar einer zweiten Funktion entspricht, die innerhalb der ersten Funktion verschachtelt ist.
  • Wenn es viele verschachtelte Funktionen innerhalb anderer Funktionen gibt, sind die hier beschriebenen Funktionen nach wie vor anwendbar; jedoch können sie einen höheren Wert für N (d. h. eine größere Tiefe der Datenstruktur) erfordern, so dass mehr Einträge gespeichert werden können, ohne dass der Platz ausgeht. Im oben beschriebenen Beispiel muss der Wert von N gleich 2 sein oder 2 übersteigen, so dass die Datenstruktur nicht überläuft.
  • In Beispielen, in denen Funktionsaufrufe ausreichend tief verschachtelt sind, um den Vorhersagestapel überlaufen zu lassen (z. B. N ist zu klein für den verwendeten Verschachtelungsgrad), geht die älteste Information im Vorhersagestapel verloren (und ihre Gegenstücke werden nicht vorhergesagt); jedoch wird die jüngste Information überleben und die Vorhersagen, die getroffen werden, werden weiterhin korrekt sein.
  • 8 zeigt eine schematische Darstellung eines beispielhaften Außer-der-Reihenfolge-Prozessors 800, in dem die hier beschriebenen Verfahren implementiert werden können. In diesem Beispiel ist der Prozessor 800 ein Einzel-Thread-Prozessor, die Verfahren sind jedoch auch auf Multi-Thread-Prozessoren anwendbar (wobei jeder Thread einen getrennten Stapel mittels getrennter Stapelzeiger pflegen würde).
  • Der Prozessor 800 umfasst eine Abrufstufe 302, eine Dekodier- und Umbenennungsstufe 304, einen Reorganisationspuffer 306, eine Übergabestufe 308, eine oder mehrere Funktionseinheiten 310, 812, die jeweils eine oder mehrere Ausführungspipelines und Caches/Speicher 814 umfassen. Der Prozessor 800 umfasst ferner einen Registerspeicher (RF) 816 und eine Registerumbenennungsübersicht 312, die von der Dekodier- und Umbenennungsstufe 304 (oder von einem Registerumbenennungsmodul 314 innerhalb der Dekodier- und Umbenennungsstufe 304) verwaltet wird.
  • Die Abrufstufe 302 ist dazu ausgelegt, Befehle aus einem Programm (in Programmreihenfolge), wie durch einen Programmzähler (PC) angegeben, abzurufen. Sobald ein Befehl abgerufen wurde, wird er der Dekodier- und Umbenennungsstufe 304 bereitgestellt, die dazu ausgelegt ist, die Befehle zu interpretieren und die Registerumbenennung durchzuführen. Insbesondere kann jeder Befehl eine Register-Schreiboperation; eine oder mehrere Register-Leseoperationen; und/oder eine arithmetische oder logische Funktion umfassen. Eine Register-Schreiboperation schreibt in ein Zielregister und eine Register-Leseoperation liest aus einem Quellregister. Während der Registerumbenennung wird jedes in einem Befehl referenzierte Architekturregister (z. B. jedes Quell- und Zielregister) durch ein physisches Register ersetzt (oder umbenannt).
  • Für Register-Schreiboperationen wird dem referenzierten Architekturregister (z. B. Zielregister) ein ungenutztes (oder verfügbares) physisches Register zugewiesen. Jede Zuweisung kann in der Registerumbenennungstabelle 312 gespeichert werden, wobei die Registerumbenennungstabelle 312 eine Datenstruktur ist, die die Übersicht zwischen jedem Architekturregister und dem physischen Register, das dem Befehl im Programmfluss zugewiesen ist, zeigt. Für Register-Leseoperationen kann das korrekte physische Register für ein bestimmtes Architekturregister (z. B. Quellregister) aus einem vom Architekturregister indexierten Eintrag in der Registerumbenennungstabelle 312 bestimmt werden.
  • Die oben mit Bezug auf 6 und 7 beschriebenen Verfahren können innerhalb der Dekodier- und Umbenennungsstufe 304 implementiert werden und in einem Beispiel kann die Dekodier- und Umbenennungsstufe 304 ein Stapelzeigerwertvorhersagemodul 820, das das in 7 gezeigte und oben beschriebene Verfahren durchführt, umfassen. Wie oben beschrieben verwaltet dieses Modul 820 (oder die Dekodier- und Umbenennungsstufe 304) eine Datenstruktur, die hier als Vorhersagestapel 822 bezeichnet wird.
  • Nachdem ein Befehl durch die Dekodier- und Umbenennungsstufe 304 hindurchtritt, wird er in einen Reorganisationspuffer 306 (ROB) eingefügt und an eine Funktionseinheit 310, 812 zur Ausführung versandt. Die Funktionseinheit 310, 812, an die der Befehl versandt wird, kann auf der Art des Befehls basieren. Der Reorganisationspuffer 306 ist ein Puffer, der ermöglicht, dass die Befehle außerhalb der Reihenfolge ausgeführt, aber in der Reihenfolge übergeben werden. Der Reorganisationspuffer 406 hält die Befehle, die in ihn eingefügt werden, in der Programmreihenfolge, aber innerhalb des ROB 306 können die Befehle von den Funktionseinheiten 310, 812 außer Sequenz ausgeführt werden. In manchen Beispielen kann der Reorganisationspuffer 306 als ringförmiger Puffer mit einem Kopfteil, der auf den ältesten Befehl im ROB 306 zeigt, und mit einem Endteil, der auf den jüngsten Befehl im ROB 306 zeigt, ausgebildet sein. Befehle werden in Programmreihenfolge vom Reorganisationspuffer 306 an die Übergabestufe 308 ausgegeben. In anderen Worten, ein Befehl wird vom Kopfteil des ROB 306 ausgegeben, wenn dieser Befehl ausgeführt wurde, und der Kopfteil des ROB 306 wird auf den nächsten Befehl im ROB 306 inkrementiert. Vom Reorganisationspuffer 306 ausgegebene Befehle werden einer Übergabestufe 308 bereitgestellt, die die Ergebnisse der Befehle an das Register/den Speicher übergibt.
  • Jede Funktionseinheit 310, 812 ist verantwortlich für die Ausführung von Befehlen und kann für die Ausführung spezieller Befehlsarten ausgelegt sein. Beispielsweise können die Funktionseinheiten 310 eine oder mehrere einer Integer-Einheit, einer Gleitkommaeinheit (FPU), einer digitalen Signalverarbeitungs-(DSP-)/Single-Instruction-Multiple-Data-(SIMD-)Einheit oder einer Multiply-Accumulate-(MAC-)Einheit umfassen. Die Lade-Speicher-Einheit 812 liest die Daten aus und schreibt Daten in den L1 Cache und den dahinterliegenden Speicher. In manchen Beispielen kann die Lade-Speicher-Einheit Adressen berechnen und kann (gegebenenfalls) den L1-Cache enthalten und die Daten-/Marker-RAM-Suchen durchführen. Eine Integereinheit führt Integerbefehle durch, eine FPU führt Gleitkommabefehle aus, eine DSP/SIMD-Einheit weist mehrere Verarbeitungselemente, die dieselbe Operation auf mehreren Datenpunkten gleichzeitig ausführen, auf und eine MAC-Einheit berechnet das Produkt zweier Zahlen und addiert dieses Produkt zu einem Akkumulator. Die Pipelines innerhalb der Funktionseinheiten können unterschiedliche Längen und/oder Komplexitäten aufweisen. Beispielsweise ist eine FPU-Pipeline üblicherweise länger als eine Integerausführungspipeline, da sie allgemein kompliziertere Operationen durchführt.
  • Während der Ausführung der von der Dekodier- und Umbenennungsstufe 304 empfangenen Befehle führt jede Funktionseinheit 310, 812 Lese- und Schreibvorgänge in physische Register in einem oder mehreren gemeinsam benutzten Registerspeichern 816 durch.
  • Der Prozessor kann auch andere als die in 8 gezeigten Funktionselemente umfassen. Beispielsweise kann der Prozessor einen Abzweigungsprädiktor umfassen, der für das Vorhersagen, welche Richtung der Programmfluss einschlagen wird, ausgelegt ist, falls von Befehlen bekannt ist, dass sie mögliche Flussveränderungen verursachen, wie etwa Zweigbefehlen. Abzweigungsvorhersage ist nützlich, da sie ermöglicht, dass Befehle spekulativ vom Prozessor 800 ausgeführt werden, bevor das Ergebnis des Abzweigungsbefehls bekannt ist. Wenn der Abzweigungsprädiktor den Programmfluss richtig vorhersagt, verbessert dies das Leistungsverhalten des Prozessors 800. Jedoch wenn der Abzweigungsprädiktor die Abzweigungsrichtung inkorrekt vorhersagt, tritt eine Fehlvorhersage auf, die korrigiert werden muss, bevor das Programm fortsetzen kann. Um eine Fehlvorhersage zu korrigieren, werden die an den ROB 306 gesendeten spekulativen Befehle verworfen und die Abrufstufe 302 beginnt, Befehle vom korrekten Programmzweig abzurufen.
  • Es versteht sich, dass andere Prozessoren möglicherweise nicht alle in 8 gezeigten Funktionselemente aufweisen (d. h. eines oder mehrere der in 8 gezeigten Funktionselemente können weggelassen werden) und in einigen Beispielen zusätzliche Funktionselemente umfassen können, die in 8 nicht gezeigt sind.
  • Zusätzlich zum Vorhersagestapel 822, der von der Dekodier- und Umbenennungsstufe 304 verwaltet wird, kann in manchen Beispielen eine weitere neue Datenstruktur, die von der Lade-Speicher-Einheit 812 verwaltet wird, vorliegen. Diese neue Datenstruktur, die hier als Stapelzeiger-Cache bezeichnet werden kann, speichert physische Register-IDs von Stapelzeigern zusammen mit dem tatsächlichen Stapelzeigerwert (wie im entsprechenden physischen Register gespeichert). In verschiedenen Beispielen speichert der Stapelzeiger-Cache die letzten M physischen Register-IDs von Stapelzeigern zusammen mit den entsprechenden Stapelzeigerwerten und in manchen Beispielen ist M = N.
  • 9 ist ein Flussdiagramm eines beispielhaften Verfahrens der Stapelzeigerwertzwischenspeicherung, die von der Lade-Speicher-Einheit 812 implementiert wird und in Kombination mit dem in 6 gezeigten Verfahren eingesetzt werden kann, welches von der Dekodier- und Umbenennungsstufe 304 implementiert ist, oder unabhängig von dem in 6 gezeigten Verfahren eingesetzt werden kann. Wie in 9 gezeigt wird, wenn eine Änderung des Stapelzeigers beispielsweise von der Dekodier- und Umbenennungsstufe 304, die die Lade-Speicher-Einheit 812 benachrichtigt, detektiert wird (Block 902), wird die derzeitige physische Register-ID des Stapelzeigers gemeinsam mit dem Wert des Stapelzeigers im Stapelzeiger-Cache gespeichert (Block 908). Es versteht sich, dass dies auf eine Reihe von Arten implementiert werden kann, beispielsweise können die neue physische Register-ID und der Wert unmittelbar nach einer Änderung im Stapelzeiger gespeichert werden oder alternativ dazu kann die alte physische Register-ID und der Wert unmittelbar vor einer Veränderung gespeichert werden. In verschiedenen Beispielen kann das Speichern der physischen Register-ID 6 Speicherbits verwenden und der Wert des Stapelzeigers kann 32 Bits verwenden.
  • Wenn die Größe des Stapelzeiger-Caches beschränkt ist, kann er dazu ausgelegt sein, M Datenpaare zu speichern (wobei das Paar eine physische Register-ID und einen Stapelzeigerwert umfasst). Wenn die Größe beschränkt ist, kann das Speichern eines neuen Datenpaares erfordern, dass das älteste gespeicherte Datenpaar verworfen wird (Block 906), falls es keinen Platz gibt, um den neuen Wert zu speichern (,Ja' in Block 904).
  • Wenn eine physische Register-ID in die „Liste der freien Register” verschoben wird (z. B. in der Dekodier- und Umbenennungsstufe 304), werden entsprechende Einträge im Stapelzeiger-Cache entfernt (Block 910).
  • Durch Speichern der physischen Register-IDs und Werte kennt die Lade-Speicher-Einheit bereits den Wert des Stapelzeigers, wenn sie unter Verwendung des entsprechenden physischen Registers in der Adresse einen Befehl zum Laden/Speichern empfängt und dies eliminiert die Notwendigkeit, einen Registerspeicher-Lesevorgang durchzuführen (was einen Registerspeicher-Leseanschluss erfordert). Durch das Zwischenspeichern des Werts des Stapelzeigers ist es möglich, Adressen zu berechnen (häufig Stapelzeiger plus unmittelbarer Offset), ohne einen Leseport zu erfordern. Dies bedeutet, dass ein beschränkter ALU für diese Berechnung verwendet werden kann und dies macht andere Funktionseinheiten für andere Vorgänge frei.
  • Das Verfahren aus 9 kann durch Hinzufügen einer neuen Spalte in den Stapelzeiger-Cache erweitert werden, um einen Offset-Wert zu enthalten. Dieser Offset wäre der Offset vom Stapelzeiger (da im Speicher gespeicherte Variablen in einem fixierten Offset vom Stapelzeiger gespeichert werden). In dieser Situation, wenn eine Adresse für einen Lade-/Speichervorgang der Wert des Stapelzeigers plus einen Offset wäre (z. B. 'LD P20 [P2 + 8]), kann dann das physische Register und der Offset verwendet werden, um nachzusehen und zu detektieren, ob die vollständige 32-Bit-Adresse im Stapelzeiger-Cache zwischengespeichert ist.
  • In den oben beschriebenen Beispielen vergleicht der Vergleich (in Block 608 aus 6) den Größenwert im Befehl (gesehen in Block 606) mit dem obersten Eintrag im Vorhersagestapel. In anderen Beispielen kann der Vergleich jedoch mehr als einen Eintrag im Vorhersagestapel umfassen. Beispielsweise wenn zwei aufeinanderfolgende den Stapel manipulierende Befehle beide Daten zum Stapel hinzufügen:
    SUB P8 P2 16
    SUB P9 P8 8
  • Dies führt zu zwei Einträgen, die im Vorhersagestapel gespeichert werden:
    P2 4
    P8 2
  • Wenn danach ein den Stapel schrumpfender Befehl gesehen wird (in Block 606):
    ADD P7 P9 24
    würde ein Vergleich mit dem obersten Eintrag im Vorhersagestapel (in Block 608) nicht dazu führen, dass eine Entsprechung gefunden wird (6 ≠ 2); jedoch würde ein Vergleich mit den obersten zwei Einträgen zu einer Entsprechung führen (6 = 4 + 2) und so kann der Vergleichsvorgang (in Block 608) das Betrachten von mehr als einem Eintrag umfassen, wie in 10 gezeigt.
  • 10 ist ein Flussdiagramm eines beispielhaften Verfahrens zum Implementieren der Vergleichsoperation (Block 608 in 6), in dem ein Schwellenwert T der Anzahl an Einträgen, die im Größenvergleich verwendet werden können, vorliegt. Wenn die Größe im den Stapel schrumpfenden Befehl (gesehen in Block 606) nur mit dem obersten Eintrag im Vorhersagestapel verglichen wird, ist T = 1; jedoch wenn der Vergleich mehr als einen Eintrag im Vorhersagestapel umfassen kann, ist T > 1. Wie in 10 gezeigt beginnt der Vergleich mit einer Variable x = 1 und vergleicht die Größe im Schrumpfbefehl (von Block 606) mit dem obersten Eintrag im Vorhersagestapel (in einer ersten Wiederholung von Block 1002). Für T = 1 fährt das Verfahren wie oben beschrieben fort und wenn keine Entsprechung vorliegt, werden alle Einträge im Vorhersagestapel gelöscht (in Block 614). Wenn jedoch T > 1, dann gibt es eine oder mehrere Wiederholungen des Vergleichs, im Zuge derer die Größe im Schrumpfbefehl (von Block 606) mit der Summe von Größen von zunehmenden Anzahlen von Einträgen im Vorhersagestapel verglichen werden (wobei sich die Anzahl um einen Eintrag pro Wiederholung erhöht) bis entweder eine Entsprechung vorliegt (in welchem Fall das Verfahren bei Block 610 in 6 fortfährt), der Schwellenwert erreicht ist, ohne dass eine Entsprechung gefunden wird (in welchem Fall das Verfahren bei Block 614 in 6 fortfährt) oder alle Einträge im Vorhersagestapel verwendet wurden, ohne dass eine Entsprechung gefunden wurde (in welchem Fall das Verfahren wiederum bei Block 614 in 6 fortfährt).
  • Wenn mehrere Einträge in der Vorhersagetabelle im Vergleichsvorgang (in Block 608) verwendet werden, z. B. wie in 10 gezeigt, wird die Abbildung des Stapelzeigers unter Verwendung des am wenigsten kürzlich hinzugefügten (d. h. der älteste) aller im Vergleichsvorgang verwendeten Einträge (d. h. der älteste von x Einträgen, die verwendet wurden, um eine Entsprechung zu erreichen) aktualisiert (in Block 610) und alle Einträge, die zum Erreichen der Entsprechung verwendet wurden (d. h. alle x Einträge, die zu einem ,Ja' in Block 1002 führen) werden aus dem Vorhersagestapel entfernt (in Block 612).
  • Das Verfahren kann auch aktualisiert werden, um Fälle zu behandeln, in denen ein den Stapel schrumpfender Befehl den Vorgang einer festgelegten Anzahl von Einträgen im Vorhersagestapel nicht vollständig aufhebt, wie in 11 gezeigt. 11 ist ein repetitives Verfahren und eine Höchstanzahl von Wiederholungen kann spezifiziert werden. Beispielsweise wenn zwei aufeinanderfolgende den Stapel manipulierende Befehle beide Daten zum Stapel hinzufügen:
    SUB P8 P2 16
    SUB P9 P8 8
  • Dies führt dazu, dass zwei Einträge im Vorhersagestapel gespeichert werden:
    P2 4
    P8 2
  • Wenn danach ein den Stapel schrumpfender Befehl gesehen wird (in Block 606):
    ADD P7 P9 12
    würde ein Vergleich mit dem obersten Eintrag nicht zum Auffinden einer Entsprechung führen (,Nein' in Block 608, da 12/4 = 3 und 3 ≠ 2), aber (angenommen, dass die Höchstanzahl an Wiederholungen nicht erreicht wurde, ,Nein' in Block 1107) da die Größe einem Wert entspricht, der größer ist als die gespeicherte Größe (,Ja' in Block 1101, da 3 > 2), wird der oberste Eintrag im Vorhersagestapel entfernt (Block 1103) und die Größe des Schrumpfvorganges wird um zwei reduziert (d. h. um die Größe des gerade entfernten Eintrags), um eine schrumpfende Größe von 1 in diesem Beispiel zu ergeben.
  • In einer zweiten Wiederholung des Verfahrens (wiederum angenommen, dass die Höchstanzahl an Wiederholungen nicht erreicht wurde und es noch weitere Einträge im Vorhersagestapel gibt, ,Nein' in Block 1107), wird ein zweiter Vergleich durchgeführt (in Block 1101) zwischen der Größe des Schrumpfvorganges (wie in Block 1103 der vorhergehenden Wiederholung, 1 in diesem Beispiel, reduziert) und der gespeicherten Größe (4 in diesem Beispiel). Da in diesem Beispiel die aktualisierte Größe des Schrumpfvorganges kleiner als die gespeicherte Größe ist (,Nein' in Block 1101, da 1 < 4), wird der Schrumpfbefehl wie gewöhnlich ausführen gelassen (so dass in diesem bestimmten Beispiel der neue Stapelzeiger berechnet und in P7 gespeichert wird) und die Größe im neuen obersten Eintrag wird um die Größe des Schrumpfbefehls reduziert (Block 1105, z. B. ein Schrumpfen um 1 in diesem Beispiel, da der entfernte Eintrag den Wert 2 enthielt und 3 – 2 = 1), um eine Eintragsgröße von 3 zu ergeben. Dies führt dazu, dass ein Eintrag im Vorhersagestapel übrig bleibt:
    P2 3
  • Wenn nachfolgend ein den Stapel schrumpfender Befehl gesehen wird (in Block 606):
    ADD P6 P7 12
    würde ein Vergleich mit dem obersten Eintrag nun zum Auffinden einer Entsprechung führen (da 12/4 = 3 und 3 = 3). Folglich wird die Abbildung des den Stapelzeiger speichernden physischen Registers auf die Register-ID im obersten Eintrag in der Datenstruktur (P2) aktualisiert (in Block 610) und der oberste Eintrag wird aus der Datenstruktur entfernt (in Block 612), wodurch eine leere Datenstruktur zurück bleibt. Der den Stapel schrumpfende Befehl müsste nicht ausgeführt werden.
  • In Szenarien, in denen Prozessoren Speicher dynamisch zuweisen, können Daten als eine Folge der dynamischen Zuweisung zum Stapel hinzugefügt werden (was zu einer Änderung des Stapelzeigers führt), sowie Daten als eine Folge eines Funktionsaufrufs (wie oben beschrieben) zum Stapel hinzugefügt werden und folglich kann das oben mit Bezug auf 6 beschriebene Verfahren modifiziert werden und zwei Variationen sind in 12 und 13 gezeigt.
  • In der ersten beispielhaften Variation, gezeigt in 12, können Einträge weiterhin im Vorhersagestapel gespeichert werden, welche die Folge der dynamischen Speicherzuweisung (statt eines Funktionsaufrufs) sind, werden im Vorhersagestapel gekennzeichnet (in Block 604). Ein Beispiel eines solchen Befehls (z. B. wie in Block 602 gesehen) wäre SUB SP SP R5, anstatt SUB SP SP 8.
  • In einem Beispiel, wenn es zwei Daten zum Stapel hinzufügende Befehle gibt, die die Folge von Funktionsaufrufen sind, gefolgt von einem oder mehreren Daten zum Stapel hinzufügenden Befehlen, die die Folge dynamischer Speicherzuweisung sind, kann der Vorhersagestapel wie folgt aussehen:
    P2 4
    P8 4
    P9 0
  • In diesem Beispiel wird nur der erste in einer Sequenz von Befehlen, die Daten zum Stapel hinzufügen und die Erfolge dynamischer Speicherzuweisung sind, im Vorhersagestapel gespeichert (in Block 604).
  • Wenn danach ein den Stapel schrumpfender Befehl gesehen wird (in Block 606), wie etwa:
    ADD P7 P9 16
    berücksichtigt der Größenvergleich (in Block 1207) einen Eintrag vor einem mit derselben Stapelzeiger-Register-ID, wie im Befehl identifiziert (z. B. P9 in diesem Beispiel). In diesem Beispiel liegt eine Entsprechung vor (,Ja' in Block 1207, da der Eintrag vor dem, der P9 enthält, P8 ist, 4, 16/4 = 4 und 4 = 4) und folglich wird die Abbildung des Stapelzeigers auf die Register-ID P8 aktualisiert (in Block 610). All die Einträge an der Spitze des Vorhersagestapels bis zu und einschließlich dem Eintrag vor dem mit derselben Stapelzeiger-Register-ID wie der im Befehl identifizierten (z. B. P8, 4 im obigen Beispiel) werden dann entfernt (Block 1211). Im obigen Beispiel würde der Vorhersagestapel dann nur einen einzigen Eintrag enthalten:
    P2 4
  • Die zweite beispielhafte Variation, gezeigt in 13, umfasst das Detektieren von Befehlen, die sich auf einen Rahmenzeiger beziehen (was anzeigt, dass die Speicherzuweisung dynamisch durchgeführt wird). Wenn Speicher dynamisch zugewiesen wird, können sowohl ein Stapelzeiger als auch ein Rahmenzeiger eingesetzt werden. Im Gegensatz zu einem Stapelzeiger, der den Wert verändert, wenn Daten zum Stapel hinzugefügt oder daraus entfernt werden (und sich somit ändern kann während die Funktion läuft in Situationen, in denen Speicher dynamisch zugewiesen wird), kann der Rahmenzeiger verwendet werden, um auf eine fixierte Position im Stapel zu zeigen (für die Zeitdauer während eine Funktion läuft, wenn der Stapelzeiger für die dynamische Speicherzuweisung benötigt wird). Diese fixierte Position kann beispielsweise die Position sein, auf die der Stapelzeiger zeigen würde, wenn keine dynamische Zuweisung innerhalb der Funktion verwendet würde (d. h. die Speicherposition nach der letzten statisch zugewiesenen Speichersektion).
  • Wie in 13 gezeigt werden in dieser zweiten beispielhaften Variation Einträge zum Vorhersagestapel auf dieselbe Weise wie oben mit Bezug auf 6 hinzugefügt (in Blöcken 602 und 604); wenn jedoch ein Befehl, der einen Rahmenzeiger basierend auf dem Wert eines Stapelzeigers setzt, gesehen wird (Block 1305), z. B.:
    MOV FP SP
    was den Umbenennungsübersichtseintrag für FP durch das SP zugewiesene physische Register (P9 in diesem Beispiel) aktualisieren könnte, dann wird ein neuer Eintrag in den Vorhersagestapel hinzugefügt (Block 1306). In einem Beispiel kann der Vorhersagestapel vor dem Detektieren eines auf einen Rahmenzeiger bezogenen Befehls umfassen:
    P2 4
    P8 4
  • Nach dem Detektieren des Befehls, der einen Rahmenzeiger basierend auf einem Wert eines Stapelzeigers setzt (in Block 1305), kann der Vorhersagestapel umfassen:
    P2 4
    P8 4
    P9 0
    wobei der oberste Eintrag im Vorhersagestapel das dem Stapelzeiger zugewiesene derzeitige physische Register (P9 in diesem Beispiel) und einen Größenwert von null (da der Stapel nicht angewachsen ist) umfasst. Der Befehl MOV FP SP kann als ein Hinweis betrachtet werden, dass es bald zu einer dynamischen Zuweisung kommen wird (anstatt zu versuchen, die dynamische Zuweisung selbst zu detektieren).
  • Das Verfahren fährt dann auf ähnliche Weise wie das mit Bezug auf 12 beschriebene fort. Beispielsweise kann, wenn eine Reihe aufeinanderfolgender den Stapel vergrößernder Befehle vorliegt, der Vorhersagestapel Folgendes umfassen:
    P2 4
    P8 4
    P9 0
    P10 4
    P11 4
  • Die letzten Einträge im Vorhersagestapel können von statischen Zuweisungen von innerhalb einer verschachtelten Funktion stammen. Diese können auf normale Weise entfernt werden, wodurch der folgende Vorhersagestapel bleibt:
    P2 4
    P8 4
    P9 0
  • An diesem Punkt, wenn ein Schrumpfbefehl, der den Stapel vom Wert in P9 um 4 schrumpfen lässt, gesehen wird, z. B.
    ADD P12 P9, 16
    dann kann der Stapelzeiger auf P8 neu abgebildet werden (da P9 während der Ausführung von SUB P9 P8 16 das SP war), der Befehl kann fallen gelassen werden und die letzten 2 Einträge können vom Vorhersagestapel entfernt werden (in Block 1211), wodurch nur ein Eintrag übrig bleibt.
  • Es versteht sich, dass diese Variationen, obwohl die Beschreibung von 1213 sich nur auf den Vergleich mit einzelnen Einträgen im Vorhersagestapel bezieht, mit den in Bezug auf 1011 beschriebenen Variationen kombiniert werden können, z. B. so dass die Größe in einem den Stapel schrumpfenden Befehl (wie in Block 606 gesehen) mit mehr als einem Eintrag im Vorhersagestapel verglichen werden kann (In Block 608 oder 1207).
  • In einer weiteren Variation der 12 und 13 können Markierungen eingesetzt werden (in jedem Eintrag im Vorhersagestapel), um anzuzeigen, ob Befehle in Folge eines Funktionsaufrufs hinzugefügt wurden. In einem solchen Beispiel ist Block 1211 modifiziert, so dass alle markierten Einträge an der Spitze des Vorhersagestapels entfernt werden.
  • 14 ist ein Flussdiagramm eines Verfahrens, das bei Detektieren einer Unterbrechung verwendet wird (Block 1402), und dieses Verfahren kann in Kombination mit jedem der zuvor beschriebenen Verfahren verwendet werden. Wenn eine Unterbrechung auftritt, wird der Stapelzeiger in den Speicher gespeichert und dann bei Ende der Unterbrechung wiederhergestellt. Da die Unterbrechung den Wert des Stapelzeigers manipuliert haben kann, sind die im Vorhersagestapel gespeicherten Werte möglicherweise nicht länger gültig und somit wird der Vorhersagestapel gelöscht, um alle Einträge zu entfernen (Block 1404). Dies kann erweitert werden, um das Detektieren einer beliebigen Situation, in der der Stapelzeigerwert aus dem Speicher geladen wird, zu umfassen.
  • Die Verfahren sind oben in Bezug zu einem Registerumbenennung einsetzenden Prozessor beschrieben. Die Verfahren sind auch anwendbar, wenn keine Registerumbenennung verwendet wird; jedoch speichert der Vorhersagestapel in solchen Anwendungen den derzeitigen Stapelzeigerwert (vor dem Anwachsen des Stapels) zusammen mit einem Größenwert des Stapelwachstums (in Block 1504), wie in 15 gezeigt. Dies ist weniger wirksam als die Verwendung der Register-ID, weil der Stapelzeiger mehr Speicher benötigt (z. B. kann er ein 32-Bit-Wert sein). Das Verfahren fährt dann wie in 6 gezeigt und oben beschrieben fort, mit der Ausnahme, dass anstelle die Abbildung des Stapelzeigers zu aktualisieren (in Block 610), wenn es eine Entsprechung zwischen der Größe im Schrumpfbefehl (gesehen in Block 606) und einem gespeicherten Eintrag (oder Einträgen) im Vorhersagestapel (,Ja' in Block 608) gibt, der Stapelzeiger selbst auf den gespeicherten Wert aktualisiert wird (Block 1510). Es versteht sich, dass die oben mit Bezug auf 6 beschriebenen Variationen (z. B. wie in 1013 gezeigt) auch auf das in 15 gezeigte Verfahren anwendbar sind.
  • In den obigen Beispielen wird die Datenstruktur, die die Stapelzeiger-Register-ID und Größenwerte des Stapelwachstums (des Vorhersagestapels), als eine FILO-Struktur beschrieben. Es versteht sich jedoch, dass sie alternativ dazu unter Verwendung einer Cache-Struktur implementiert sein kann.
  • Obwohl die oben beschriebenen Verfahren die Vorhersage eines Stapelzeigerwerts betreffen, können die beschriebenen Verfahren auch verwendet werden, um einen Befehl, von dem vorhergesagt wird, dass er reversibel ist, zu detektieren, und wenn danach die Umkehrung dieses Befehls gesehen wird, kann das alte physische Register verwendet werden. In solchen Beispielen kann die Datenstruktur eine Cache-Struktur anstelle einer FILO verwenden, um Daten zu allen Funktionen, die umkehrbar sein können, zu speichern. Da Daten (z. B. physische Register-ID und konstanter Wert, obwohl es abhängig vom jeweiligen Vorgang andere Felder geben kann) für jeden Vorgang, der umkehrbar sein kann, gespeichert werden, anstatt nur von Befehlen, die danach umgekehrt werden, ist es notwendig, die gespeicherten Daten zu prüfen, die nicht der zuletzt gespeicherte Eintrag in der Datenstruktur sind.
  • Die hier beschriebenen Verfahren können mit Programmiersprachen mit Aufrufkonventionen, die denen von C ähnlich sind, verwendet werden (was die meisten Sprachen abdeckt), die einen Stapel im Speicher für die Speicherung innerhalb dieses Teils des Programmumfangs verwenden. Die Verfahren können für die Verwendung mit anderen Sprachen modifiziert werden.
  • Durch das Kombinieren der Verfahren des Vorhersagens von stapelgespeicherten Werten und der Verfahren des Vorhersagens des Stapelzeigers können die im stapelgespeicherten Wertspeicher gespeicherten Daten in mehreren Situationen zweckmäßig sein (d. h. es kann mehrere Situationen geben, in denen entsprechende Einträge im stapelgespeicherten Wertspeicher gefunden werden können) und somit kann es eine erhöhte Anzahl von Gelegenheiten geben, in denen die mit dem Laden eines Werts aus dem Speicher assoziierte Verzögerung vermieden werden kann.
  • Als eine Alternative zur Verwendung des oben mit Bezug auf 616 beschriebenen Verfahrens kann eine Stapelstruktur (anstelle des oben beschriebenen Vorhersagestapels) gespeichert werden, die nur die Offsets, um die der Stapel angewachsen ist, speichert (anstelle der physischen SP-Register-ID und des SP-Werts) und dies kann als der ,Offset-Stapel' bezeichnet werden. Wenn der Offset-Stapel verwendet wird, wird auch der stapelgespeicherte Wertvorhersagespeicher modifiziert, so dass anstelle die ID des den Stapelzeiger (PSP) speichernden physischen Registers zu speichern eine den obersten Eintrag des Offset-Stapels darstellende ID gespeichert wird. Dies reduziert den Speicher sowohl im Offset-Stapel (verglichen mit dem Vorhersagestapel) und dem stapelgespeicherten Variablenspeicher und ermöglicht das Einsetzen der oben mit Bezug auf die 15 beschriebenen Verfahren nach einem Funktionsaufruf, aber ermöglicht nicht die Vorhersage von Stapelzeigerwerten.
  • Bezugnehmend auf 2 umfasst der in der Datenstruktur gespeicherte Dateneintrag (in Block 204) in solch einer Implementierung die derzeitige ID des Offset-Stapels (IDOFF) gemeinsam mit der Register-ID des physischen Registers, das den Wert der Variable vor dem Speichern in den Stapel (P) und den Offset zum derzeitigen Stapelzeiger, an dem die Variable gespeichert ist (O), speichert. Wenn danach ein Befehl, der eine Variable mit Bezug auf den Stapelzeiger aus dem Stapel lädt, gesehen wird (in Block 206), wird der stapelgespeicherte Variablenspeicher durchsucht (in Block 208), um nach einem entsprechenden Eintrag zu suchen und in diesem Beispiel wird der entsprechende Eintrag bestimmt, indem der Offset, O, und die derzeitige ID des Offset-Stapels, IDOFF, verglichen werden. Wenn ein entsprechender Eintrag gefunden wird (,Ja' in Block 210), wird das im Ladebefehl (gesehen in 206) referenzierte Architekturregister auf die von P im entsprechenden Eintrag gegebene Register-ID abgebildet.
  • Die oben beschriebenen Verfahren können auch modifiziert werden, so dass sie für allgemeinere Lade-/Speichervorgänge eingesetzt werden können (d. h. Lade-/Speichervorgänge, die nicht direkt auf den Stapelzeiger bezogen sind). Wenn ein Zeiger für ein Datenelement in eine Funktion übernommen wird, wird es üblicherweise der Wert des Stapelzeigers (aus einer vorhergehenden Funktion) mit einem hinzugefügten Offset sein. Dies kann dann innerhalb der Funktion (für den Speicher- oder den Ladevorgang) verwendet werden.
  • In solch einer Variation der oben beschriebenen Verfahren werden Informationen, welche physischen Register bestimmte bekannte Offsets von einem physischen Register eines Stapelzeigers sind, gespeichert (z. B. in einem zu Block 204 in 2 äquivalenten Schritt) und diese Information kann dann verwendet werden, um eine Übereinstimmung zu detektieren (z. B. in einem zu Block 210 in 2 äquivalenten Schritt). Beispielsweise:
    ST P1 [P2 + #8] (P2 = SP)
    ADD P3 P2 8 (Zeiger auf Daten erzeugen)
    # Funktionsaufruf
    LD P4 [P3 + #0] (Tabelle nach P2,8 durchsuchen, da bekannt ist, dass P3 = P2 + 8)
  • Oder beim Herauskommen aus einer Funktion:
    ADD P3 P2 8 (Zeiger auf Daten erzeugen)
    # Funktionsaufruf
    ST P1 [P3 + #0] (zur Tabelle hinzufügen, da P2,8 wie bekannt ist P3 = P2 + 8)
    # Funktionsrückkehr
    LD P4 [P2 + #8] (Tabelle nach P2,8 durchsuchen)
  • In beiden Fällen wird unter Verwendung dieser Variation eine Übereinstimmung gefunden werden, obwohl sie unter Verwendung des oben beschriebenen Verfahrens nicht übereingestimmt hätten.
  • Obwohl die Verfahren oben mit Bezug auf einen Einzel-Prozessor, der nicht mehrere Threads aufweist, beschrieben wurden, sind die Verfahren auch auf Multi-Thread- und/oder Multi-Kern-Prozessoren anwendbar, da sie keinen Stapelplatz gemeinsam nutzen und somit die oben beschriebenen Verfahren für jeden Thread/Kern unabhängig durchgeführt werden können.
  • Die oben beschriebenen Verfahren beruhen alle auf der Verwendung der Registerumbenennung. Ein oben beschriebenes Verfahren umfasst das Speichern eines Dateneintrags (z. B. in Block 204), in dem die Elemente PSP, P und O dargestellt sind und dann das Durchsuchen dieser Dateneinträge durch PSP und O, um P zu finden. In einer Variation davon (oben beschrieben) kann der Dateneintrag Elemente IDOFF, P und O darstellen und dann können diese Dateneinträge von der Offset-ID (IDOFF) und O durchsucht werden, um P zu finden. Jedoch können die Verfahren modifiziert werden, um ohne Registerumbenennung verwendbar zu sein. Insbesondere, anstatt das physische Register, P, in Block 204 in 2 zu speichern, wird der Wert des Registers, V, stattdessen gespeichert und anstatt die dem Stapelzeiger (PSP) entsprechende Register-ID zu speichern, kann der oben beschriebene Offset-Stapel verwendet werden und der Wert von IDOFF gespeichert oder der Wert des Stapelzeigers VSP kann gespeichert werden. Beim Durchsuchen nach einem entsprechenden Eintrag (z. B. in Block 208 in 2) werden die Dateneinträge entweder vom Wert des Stapelzeigers (VSP) und O oder der Offset-ID (IDOFF) und O durchsucht, um V (anstatt P) zu finden, und dieser Wert V wird verwendet, um ein die Variable speicherndes Register zu aktualisieren (z. B. in einem Block 212 in 2 entsprechenden Block).
  • Es ist offensichtlich, dass ungeachtet der Verwendung von Registerumbenennung das Verfahren den Effektivwert eines Architekturregisters unter Verwendung der im entsprechenden Eintrag im stapelgespeicherten Variablenspeicher gespeicherten Information aktualisiert. Wenn Registerumbenennung verwendet wird, wird der Effektivwert eines Architekturregisters aktualisiert, indem die Registerumbenennungsübersicht aktualisiert wird (in Block 212), und wenn keine Registerumbenennung verwendet wird, wird der Effektivwert eines Architekturregisters aktualisiert, indem der Wert (vom entsprechenden Eintrag im stapelgespeicherten Variablenspeicher) in ein Register geschrieben wird.
  • Der Begriff ,Prozessor' und ,Computer' wie hier verwendet, bezeichnet jede Vorrichtung, oder Teil davon, mit einer Verarbeitungsfähigkeit, so dass sie Befehle ausführen kann. Der Begriff ,Prozessor' kann beispielsweise zentrale Prozessoreinheiten (CPUs), Graphikprozessoren (GPUs oder VPUs), Physikbeschleuniger (PPUs), digitale Signalprozessoren (DSPs), Mikroprozessoren etc. umfassen. Fachleute auf dem Gebiet der Erfindung werden erkennen, dass solche Verarbeitungsfähigkeiten in viele verschiedene Vorrichtungen integriert sind und der Begriff ,Computer' somit Set-Top-Boxen, Medienabspielgeräte, digitale Radios, PCs, Server, Mobiltelefone, persönliche Taschencomputer und viele andere Vorrichtungen umfasst.
  • Fachleute auf dem Gebiet der Erfindung werden erkennen, dass Speichervorrichtungen, die zum Speichern von Programmbefehlen verwendet werden, über ein Netzwerk verteilt werden können. Beispielsweise kann ein dezentraler Computer ein Beispiel des als Software beschriebenen Prozesses speichern. Ein lokaler Computer oder Terminalcomputer kann auf den dezentralen Computer zugreifen und einen Teil oder die gesamte Software zum Betreiben des Programms herunterladen. Alternativ dazu kann der lokale Computer Teile der Software nach Bedarf herunterladen oder manche Softwarebefehle am lokalen Terminal ausführen und manche am dezentralen Computer (oder im Computernetzwerk). Fachleute auf dem Gebiet der Erfindung werden auch erkennen, dass durch den Einsatz herkömmlicher Verfahren, die Fachleuten auf dem Gebiet der Erfindung bekannt sind, alle oder ein Teil der Softwarebefehle von einer zweckgewidmeten Schaltung, wie etwa einem DSP, einer programmierbaren Logik-Anordnung oder dergleichen, ausgeführt werden können.
  • Speicher, die maschinenausführbare Daten für die Verwendung in der Implementierung offenbarter Aspekte speichern, können permanente Speicher sein. Permanente Speicher können flüchtig oder nicht-flüchtig sein. Beispiele für flüchtige permanente Speichermedien umfassen halbleiterbasierte Speicher, wie etwa SRAM oder DRAM. Beispiele für Technologien, die zum Implementieren nicht-flüchtiger Speicher verwendet werden können, umfassen optische und magnetische Speichertechnologien, Flash-Speicher, Phasenwechselspeicher, resistives RAM.
  • Ein spezieller Bezug auf „Logik” betrifft eine Struktur, die eine Funktion oder Funktionen durchführt. Ein Beispiel für Logik umfasst eine Schaltung, die zum Durchführen dieser Funktion(en) ausgelegt ist. Beispielsweise kann eine solche Schaltung Transistoren und/oder andere in einem Herstellungsprozess verfügbare Hardware-Elemente umfassen. Solche Transistoren und/oder andere Elemente können verwendet werden, um eine Schaltung oder Strukturen auszubilden, die Speicher implementieren und/oder enthalten, wie etwa Register, Flipflops oder Zwischenspeicher, Logik-Operatoren, wie etwa Boolesche Operatoren, mathematische Operatoren, wie etwa Addierer, Multiplikatoren oder Schieberegister, und verbinden diese untereinander, beispielsweise. Solche Elemente können als benutzerdefinierte Schaltungen oder Standard-Zellbibliotheken, Makros oder auf anderen Abstraktionsstufen bereitgestellt sein. Solche Elemente können in einer speziellen Anordnung untereinander vernetzt sein. Logik kann Schaltungen mit festgelegter Funktion umfassen und Schaltungen können programmiert sein, um eine Funktion oder Funktionen durchzuführen; eine solche Programmierung kann durch ein Firmware- oder Software-Update oder einen Steuermechanismus bereitgestellt sein. Logik, die zum Durchführen einer Funktion identifiziert ist, kann auch Logik umfassen, die eine Komponentenfunktion oder einen Teilprozess implementiert. In einem Beispiel weist eine Hardware-Logik eine Schaltung auf, die eine festgelegte Funktionsoperation oder -operationen, eine Zustandsmaschine oder einen Prozess implementiert.
  • Jeder hier angeführte Bereich oder Vorrichtungswert kann erweitert oder geändert werden, ohne den gewünschten Effekt zu verlieren, wie Fachleuten auf dem Gebiet der Erfindung offensichtlich sein wird.
  • Es versteht sich, dass die oben beschriebenen Nutzen und Vorzüge eine Ausführungsform betreffen können oder mehrere Ausführungsformen betreffen können. Die Ausführungsformen sind nicht auf jene, die manche oder alle der genannten Probleme lösen, oder jene, die manche oder alle der genannten Nutzen und Vorzüge aufweisen, beschränkt.
  • Jeder Bezug auf ,ein' Element bezieht sich auf eines oder mehrere dieser Elemente. Der Begriff ,umfassend' bedeutet hier einschließlich der identifizierten Verfahrensblöcke oder Elemente, aber dass solche Blöcke oder Elemente keine exklusive Liste darstellen und eine Vorrichtung zusätzliche Blöcke oder Elemente enthalten kann und ein Verfahren zusätzliche Vorgänge oder Elemente enthalten kann. Darüber hinaus sind die Blöcke, Elemente und Vorgänge selbst nicht implizit geschlossen.
  • Die Schritte der hier beschriebenen Verfahren können in jeder geeigneten Reihenfolge, oder gegebenenfalls gleichzeitig, durchgeführt werden. Die Pfeile zwischen den Boxen in den Figuren zeigen eine Beispielsequenz der Verfahrensschritte, aber sollen keine anderen Sequenzen oder die parallele Durchführung mehrerer Schritte ausschließen. Zusätzlich können einzelne Blöcke aus jedem der Verfahren gelöscht werden, ohne vom Wesen und Schutzbereich des hier beschriebenen Gegenstands abzuweichen. Aspekte eines beliebigen der oben beschriebenen Beispiele können mit Aspekten eines beliebigen der anderen beschriebenen Beispiele kombiniert werden, um weitere Beispiele zu bilden, ohne die gewünschte Wirkung zu verlieren. Wo die Elemente der Figuren als durch Pfeile verbunden dargestellt sind, versteht es sich, dass diese Pfeile nur einen beispielhaften Kommunikationsfluss (einschließlich Daten und Steuernachrichten) zwischen Elementen zeigen. Der Fluss zwischen den Elementen kann entweder in eine Richtung oder in beide Richtungen erfolgen.
  • Es versteht sich, dass die obige Beschreibung einer bevorzugten Ausführungsform lediglich als ein Beispiel angeführt wurde und dass verschiedene Modifikationen von Fachleuten auf dem Gebiet der Erfindung vorgenommen werden können. Obwohl verschiedene Ausführungsformen oben mit einem gewissen Grad der Genauigkeit oder mit Bezug auf eine oder mehrere einzelne Ausführungsformen beschrieben wurden, können Fachleute auf dem Gebiet der Erfindung zahlreiche Veränderungen an den offenbarten Ausführungsformen vornehmen, ohne vom Wesen oder Schutzbereich dieser Erfindung abzuweichen.

Claims (20)

  1. Verfahren zum Vorhersagen von Werten von Variablen, die in einem Stapel in einem Prozessor gespeichert sind, wobei der Stapel einen Stapelzeiger aufweist und das Verfahren umfasst: in Reaktion auf ein Detektieren eines Befehls, der eine Variable in den Stapel mit Bezug auf den Stapelzeiger (202) speichert, Speichern eines Dateneintrags in einer Datenstruktur, welcher eine eindeutige ID für den Stapelzeiger, einen den Wert der Variablen vor dem Speichern in den Stapel darstellenden Parameter und einen Offset zum Stapelzeiger, an dem die Variable gespeichert ist (204), umfasst; in Reaktion auf ein nachfolgendes Detektieren eines Befehls, der eine Variable mit Bezug auf den Stapelzeiger (206) aus dem Stapel lädt, Durchsuchen der Datenstruktur nach einem Eintrag, der dem detektierten Befehl (208) entspricht; und in Reaktion auf ein Auffinden eines entsprechenden Eintrags in der Datenstruktur (210), Aktualisieren eines Effektivwerts eines im detektierten Befehl referenzierten Architekturregisters unter Verwendung der im entsprechenden Eintrag gespeicherten Information (212).
  2. Verfahren nach Anspruch 1, wobei ein entsprechender Eintrag einen Offset und eine eindeutige ID für den Stapelzeiger, der einem Offset und einer Stapelzeigerinformation im detektierten Befehl entspricht, umfasst.
  3. Verfahren nach einem der vorangegangenen Ansprüche, ferner umfassend: in Reaktion auf ein Nicht-Auffinden eines entsprechenden Eintrags in der Datenstruktur (210), Ausführen des detektierten Befehls (214).
  4. Verfahren nach einem der vorangegangenen Ansprüche, wobei die eindeutige ID für den Stapelzeiger ein Identifikator ist, der bei jedem Anwachsen oder Schrumpfen des Stapels aktualisiert wird.
  5. Verfahren nach Anspruch 4, wobei der Parameter, der einen Wert der Variable vor dem Speichern in den Stapel darstellt, den Wert der Variable vor dem Speichern in den Stapel umfasst.
  6. Verfahren nach einem der Ansprüche 1–3, wobei die eindeutige ID für den Stapelzeiger eine Register-ID eines physischen Registers ist, das einen derzeitigen Wert des Stapelzeigers speichert.
  7. Verfahren nach Anspruch 6, wobei der Parameter, der einen Wert der Variable vor dem Speichern in den Stapel darstellt, eine Register-ID eines physischen Registers, das einen Wert der Variable vordem Speichern in den Stapel speichert, umfasst.
  8. Verfahren nach Anspruch 6 oder 7, wobei ein entsprechender Eintrag einen Offset, der dem Offset im detektierten Befehl entspricht, umfasst und ferner eine Register-ID eines physischen Registers, das den Wert des Stapelzeigers speichert, umfasst, welches dasselbe wie das den Wert des Stapelzeigers speichernde physische Register im detektierten Befehl ist.
  9. Verfahren nach einem der Ansprüche 6–8, wobei ein Aktualisieren eines Effektivwerts eines im detektierten Befehl referenzierten Architekturregisters mittels im entsprechenden Eintrag gespeicherter Information umfasst: Aktualisieren einer Registerumbenennungsübersicht, um ein im detektierten Befehl referenziertes Architekturregister auf die ID eines physischen Registers, das den Wert der Variable im entsprechenden Eintrag speichert, abzubilden.
  10. Verfahren nach einem der Ansprüche 6–9, ferner umfassend, nach dem Aktualisieren der Registerumbenennungsübersicht, um ein im detektierten Befehl referenziertes Architekturregister auf die ID des physischen Registers, das den Wert der Variablen im entsprechenden Eintrag (212) speichert, abzubilden: Ausführen des detektierten Befehls, um die Variable parallel zu der Ausführung anderer Befehle (404) aus dem Stapel (402) zu laden; Vergleichen des geladenen Werts und des Werts der im physischen Register gespeicherten Variablen, das im entsprechenden Eintrag (406) identifiziert wurde; und in Reaktion auf ein Detektieren einer Nicht-Übereinstimmung zwischen dem geladenen Wert und dem gespeicherten Wert, Rückabwickeln aller Befehle, die vom geladenen Wert abhängen und die parallel zum detektierten Befehl (408) ausgeführt wurden.
  11. Verfahren nach einem der Ansprüche 6–10, ferner umfassend: Entfernen aller einer Funktion entsprechenden Einträge aus der Datenstruktur bei Rückkehr von der Funktion.
  12. Verfahren nach einem der Ansprüche 6–11, wobei das Speichern des Dateneintrags in der Datenstruktur ein Speichern des Dateneintrags in der Datenstruktur umfasst, wobei die Datenstruktur indexiert ist durch: ein oder mehrere Bits vom Offset; einen Teilsatz der Bits vom Offset; die Register-ID eines physischen Registers, das den derzeitigen Wert des Stapelzeigers speichert; oder einen Indexwert, der unter Verwendung einer Hash-Funktion erzeugt wurde, um eines oder mehrere Bits von jedem des Offsets und der Register-ID eines den derzeitigen Wert des Stapelzeigers speichernden physischen Registers zu kombinieren.
  13. Verfahren nach einem der vorangegangenen Ansprüche, wobei das Verfahren ferner umfasst: in Reaktion auf ein Detektieren eines den Stapel vergrößernden Befehls (602), Speichern eines Dateneintrags in einer Datenstruktur, welcher einen Größenwert, der einem Betrag, um den der Befehl den Stapel vergrößert, entspricht, und wenigstens eines umfasst aus: einer Register-ID eines physischen Registers, das einen Wert des Stapelzeigers, bevor der Befehl den Stapel vergrößert, speichert (104); und dem Wert des Stapelzeigers, bevor der Befehl den Stapel vergrößert (1504); und in Reaktion auf ein nachfolgendes Detektieren eines den Stapel schrumpfenden Befehls (606), Vergleichen eines Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem oder mehreren gespeicherten Größenwerten in der Datenstruktur (608); in Reaktion auf ein Detektieren einer Entsprechung zwischen dem Größenwert, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, und einem oder mehreren gespeicherten Größenwerten, Aktualisieren des Stapelzeigers basierend auf Dateneinträgen, die den einen oder die mehreren beim Vergleich verwendeten gespeicherten Größenwerte umfassen (610, 1510), und Entfernen der Dateneinträge, die den einen oder die mehreren beim Vergleich verwendeten gespeicherten Größenwerte umfassen, aus der Datenstruktur (612); und in Reaktion auf ein Nicht-Detektieren einer Entsprechung zwischen dem Größenwert, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, und einem oder mehreren gespeicherten Größenwerten, Entfernen aller Einträge aus der Datenstruktur (614).
  14. Verfahren nach Anspruch 13, wobei jeder gespeicherte Dateneintrag umfasst: einen Größenwert, der einem Betrag entspricht, um den ein Befehl den Stapel vergrößert, und eine Register-ID eines physischen Registers, das einen Wert des Stapelzeigers, bevor der Befehl den Stapel vergrößert, speichert; oder einen Größenwert, der einem Betrag entspricht, um den ein Befehl den Stapel vergrößert, und einen Wert des Stapelzeigers, bevor der Befehl den Stapel vergrößert.
  15. Verfahren nach Anspruch 13 oder 14, wobei das Vergleichen eines Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem oder mehreren in der Datenstruktur gespeicherten Größenwerten umfasst: Vergleichen eines Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem Größenwert in einem einzigen jüngsten Eintrag in der Datenstruktur; oder umfasst: Vergleichen eines Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem Größenwert in einem Eintrag in der Datenstruktur vor einem Eintrag, der eine Register-ID des derzeitigen Stapelzeigers umfasst (1207); oder umfasst: Vergleichen eines Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem Größenwert in x jüngsten Einträgen in der Datenstruktur, wobei x = 1; und in Reaktion auf ein Detektieren keiner Entsprechung zwischen dem Größenwert, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit dem Größenwert in x jüngsten Einträgen in der Datenstruktur, Wiederholen des Vergleichs mit einem Wert von x erhöht um 1, bis eine Entsprechung detektiert wird oder x einen vordefinierten Schwellenwert überschreitet (1002, 1004); oder umfasst: (i) Vergleichen eines Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem Größenwert in einem einzigen jüngsten Eintrag der Datenstruktur (608); (ii) in Reaktion auf ein Detektieren keiner Entsprechung zwischen dem Größenwert, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem Größenwert im jüngsten Eintrag der Datenstruktur, Bestimmen, ob eine Höchstanzahl von Wiederholungen erreicht wurde oder ein oberster Eintrag in der Datenstruktur leer ist (1107); (iii) in Reaktion auf ein Bestimmen, dass eine Höchstanzahl von Wiederholungen nicht erreicht wurde und ein oberster Eintrag in der Datenstruktur nicht leer ist, Bestimmen, ob der Größenwert, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, größer als der Größenwert im jüngsten Eintrag in der Datenstruktur ist (1101); (iv) in Reaktion auf ein Bestimmen, dass der Größenwert, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, größer als der Größenwert im jüngsten Eintrag in der Datenstruktur ist, Entfernen des jüngsten Eintrags aus der Datenstruktur und Reduzieren des Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, um den Größenwert im aus der Datenstruktur entfernten Eintrag (1103) und Zurückkehren zu Block (i) in einer weiteren Wiederholung; und (v) in Reaktion auf ein Bestimmen, dass der Größenwert, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, nicht größer als der Größenwert im jüngsten Eintrag in der Datenstruktur ist, Reduzieren eines Größenwerts im zweitjüngsten Eintrag in der Datenstruktur um eine Differenz zwischen dem Betrag, um den der Befehl den Stapel schrumpft, und dem Größenwert im entfernten jüngsten Eintrag (1105).
  16. Verfahren nach Anspruch 13 oder 14, wobei das Vergleichen eines Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem oder mehreren in der Datenstruktur gespeicherten Werten umfasst: Vergleichen eines Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem gespeicherten Größenwert in einem Eintrag in der Datenstruktur vor einem Eintrag, der eine Register-ID des derzeitigen Stapelzeigers umfasst (1207), und wobei das Verfahren ferner umfasst: in Reaktion auf ein Detektieren eines Befehls, der einen Rahmenzeiger basierend auf einem Wert eines Stapelzeigers setzt (1305), Hinzufügen eines neuen Dateneintrags zu der Datenstruktur mit einem Größenwert von null (1306).
  17. Verfahren nach Anspruch 13 oder 14, wobei das Vergleichen eines Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem oder mehreren in der Datenstruktur gespeicherten Werten umfasst: Vergleichen eines Größenwerts, der einem Betrag entspricht, um den der Befehl den Stapel schrumpft, mit einem gespeicherten Größenwert in einem Eintrag in der Datenstruktur vor einem Eintrag, der eine Register-ID des derzeitigen Stapelzeigers umfasst (1207), und wobei das Verfahren ferner umfasst: Entfernen aller jüngsten Dateneinträge aus der Datenstruktur bis zu und einschließlich des Eintrags, der die Register-ID des derzeitigen Stapelzeigers umfasst (1211).
  18. Verfahren nach einem der Ansprüche 13–17, wobei das Verfahren in einer Lade-Speicher-Einheit im Prozessor ferner umfasst: Detektieren einer Änderung in einem Stapelzeiger (902); und in Reaktion auf ein Detektieren einer Änderung im Stapelzeiger, Speichern einer Register-ID eines physischen Registers, das einen Wert des Stapelzeigers vor der Änderung speichert, und den Wert des Stapelzeigers vor der Änderung (908).
  19. Verfahren nach einem der Ansprüche 13–18, ferner umfassend in Reaktion auf ein Detektieren einer Unterbrechung (1402), Entfernen etwaiger Einträge aus der Datenstruktur (1404).
  20. Vorrichtung umfassend: eine Hardware-Logik (304, 314), die dazu ausgelegt ist, Werte von Variablen, die in einem Stapel in einem Prozessor gespeichert sind, vorherzusagen, wobei der Stapel einen Stapelzeiger aufweist; und einen Speicher, der dazu ausgelegt ist, einen stapelgespeicherten Variablenspeicher zu speichern (316), wobei die Hardware-Logik dazu ausgelegt ist: in Reaktion auf ein Detektieren eines Befehls, der eine Variable mit Bezug auf den Stapelzeiger in den Stapel speichert, im stapelgespeicherten Variablenspeicher einen Dateneintrag zu speichern, der eine eindeutige ID für den Stapelzeiger, einen Parameter, der einen Wert der Variable vor dem Speichern in den Stapel darstellt, und einen Offset vom Stapelzeiger, an dem die Variable gespeichert ist, umfasst; in Reaktion auf ein nachfolgendes Detektieren eines Befehls, der eine Variable mit Bezug auf den Stapelzeiger aus dem Stapel lädt, den stapelgespeicherten Variablenspeicher nach einem dem detektierten Befehl entsprechenden Eintrag zu durchsuchen; und in Reaktion auf ein Auffinden eines entsprechenden Eintrags im stapelgespeicherten Variablenspeicher, Aktualisieren eines Effektivwerts eines im detektierten Befehl referenzierten Architekturregisters unter Verwendung von Information, die im entsprechenden Eintrag im stapelgespeicherten Variablenspeicher gespeichert ist.
DE102015100705.3A 2014-01-17 2015-01-19 Vorhersage von werten stapelgespeicherter variablen Withdrawn DE102015100705A1 (de)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
GB1400810.6A GB2518022B (en) 2014-01-17 2014-01-17 Stack saved variable value prediction
GB1400810.6 2014-01-17

Publications (1)

Publication Number Publication Date
DE102015100705A1 true DE102015100705A1 (de) 2015-07-23

Family

ID=50239099

Family Applications (1)

Application Number Title Priority Date Filing Date
DE102015100705.3A Withdrawn DE102015100705A1 (de) 2014-01-17 2015-01-19 Vorhersage von werten stapelgespeicherter variablen

Country Status (4)

Country Link
US (1) US9934039B2 (de)
CN (1) CN104794067B (de)
DE (1) DE102015100705A1 (de)
GB (1) GB2518022B (de)

Families Citing this family (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2525314B (en) * 2014-01-17 2016-02-24 Imagination Tech Ltd Stack pointer value prediction
US9880833B2 (en) * 2015-06-30 2018-01-30 International Business Machines Corporation Initialization status of a register employed as a pointer
GB2540948B (en) * 2015-07-31 2021-09-15 Advanced Risc Mach Ltd Apparatus with reduced hardware register set
US10235176B2 (en) 2015-12-17 2019-03-19 The Charles Stark Draper Laboratory, Inc. Techniques for metadata processing
MA44821A (fr) * 2016-02-27 2019-01-02 Kinzinger Automation Gmbh Procédé d'allocation d'une pile de registres virtuels dans une machine à pile
US20180203703A1 (en) * 2017-01-13 2018-07-19 Optimum Semiconductor Technologies, Inc. Implementation of register renaming, call-return prediction and prefetch
US10838733B2 (en) * 2017-04-18 2020-11-17 International Business Machines Corporation Register context restoration based on rename register recovery
CN109214169B (zh) * 2017-06-30 2023-12-08 芜湖美的厨卫电器制造有限公司 堆栈溢出检测方法、装置及家用电器
FR3070775B1 (fr) * 2017-09-04 2019-08-23 Vsora Allocation dynamique utilisant plusieurs piles
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
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
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
US10884929B2 (en) 2017-09-19 2021-01-05 International Business Machines Corporation Set table of contents (TOC) register instruction
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
SG11202007272QA (en) 2018-02-02 2020-08-28 Charles Stark Draper Laboratory Inc Systems and methods for policy execution processing
WO2019152805A1 (en) 2018-02-02 2019-08-08 Dover Microsystems, Inc. System and method for translating mapping policy into code
CN108762811B (zh) * 2018-04-02 2022-03-22 东南大学 基于聚类获取应用程序乱序访存行为模式的方法
TW201945971A (zh) 2018-04-30 2019-12-01 美商多佛微系統公司 用於檢查安全性能的系統和方法
WO2020097177A1 (en) 2018-11-06 2020-05-14 Dover Microsystems, Inc. Systems and methods for stalling host processor
US11841956B2 (en) 2018-12-18 2023-12-12 Dover Microsystems, Inc. Systems and methods for data lifecycle protection
CN110362503B (zh) * 2019-06-26 2021-03-26 中国科学院信息工程研究所 链式哈希栈的优化方法及优化系统
US12079197B2 (en) 2019-10-18 2024-09-03 Dover Microsystems, Inc. Systems and methods for updating metadata
CN112114933A (zh) * 2020-08-14 2020-12-22 咪咕文化科技有限公司 应用程序保护方法、电子设备和存储介质
CN112948000B (zh) * 2021-03-17 2023-03-03 星汉智能科技股份有限公司 栈空间统计方法、装置及介质

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5901316A (en) * 1996-07-01 1999-05-04 Sun Microsystems, Inc. Float register spill cache method, system, and computer program product
WO2002045385A2 (en) * 2000-11-20 2002-06-06 Zucotto Wireless, Inc. Methods and devices for caching method frame segments in a low-power stack-based processor
US6671196B2 (en) * 2002-02-28 2003-12-30 Sun Microsystems, Inc. Register stack in cache memory
US20050102494A1 (en) * 2003-11-12 2005-05-12 Grochowski Edward T. Method and apparatus for register stack implementation using micro-operations
US7263600B2 (en) * 2004-05-05 2007-08-28 Advanced Micro Devices, Inc. System and method for validating a memory file that links speculative results of load operations to register values
GB0619380D0 (en) * 2006-10-02 2006-11-08 Transitive Ltd Method and apparatus for program code conversion from a register window based subject computing architecture
KR101283469B1 (ko) * 2009-08-31 2013-07-12 한국전자통신연구원 프로세서 명령어의 메모리 액세스 방법 및 장치
CN101976187B (zh) * 2010-11-16 2012-12-26 广州迪庆电子科技有限公司 反编译过程中的堆栈跟踪方法、装置及反编译器

Also Published As

Publication number Publication date
GB201400810D0 (en) 2014-03-05
CN104794067B (zh) 2019-07-12
GB2518022B (en) 2015-09-23
CN104794067A (zh) 2015-07-22
GB2518022A (en) 2015-03-11
US20150205612A1 (en) 2015-07-23
US9934039B2 (en) 2018-04-03

Similar Documents

Publication Publication Date Title
DE102015100705A1 (de) Vorhersage von werten stapelgespeicherter variablen
DE102015100708A1 (de) Stapelzeiger-wertvorhersage
DE102015101414A1 (de) Verbesserter Rücksprungstapelpuffer
DE69133302T2 (de) Registerabbildung in einem einzigen Taktzyklus
DE112011102487B4 (de) Zuordnen von logischen zu physischen Adressen in Halbleiterspeichereinheiten aufweisenden Speichersystemen
DE102014003434B4 (de) Vorhersage indirekter Verzweigungen
DE69800909T2 (de) Verfahren und Vorrichtung zur Optimierung der präzisen Speicherbereinigung, bei der Programmschleifen mit Zeiger-Feldern verwendet werden
DE69816044T2 (de) Zeitstrafen-basierende cache-speicherungs- und ersetzungs-techniken
DE69534113T2 (de) Kompression der Befehlswörter eines Rechners
DE102012208141B4 (de) Ausgleich nachlassender Funktionsfähigkeit
DE112018000202T5 (de) Umgehen eines Speicherzugriffs für eine Ladeanweisung unter Verwendung einer Anweisungsadresszuordnung
DE112011105774B4 (de) Verschiebbarer Speicher, der In-Memory-Datenstrukturen unterstützt
DE102014017744A1 (de) Weiche partitionierung eines registerspeicher-caches
DE202007019502U1 (de) Globaler Überlauf für virtualisierten Transaktionsspeicher
DE112010004963T5 (de) Synchronisieren von SIMD Vektoren
DE102015111333A1 (de) Betreiben eines 32-bit betriebssystems auf einer 64-bit maschine
DE4335475A1 (de) Datenverarbeitungseinrichtung mit Cache-Speicher
DE102015111363A1 (de) Vorhersage bedingter verzweigungen unter verwendung einer langen vorgeschichte
US11106362B2 (en) Additive library for data structures in a flash memory
DE4447238A1 (de) Einrichung und Verfahren zum Vorhersagen von Verzweigungsinstruktionen
DE112011100618T5 (de) Verwalten von Schreiboperationen auf einen Speicherbereich von Spuren, der zwischen Speichereinheiten verlagert wird
US8041918B2 (en) Method and apparatus for improving parallel marking garbage collectors that use external bitmaps
US20190213177A1 (en) Trees and graphs in flash memory
US10318201B2 (en) Flash interface for processing datasets
US20180144014A1 (en) Efficient database multi-version concurrency control

Legal Events

Date Code Title Description
R012 Request for examination validly filed
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 LTD., KINGS LANGLEY, HERTFORDSHIRE, GB

R082 Change of representative

Representative=s name: OLSWANG GERMANY LLP, DE

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