DE69718485T2 - Registeraddressierung in einer datenverarbeitungsvorrichtung - Google Patents
Registeraddressierung in einer datenverarbeitungsvorrichtungInfo
- Publication number
- DE69718485T2 DE69718485T2 DE69718485T DE69718485T DE69718485T2 DE 69718485 T2 DE69718485 T2 DE 69718485T2 DE 69718485 T DE69718485 T DE 69718485T DE 69718485 T DE69718485 T DE 69718485T DE 69718485 T2 DE69718485 T2 DE 69718485T2
- Authority
- DE
- Germany
- Prior art keywords
- register
- remapping
- instruction
- instructions
- bit
- 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.)
- Expired - Lifetime
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
- G06F9/30065—Loop control instructions; iterative instructions, e.g. LOOP, REPEAT
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/3013—Organisation of register space, e.g. banked or distributed register file according to data content, e.g. floating-point registers, address registers
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3004—Arrangements for executing specific machine instructions to perform operations on memory
- G06F9/30043—LOAD or STORE instructions; Clear instruction
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30101—Special purpose registers
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30105—Register structure
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/30134—Register stacks; shift registers
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3838—Dependency mechanisms, e.g. register scoreboarding
- G06F9/384—Register renaming
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
- Advance Control (AREA)
Description
- Die vorliegende Erfindung bezieht sich auf die Adressierung von Registern in einer Datenverarbeitungsvorrichtung und ist besonders relevant auf dem Gebiet der digitalen Signalverarbeitung, obwohl ihr Gebrauch nicht auf die digitale Signalverarbeitung beschränkt ist.
- Typischerweise ist eine Datenverarbeitungsvorrichtung, wie z. B. ein Mikroprozessor, eingerichtet, um empfangene Befehle auf Datenobjekte, die aus einem Speicher ausgelesen wurden, anzuwenden. Ein Prozessorkern wird innerhalb des Mikroprozessors vorgehalten, um Befehle zu verarbeiten und allgemein wird der Mikroprozessor eine Mehrzahl von Registern aufweisen, in welchen Datenobjekte vorgeladen werden, bevor sie vom Prozessorkern benötigt werden. Wenn die Befehle vom Mikroprozessor empfangen werden, durchlaufen sie typischerweise einen Anweisungsdecoder, bevor sie an den Prozessorkern zur Verarbeitung weitergegeben werden. Der Prozessorkern wird dann den decodierten Befehl auf das relevante Datenobjekt, das aus seinen Registern ausgelesen wurde, anwenden. Das Ergebnis der verarbeiteten Anweisung kann dann in eines der Register zurückgeschrieben werden oder direkt einem Speicher, z. B. einem Cachespeicher, geliefert werden.
- Es ist häufig in Datenverarbeitungsvorrichtungen der Fall, daß ein spezifisches Datenobjekt für eine Anzahl von Befehlen benötigt wird. Daher muß dieses Datenobjekt in einem der Register aufbewahrt werden, bis alle solche Befehle verarbeitet wurden, und die Befehle müssen sich alle auf das bestimmte Register, in welchem dieses Datenobjekt lokalisiert ist, beziehen. Zusätzlich ist es gebräuchlich, daß eine Auswahl von Befehlen (nachfolgend als eine Befehlsschleife bezeichnet) etliche Male wiederholt wird und daß bestimmte Datenobjekte von unterschiedlichen Befehlen innerhalb der Befehlsschleife wiederbenutzt werden sollen. Dies ist besonders üblich in Datenverarbeitungsvorrichtungen, in denen Algorithmen wie z. B. ein Blockfilteralgorithmus, der eine Befehlsschleife enthält, welche mehrere Male wiederholt werden muß, um auf einen Satz von Datenobjekten angewandt zu werden. Jedes bestimmte Datenobjekt kann mehrere Male von verschiedenen Befehlen innerhalb der Befehlsschleife benutzt werden.
- Befehlsschleifen werden extensiv in der relativ komplexen Arithmetik und in logischen Operationen, welche in digitalen Signalverarbeitungsvorrichtungen benötigt werden, verwendet, um auf häufig große Datenvolumen Anwendung zu finden, um einen Ausgangsdatenstrom in Echtzeit zu produzieren. Typische Anwendungen von digitalen Signalverarbeitungstechniken schließen mobile Telefone ein, die benötigt werden, um Transformationen in Echtzeit zwischen analogen Audiosignalen und codierten digitalen Daten zur Übertragung auszuführen.
- Ein Befehl wird typischerweise einen oder mehrere Operanden, die die Register, die die Datenobjekte, die von dem Befehl benötigt werden, einschließen, identifizieren. Zum Beispiel kann ein typischer Befehl zwei Quellenoperanden und einen Zieloperanden einschließen, die zwei Datenobjekte, die von dem Befehl benötigt werden, identifizieren, und ein Register, in welches das Ergebnis des Befehls plaziert werden soll. In Situationen, in welchen der Befehl Teil einer Befehlsschleife ist, die wiederholt auf einen Satz von Datenobjekten angewandt wird, wie oben bereits diskutiert, ist es notwendig für den Operanden eines jeden Befehls, sich auf das richtige Register zu beziehen, jedesmal wenn der Befehl ausgeführt wird. Diese Anforderung bedeutet häufig, daß der gleiche Befehl mehrere Male in dem Befehlsschleifencode reproduziert werden muß, um sich jedesmal auf verschiedene Register zu beziehen. Wenn zum Beispiel vier Datenobjekte in die Register geladen werden und als Teil einer Befehlsschleife ein Befehl auf jedes dieser vier Datenobjekte angewandt werden muß, dann muß der Befehl viermal innerhalb der Befehlsschleife reproduziert werden, wobei sich der Operand des Befehls jedesmal auf ein anderes Register bezieht. Dies hat natürlich einen nachteiligen Effekt auf die Codedichte.
- Im Mikroprozessordesign ist es bekannt, in bestimmten Situationen das Konzept der logischen Registerbezüge zu verwenden und dann diese auf die eigentlichen physikalischen Registerbezüge abzubilden bzw. zuzuordnen. Zum Beispiel implementieren superskalare Prozessoren häufig eine Registerneubenennung, um die spekulative und außerhalb der Reihenfolge liegende Ausführung von Befehlen zu erlauben. Der Prozessor hat mehr Register, als das Modell des Programmierers vorsieht, und eine Zuordnungstabelle wird angewandt, um die logischen Register auf ihre momentanen physikalischen Äquivalente abzubilden. Wenn der Prozessor spekulativ Befehle ausführt, ordnet er physikalische Registernummem zu, um die Ergebnisse zu halten. Andere Befehle können ebenso spekulativ diese Ergebnisse lesen. Etliche mögliche Befehls"ströme" können so parallel ausgeführt werden. Irgendwann wird der Prozessor bestimmen, welcher der mehreren Strömen der richtige ist, im allgemeinen basierend auf dem Ergebnis einer bedingten Verzweigung. An diesem Punkt wird die Zuordnungstabelle permanent aktualisiert und die falschen Versionen irgendwelcher Register werden verworfen. Der Zweck dieser Registerneubenennung ist, den Befehlsdurchsatz zu erhöhen und gleichzeitig dem Programmierer komplett transparent zu erscheinen. Es ist offensichtlich, daß dies nicht bei dem oben genannten Problem der Codedichte hilft.
- Als weiteres Beispiel tür die Verwendung von logischen und physikalischen Registerbezügen verwendet der Advanced Micro Devices (AMDs) Am29200 Mikroprozessor 192 Mehrzweckregister. 128 dieser Register sind als lokale Register vorgesehen und ein zusätzliches Register ist als ein lokaler Registerstapelzeiger bestimmt, wobei das Stapelzeigerregister einen Offset in die 128 lokalen Register liefert. Wann immer sich daher irgendein Befehl auf ein lokales Register bezieht, verwendet er den Wert des Stapelzeigerregisters, um eine absolute Registernummer zu berechnen. Wenn also z. B. ein Befehl Zugang zum lokalen Register 1 (die lokale Registersequenz beginnt mit dem lokalen Register 0) wünscht und der Stapelzeiger auf die absolute Registernummer 131 zeigt (dies ist eigentlich das vierte Register in der Sequenz aus 128 lokalen Registern entsprechend dem Am29200-Design), wird der Befehl eigentlich das Register, welches durch die absolute Registernummer 132 identifiziert wird, ansprechen.
- Ein Befehl kann auf dem Am29200-Mikroprozessor ausgeführt werden, um den Wert in dem Stapelzeigerregister zu verändern, wonach der korrigierte Wert in dem Stapelzeigerregister für jeden Befehl, der sich auf die lokalen Register bezieht, verwendet wird. Diese Zuordnung der Register, die von der Anweisung angefordert wurden, auf die absolute Registerzahl innerhalb der 128 lokalen Register wird für jede nachfolgende Anweisung benutzt, bis eine andere Anweisung ausgeführt wird, um das Stapelzeigerregister zu ändern.
- Man kann daher sehen, daß das oben dargestellte AMD-Design einen bestimmten Grad an Neuzuordnung in Fällen, in denen eine Anweisung für eine Anzahl von verschiedenen Datenobjekten in unterschiedlichen Registern wiederholt werden soll, erlaubt. Wie auch immer, es verlangt, daß eine separate Anweisung ausgegeben wird, um den Wert in dem Stapelzeigerregister zu ändern, jedesmal wenn das in den Operanden einer Anweisung identifizierte Register auf ein anderes lokales Register abgebildet werden soll. Dies verursacht in bestimmten Situationen einen signifikanten Verwaltungsaufwand, z. B. wenn eine Anweisungsschleife mehrfach auf einen verschobenen Satz von Datenobjekten angewandt werden soll, so wie es typisch in digitalen Signalverarbeitungsvorrichtungen ist. Der Verwaltungsaufwand wird besonders inakzeptabel, wenn die Anweisungsschleife nur eine kleine Anzahl von Befehlen enthält, da, bevor die Schleife wiederholt wird, eine separate Anweisung notwendig ist, um den Wert in dem Stapelzeigerregister zu ändern. Zum Beispiel wenn eine einfache Anweisung zehnmal wiederholt werden soll, so als ob sie auf die Datenobjekte 1 bis 10 angewendet werden sollte, so wäre dann vor jeder Ausführung der Anweisung eine separate Anweisung notwendig, den Wert des Stapelzeigerregisters zu ändern. Daher wird eine Anweisungsschleife, die eine einzelne Anweisung enthält, effektiv eine Anweisungsschleife, die zwei Befehle enthält, wobei dies natürlich einen großen Verwaltungsaufwand zu der Ausführung der Anweisungsschleife hinzufügt.
- EP-A-0 696 772 bezieht sich auf eine Technik zum Steuern eines Registerordners, der einen Kurzzeitspeicher von Operanden zum Zugriff durch Befehle, die von einer arithmetischen Logikeinheit ausgeführt wurden, innerhalb einer bestimmten Aufgabe oder eines Kontextes, bereitstellt. Der Registerordner weist einen Mechanismus auf zum Bestimmen eines ersten Satzes von Registern, die mit einer ersten Basisadresse beginnen und eines zweiten Satzes von Registern, die mit einer zweiten Basisadresse beginnen. Dann wird ein Mechanismus zum Adressieren geliefert, welcher aus einer Anweisung eine relative Adresse liest, bestimmt, ob diese relative Adresse ein Register aus dem ersten Registersatz oder ein Register aus dem zweiten Registersatz identifiziert und aus der relativen Adresse die absolute Adresse des anzusprechenden Registers berechnet.
- Gemäß der vorliegenden Erfindung wird eine Datenverarbeitungsvorrichtung ermöglicht, mit: einer Mehrzahl von Registern zum Speichern von zu verarbeitenden Datenobjekten, einem Prozessor für das Verarbeiten von Befehlen, die auf die in der Mehrzahl von Registern gespeicherten Datenobjekte angewendet werden sollen, einer Registerneuzuordnungslogik, um einen logischen Registeraufruf innerhalb eines vorgewählten Satzes von Befehlen umzuwandeln in einen physikalischen Registeraufruf, welcher das Register kennzeichnet, das das für die Verarbeitung durch den Prozessor erforderliche Datenobjekt enthält, wobei die Datenverarbeitungsvorrichtung gekennzeichnet ist durch: einen Wiederholbefehl, um einen Bereich von Befehlen zu definieren, der wiederholt werden soll und um zu bewirken, daß die Registerneuzuordnungslogik für einen definierten Teilsatz von Registern aufgerufen wird, wobei der Bereich von Befehlen den vorgewählten Satz von Befehlen umfaßt, und eine Schleifenhardware, um den Wiederholbefehl zu handhaben, welche dafür ausgelegt ist, periodisch die Registerneuzuordnungslogik zu aktualisieren, um so die Umwandlung des logischen Registeraufrufs in den physikalischen Registeraufruf zu verändern, die durch die Registerneuzuordnungslogik vorgenommen wird.
- Entsprechend der vorliegenden Erfindung wird eine Registerneuzuordnungslogik vorgesehen, um eine Registerneuzuordnung für einen vorgewählten Satz von Befehlen durchzuführen. Vorzugsweise ist die Neuzuordnungslogik durch einen Neuzuordnungsbefehl konfigurierbar, der vor dem vorgewählten Satz von Befehlen ausgeführt wird. Es ist vorstellbar, daß der Neuzuordnungsbefehl direkt den vorgewählten Satz von Befehlen identifizieren könnte, für welchen die Neuzuordnung durchgeführt werden sollte. Jedoch könnte in bevorzugten Ausführungsformen die durch den Neuzuordnungsbefehl konfigurierte Registerneuzuordnungslogik zu einem späteren Zeitpunkt durch eine bestimmte Situation ausgelöst werden, z. B. durch den Anfang einer Befehlsschleife. In solchen Fällen würde der vorgewählte Satz von Befehlen, auf welchen die Registerneuzuordnung angewandt werden sollte, von einer bestimmten Situation bestimmt werden, z. B. könnte der vorgewählte Satz aus allen Befehlen innerhalb der Befehlsschleife bestehen.
- Durch diesen Ansatz muß der Neuzuordnungsbefehl nur einmal ausgeführt werden, um die Neuzuordnung auf einen gewünschten Satz von Befehlen anzuwenden. Dies sollte ein Unterschied zu dem Modell des AMD-Mikroprozessors sein, bei welchem nachfolgend auf den Befehl, der den Wert in dem Stapelzeigerregister ändert, die gleiche Neuzuordnung auf alle nachfolgenden Befehle angewendet wird, die die lokalen Register aufrufen und ein anderer Befehl ausgeführt werden muß, wenn der Stapelzeigerwert und daher die Neuzuordnung nochmals geändert werden muß.
- In bevorzugten Ausführungsformen kann die Schleifenhardware typischerweise so ausgeführt sein, daß sie die Registerneuzuordnungslogik aktualisiert, jedesmal wenn der Bereich von Befehlen wiederholt wird, so daß eine unterschiedliche Neuzuordnung vom logischen zum physikalischen Registeraufruf jedesmal durchgeführt wird, wenn der Bereich von Befehlen wiederholt wird.
- In bevorzugten Ausführungsformen weist der Wiederholbefehl einen oder mehrere Neuzuordnungsparameter auf, die verwendet werden, um die Registerneuzuordnungslogik zu konfigurieren. Vorzugsweise sind diese Neuzuordnungsparameter so, daß sie die Neuzuordnung von dem logischen Registeraufruf zu dem physikalischen Registeraufruf von der bestimmten Näherung des Bereichs von Befehlen, der von dem Wiederholbefehl definiert wird, abhängig machen. Auf diese Weise wird die Neuzuordnung, die von der Registerneuzuordnungslogik ausgeführt wird, verändert, jedesmal, wenn der Bereich von Befehlen wiederholt wird, ohne die Forderung einen separaten Neuzuordnungsbefehl herauszugeben. Für kleine Befehlsschleifen kann dies dramatische Leistungsverbesserungen erzielen, da, wenn man das frühere Beispiel einer Befehlsschleife mit einem einzelnen Befehl nimmt, jede Iteration der Schleife nur einen einzelnen Befehl erfordert anstatt der zwei Befehle, die notwendig gewesen wären bei Verwendung des Ansatzes nach dem Stand der Technik entsprechend dem AMD-Mikroprozessor.
- Wenn der Wiederholbefehl einen oder mehrere Neuzuordnungsparameter umfaßt, wie oben erläutert, dann kann ein Neuzuordnungsbefehl so ausgestaltet sein, daß er vor der Ausführung des Wiederholbefehls durchgeführt wird, um die Registerneuzuordnungslogik zu konfigurieren, wobei er einen oder mehrere der Neuzuordnungsparameter verwendet, wobei der Neuzuordnungsbefehl nicht von dem Bereich der Befehle, der von dem Wiederholbefehl definiert wird, umfaßt ist. Durch diesen Ansatz braucht der Neuzuordnungsbefehl nur einmal ausgeführt zu werden, bevor der Wiederholbefehl ausgeführt wird. Die Registerneuzuordnungslogik, welche von dem Neuzuordnungsbefehl definiert wird, wird dann von der Schleifenhardware aufgerufen, wenn der Wiederholbefehl ausgeführt wird.
- Die Datenverarbeitungsvorrichtung kann mit einer Speichereinrichtung ausgestattet werden zur Speicherung von mindestens einem Satz von vorgewählten Neuzuordnungsparametern, wobei jeder Satz eine Neuzuordnungskonfiguration für die Registerneuzuordnungslogik definiert. In solchen Fällen, wenn der eine oder die mehreren Neuzuordnungsparameter, die in dem Wiederholbefehl eingeschlossen sind, einem aus dem Satz von vordefinierten Neuzuordnungsparametern entspricht, dann wird in bevorzugten Ausführungsformen die entsprechende Neuzuordnungskonfiguration für die Registerneuzuordnungslogik verwendet, ohne die Ausführung eines Neuzuordnungsbefehls notwendig zu machen.
- In bevorzugten Ausführungsformen identifiziert der erste Neuzuordnungsparameter eine Anzahl aus der Mehrzahl von Registern, die Gegenstand der Neuzuordnung durch die Registerneuzuordnungslogik sind, da es oft vorkommt, daß es gewünscht ist, daß die Neuzuordnungsfunktion auf einen bestimmten Teilsatz des Registers beschränkt ist, welcher dem Mikroprozessor verfügbar ist. Durch die Verwendung dieses ersten Neuzuordnungsparameters innerhalb des Wiederholbefehls wird die Registerneuzuordnungslogik auf den gewünschten Teilsatz des Registers beschränkt.
- Vorzugsweise wird von der Registerneuzuordnungslogik ein Basiszähler als ein Abstandswert (offset) verwendet, der zu dem logischen Registeraufruf hinzuaddiert wird und der Wiederholbefehl umfaßt einen zweiten Neuzuordnungsparameter, welcher einen Wert identifiziert, um welchen der Basiszähler in vorbestimmten Intervallen erhöht wird, z. B. jedesmal, wenn der Bereich von Befehlen wiederholt wird. Daher kann dieser zweite Neuzuordnungsparameter innerhalb des Wiederholbefehls verwendet werden, um automatisch in vorbestimmten Intervallen, wie z. B. nach jeder Iteration der Befehlsschleife, die Art, in welcher logische Registeraufrufe den physikalischen Registeraufrufen durch die Registerneuzuordnungslogik zugeordnet werden, zu ändern. Vorzugsweise umfaßt der Wiederholbefehl auch einen dritten Neuzuordnungsparameter, der einen ersten Umbruchwert liefert und, wenn während der Erhöhung des Basiszeigers der Basiszeiger gleich dem ersten Umbruchwert wird oder diesen übersteigt, das Erhöhen des Basiszeigers zu einem neuen Offsetwert umbricht. Dies ermöglicht es, ein periodisches Muster von Basiszeigern zu generieren.
- Darüber hinaus kann der Wiederholbefehl einen vierten Neuzuordnungsparameter umfassen, welcher einen zweiten Umbruchwert liefert und, falls der Registeraufruf, der durch die Addition des Basiszeigers und des lokalen Registeraufrufs gebildet wird, gleich dem zweiten Umbruchwert wird oder diesen übersteigt, dann wird dieser Registeraufruf zu einem neuen Registeraufruf umgebrochen. Dieser zweite Umbruchwert kann tatsächlich so gewählt werden, daß er gleich dem ersten Neuzuordnungsparameter, welcher die Anzahl der Register identifiziert, die neu zugeordnet werden sollen, ist, aber er kann auch so gewählt werden, daß er einen anderen Wert hat. Dieser zweite Umbruchwert kann genutzt werden, um sicherzustellen, daß die Registerneuzuordnungslogik auf die gewünschte Anzahl von Registern beschränkt wird.
- Die Mehrzahl von Registern kann auf jede angemessene Art organisiert werden, aber in bevorzugten Ausführungsformen enthält die Mehrzahl von Registern Bänke von Registern, wobei die Registerneuzuordnungslogik so ausgestaltet ist, um eine Neuzuordnung auf eine Anzahl von Registern innerhalb einer bestimmten Bank durchzuführen. Daher können Datenobjekte in einer Registerbank gespeichert werden, während z. B. Koeffizienten in einer anderen Registerbank gespeichert werden können. Mit diesem Ansatz kann die Neuzuordnungslogik so ausgelegt werden, daß eine unabhängige Neuzuordnung für jede Registerbank ausgeführt wird, so daß z. B. Datenobjekte unabhängig von Koeffizienten neu zugeordnet werden können.
- Typischerweise kann ein Befehl eine Mehrzahl von Operanden aufweisen, wobei jeder Operand einen logischen Registeraufruf aufweist und in solchen Fällen kann die Registerneuzuordnungslogik so ausgelegt sein, daß eine unabhängige Neuzuordnung für jeden Operanden ausgeführt wird.
- Wie zuvor erwähnt, kann die Datenverarbeitungsvorrichtung irgendeine Vorrichtung sein, die zur Verarbeitung von Daten verwendet wird, aber in bevorzugten Ausführungsformen ist die Vorrichtung eine digitale Signalverarbeitungsvorrichtung. Digitale Signalverarbeitung schließt den Gebrauch von Befehlsschleifen ein, welche insbesondere von der Benutzung der vorliegenden Erfindung profitieren, da für solche Befehlsschleifen die Codedichte und Leistungsfähigkeit häufig signifikant verbessert werden kann.
- Unter einem zweiten Aspekt betrachtet, liefert die vorliegende Erfindung eine Methode zum Betrieb einer Datenverarbeitungsvorrichtung mit den Schritten: (a) Speichern zu verarbeitender Datenobjekte innerhalb einer Mehrzahl von Registern; (b) Abfragen eines oder mehrerer Datenobjekte, die zum Verarbeiten eines Befehls benötigt werden, aus der Mehrzahl von Registern, einschließlich, falls der Befehl einer aus einem vorgewählten Satz von Befehlen ist, Anwendung der Registerneuzuordnungslogik, um eine logische Registerabfrage innerhalb des Befehls in eine physikalische Registerabfrage umzuwandeln, die das Register identifiziert, welches das Datenobjekt, das zur Verarbeitung des Befehles benötigt wird; (c) Verarbeiten des Befehls, wobei eines oder mehrere Datenobjekte, die abgefragt wurden, verwendet werden, wobei das Verfahren charakterisiert wird durch die Schritte: (d) Ausführen eines Wiederholbefehls, der einen zu wiederholenden Bereich von Befehlen definiert und Aufrufenlassen der Registerneuzuordnungslogik für einen definierten Teilsatz des Registers, wobei der Bereich von Befehlen den vorgewählten Satz von Befehlen einschließt, und (e) Anwenden der Schleifenhardware, um den Wiederholbefehl zu handhaben und um die Registerneuzuordnungslogik periodisch zu aktualisieren, um die Konversion der logistischen Registerabfrage in die physikalische Registerabfrage, die von der Registerneuzuordnungslogik angewandt wird, zu ändern.
- Eine Ausführungsform der Erfindung wird nun nur in Form eines Beispiels beschrieben, wobei auf die begleitenden Zeichnungen verwiesen wird, in welchen:
- Fig. 1 die High-Level-Konfiguration einer digitalen Signalverarbeitungsvorrichtung darstellt;
- Fig. 2 den Eingangspuffer einer Registerkonfiguration für einen Coprozessor darstellt;
- Fig. 3 den Datenpfad durch den Coprozessor darstellt;
- Fig. 4 einen Multiplex-Schaltkreis zum Lesen von Bits mit hoher oder niedriger Ordnung aus einem Register darstellt;
- Fig. 5 ein Blockdiagramm ist, das die Registerneuzuordnungslogik, welche von dem Coprozessor in den bevorzugten Ausführungsformen verwendet wird, darstellt;
- Fig. 6 detaillierter die Registerneuzuordnungslogik darstellt, die in Fig. 5 gezeigt wird; und
- Fig. 7 eine Tabelle ist, die einen Blockfilteralgorithmus darstellt.
- Das unten beschriebene System hat mit digitaler Signalverarbeitung (DSP) zu tun. DSP kann in verschiedenen Formen auftreten, aber sie kann typischerweise betrachtet werden als Verarbeitung, die die sehr schnelle (real time) Verarbeitung von großen Datenvolumen erfordert. Diese Daten repräsentieren typischerweise irgendein analoges physikalisches Signal. Ein gutes Beispiel für DSP ist die in digitalen mobilen Telefonen verwendete, in welchen Funksignale empfangen und übertragen werden, die eine Decodierung und Codierung (typischerweise Faltungs-, Transformations- und Korrelationsoperationen verwendend) in und aus einem analogen Tonsignal erfordern. Ein anderes Beispiel sind Controller für Plattentreiber, in denen die von den Plattenköpfen ausgelesenen Signale verarbeitet werden, um eine Kopfnachführsteuerung zu erhalten.
- Im Zusammenhang mit dem oben Genannten folgt hier eine Beschreibung eines digitalen Signalverarbeitungssystem, das auf einem Mikroprozessorkern (in diesem Fall ein ARM-Kern aus der Auswahl von Mikroprozessoren, die von Advanced Risk Machines Ltd. of Cambridge, United Kingdom, entworfen wurden), der mit einem Coprozessor zusammenarbeitet, basiert. Das Interface des Mikroprozessors und des Coprozessors und die Architektur des Coprozessors selbst sind spezifisch konfiguriert, um eine DSP-Funktionalität zu liefern. Der Mikroprozessorkem wird als ARM und der Coprozessor als der Piccolo bezeichnet. Der ARM und der Piccolo werden typischerweise als ein einziger integrierter Schaltkreis hergestellt, der häufig andere Elemente aufweist (z. B. Onchip- DRAM, ROM, DIA- und A/D-Konverter usw.) als Teil eines ASIC.
- Piccolo ist ein ARM-Coprozessor, er führt daher Teile des ARM-Befehlssatzes aus. Die ARM-Coprozessorbefehle erlauben dem ARM, Daten zwischen Piccolo und dem Speicher zu transferieren (dabei werden load-Coprozessor- (LDC) und Speichercoprozessor- (STC) Befehle verwendet), und ARM-Register zu und von Piccolo zu transferieren (wobei bewege zum Coprozessor- (MCR), und bewege aus dem Coprozessor- (LRC) Befehle verwendet werden). Eine Betrachtungsweise der synergetischen Interaktion des ARM und Piccolo ist, daß der ARM als ein mächtiger Adressengenerator für Piccolodaten agiert, wobei Piccolo freigehalten wird, um DSP-Befehle auszuführen, die die Real-Time-Handhabung von großen Datenvolumen erfordern, um entsprechende Real-Time-Ergebnisse zu produzieren.
- Fig. 1 illustriert den ARM 2 und Piccolo 4, wobei der ARM 2 Steuersignale an den Piccolo 4 ausgibt, um den Transfer von Datenworten zu und von dem Piccolo 4 zu steuern. Ein Befehlscache 6 speichert die Piccolo-Programmbefehlsworte, die vom Piccolo 4 benötigt werden. Ein einzelner DRAM-Speicher 8 speichert all die Daten und Befehlsworte, die von beiden, dem ARM 2 und Piccolo 4, benötigt werden. Der ARM 2 ist verantwortlich für das Adressieren des Speichers 8 und das Steuern des ganzen Datentransfers. Die Anordnung mit nur einem einzelnen Speicher 8 und einem Satz von Daten und Adreßbussen ist weniger komplex und teuer als der typische DSP-Ansatz, der vielfache Speicher und Busse mit hoher Busbandbreite erfordert.
- Piccolo führt einen zweiten Befehlsstrom (die digitalen Signalverarbeitungsprogramm- Befehlsworte) aus dem Befehlscache 6 aus, welcher den Piccolo-Datenpfad steuert. Diese Befehle schließen Operationen vom Typ digitale Signalverarbeitung ein, z. B. Multiplizier-Akkumulier, und steuern Ablaufbefehle, z. B. Zero-Overhead-Schleifenbefehle (Schleifenbefehle ohne Zusatzlast). Solche Befehle werden auf Daten angewendet, die in Piccolo-Registern 10 (siehe Fig. 2) gehalten werden. Diese Daten wurden vorher von dem ARM 2 aus dem Speicher 8 transferiert. Die Befehle strömen aus dem Befehlscache 6; der Befehlscache 6 treibt den Datenbus als ein Full-Bus-Master. Ein kleiner Piccolo-Befehlscache 6 ist ein vierzeiliger, direkt zugeordneter Cache (64 Befehle) mit 16 Worten pro Zeile. In manchen Implementierungen kann es lohnend sein, den Befehlscache größer zu machen.
- So laufen zwei Aufgaben unabhängig - das Laden von Daten durch den ARM und ihre Verarbeitung durch den Piccolo. Dies erlaubt die fortwährende Datenverarbeitung von 16-Bit-Daten in einem Zyklus. Piccolo hat einen Dateneingangsmechanismus (in Fig. 2 dargestellt), der es dem ARM erlaubt, sequentielle Daten vor-abzuholen, d. h. Daten zu laden, bevor sie vom Piccolo benötigt werden. Piccolo kann auf die geladenen Daten in jeder Reihenfolge zugreifen, wobei er sein Register automatisch wieder auffüllt, wenn die alten Daten zum letzten Mal verwendet werden (alle Befehle haben 1 Bit pro Source-Operanden, um anzuzeigen, daß das Source-Register wieder aufgefüllt werden soll). Dieser Eingangsmechanismus wird als Neuordnungspuffer bezeichnet und weist einen Eingangspuffer 12 auf. Jeder Wert, der in Piccolo (über einen LDC oder MRC, siehe unten) geladen wird, trägt mit sich ein Kennzeichen Rn, das spezifiziert, für welches Register der Wert bestimmt ist. Das Kennzeichen Rn wird neben dem Datenwort in dem Eingangspuffer gespeichert. Wenn ein Register über einen Registerauswählkreis 14 angesprochen wird und der Befehl spezifiziert, daß das Datenregister wieder aufgefüllt werden soll, wird das Register als leer markiert, durch Anführen eines Signales E. Das Register wird dann automatisch wieder aufgefüllt von einem Wiederauffüllsteuerkreis 16, der den ältesten geladenen Wert, der für das Register innerhalb des Eingangspuffers 12 vorgesehen ist, verwendet. Der Neuordnungspuffer hält acht gekennzeichnete Werte. Der Eingangspuffer 12 hat eine Form ähnlich der eines FIFOs, außer daß Datenworte aus dem Zentrum der Schlange extrahiert werden können, wonach später gespeicherte Worte weitergeleitet werden, um den Platz zu füllen. Entsprechend sind die am weitesten von dem Eingang entfernten Datenworte die ältesten und dies kann verwendet werden, um zu entscheiden, welches Datenwort benutzt werden soll, um ein Register wieder aufzufüllen, wenn der Eingangspuffer 12 zwei Datenworte mit dem richtigen Kennzeichen Rn hält.
- Piccolo gibt Daten aus, indem er sie in einen Ausgangspuffer 18 (FIFO) speichert, wie in Fig. 3 gezeigt. Daten werden in den FIFO sequentiell geschrieben und in der gleichen Reihenfolge vom ARM in den Speicher 8 ausgelesen. Der Ausgangspuffer 18 hält acht 32-Bit-Werte.
- Piccolo ist über das Coprozessorinterface (CP-Steuersignale aus Fig. 1) mit dem ARM verbunden. Beim Ausführen eines ARM-Coprozessorbefehls kann Piccolo entweder den Befehl ausführen, wobei er vor Ausführen des Befehls den ARM veranlaßt zu warten, bis Piccolo bereit ist oder er kann verweigern, den Befehl auszuführen. Im letzten Fall wird ARM die Ausnahme eines undefinierten Befehls machen.
- Die am meisten gebräuchlichen Coprozessorbefehle, die Piccolo ausführt, sind LDC und STC, die Datenworte in und aus dem Speicher 8 über den Datenbus laden bzw. speichern, wobei der ARM alle Adressen generiert. Es sind diese Befehle, die Daten in den Neuordnungspuffer laden und Daten aus dem Ausgangspuffer 18 speichern. Piccolo unterbricht den ARM bei einem LDC, wenn nicht genügend Raum in dem Eingangsneuordnungspuffer ist, um die Daten einzuladen und bei einem STC, wenn ungenügende Daten in dem Ausgangspuffer sind, um zu speichern, d. h. wenn die Daten, die der ARM erwartet, nicht in dem Ausgangspuffer 18 sind. Der Piccolo führt auch ARM/Coprozessor-Registertransfers aus, um dem ARM zu erlauben, auf spezielle Register des Piccolo zuzugreifen.
- Der Piccolo holt seine eigenen Befehle aus einem Speicher, um den Piccolodatenpfad, der in Fig. 3 dargestellt ist, zu steuern und um Daten von dem Neuordnungspuffer zu Registern zu transferieren und von Registern zu dem Ausgangspuffer 18. Die arithmetische Logikeinheit des Piccolo, die diese Befehle ausführt, hat einen Multiplizier-/Addier-Schaltkreis 20, der Multiplikationen, Additionen, Subtraktionen, Multiplikationen/Akkumulationen, logische Operationen, Verschiebungen und Rotationen ausführt. In dem Datenpfad wird auch ein Akkumulier-/Deakkumulier-Schaltkreis 22 und ein Skalierungs-/Sättigungs-Schaltkreis 24 bereitgestellt.
- Die Piccolobefehle werden zunächst aus dem Speicher in den Befehlscache 6 geladen, wo der Piccolo auf sie zugreifen kann, ohne Zugriff zurück auf den Hauptspeicher zu benötigen.
- Der Piccolo kann sich nicht von Speicherabbrüchen erholen. Daher müssen, wenn der Piccolo in einem virtuellen Speichersystem verwendet wird, alle Piccolodaten während der Piccoloaufgabe in einem physikalischen Speicher sein. Dies ist keine signifikante Einschränkung angesichts des Real-Time-Charakters, z. B. Real-Time-DSP. Wenn ein Speicherabbruch auftritt, stoppt Piccolo und setzt eine Marke in einem Statusregister S2.
- Fig. 3 zeigt die gesamte Datenpfadfunktionalität des Piccolo. Die Registerbank 10 verwendet drei Leseports und zwei Schreibports. Ein Schreibport (der L-Port) wird verwendet, um Register aus dem Neuordnungspuffer wieder aufzufüllen. Der Ausgangspuffer 18 wird direkt von dem ALU- Ergebnisbus 26 aktualisiert, wobei die Ausgabe aus dem Ausgabepuffer 18 unter ARM- Programmsteuerung steht. Das ARM-Coprozessorinterface führt LDC- (load coprocessor-) Befehle in dem Neuordnungspuffer aus und STC- (store coprocessor-) Befehle von dem Ausgangspuffer 18, genauso wie MCR und MRC (bewege ARM-Register zu/von CT-Registern) auf die Registerbank 10.
- Die verbleibenden Registerports werden für die ALU verwendet. Zwei Leseports (A und B) treiben die Eingänge zu dem Multiplizier-/Addier-Schaltkreis 20, der C-Leseport wird verwendet, um den Eingang des Akkumulier-/Deakkumulier-Schaltkreises 22 zu treiben. Der verbleibende Schreibport W wird verwendet, um Ergebnisse an die Registerbank 10 zurückzugeben.
- Der Multiplizierer 20 führt eine 16 · 16-Multiplikation mit oder ohne Vorzeichen aus, mit einer optionalen 48-Bit-Akkumulation. Die Skaliereinheit 24 kann eine sofortige arithmetische oder logische Verschiebung nach rechts zwischen 0 und 31 (Bits) vorsehen, gefolgt von einer optionalen Sättigung. Der Schieber und die logische Einheit 20 können in jedem Zyklus entweder eine Verschiebung oder eine logische Operation ausführen.
- Der Piccolo hat 16 allgemein verwendbare Register, die mit D0-D15 oder A0-A3, X0-X3, Y0- Y3, Z0-Z3 bezeichnet werden. Die ersten vier Register (A0-A3) sind als Akkumulatoren gedacht und sind 48 Bits breit, wobei die zusätzlichen 16 Bits einen Schutz gegen Überlaufen während vieler aufeinanderfolgender Berechnungen bieten. Die verbleibenden Register sind 32 Bits breit.
- Jedes der Register des Piccolo kann behandelt werden, als enthielte es zwei unabhängige 16-Bit-Werte. Die Bits 0-15 enthalten die niedrige Hälfte, die Bits 16-31 enthalten die hohe Hälfte. Befehle können eine bestimmte 16-Bit-Hälfte eines jeden Registers als einen Source-Operanden bestimmen oder sie können das gesamte 32-Bit-Register spezifizieren.
- Der Piccolo liefert auch eine gesättigte Arithmetik. Varianten der Multiplizier-, Addier- und Subtrahierbefehle liefern ein gesättigtes Ergebnis, wenn das Ergebnis größer ist als die Größe des Zielregisters. Wo das Zielregister ein 48-Bit-Akkumulator ist, wird der Wert bei 32 Bits gesättigt (d. h. es gibt keine Möglichkeit, einen 48-Bit-Wert zu sättigen). Es gibt keine Überlaufdetektion in 48-Bit- Registern. Dies ist eine sinnvolle Beschränkung, da es mindestens 65.536 Multiplikations- Akkumulierbefehle dauem würde, um ein Überlaufen zu verursachen.
- Jedes Piccoloregister ist entweder als "leer" markiert (E-Marke, siehe Fig. 2) oder es enthält einen Wert (es ist nicht möglich, die Hälfte eines Registers leer zu halten). Anfänglich sind alle Register als leer markiert. Bei jedem Zyklus versucht der Piccolo mit dem Wiederauffüllsteuerschaltkreis 16, eines der leeren Register aufzufüllen mit einem Wert aus dem Eingangsneuordnungspuffer. Alternativ dazu, wenn das Register mit einem Wert aus der ALU beschrieben ist, ist es nicht länger als "leer" markiert. Wenn ein Register von der ALU beschrieben wird und gleichzeitig ein Wert aus dem Neuordnungspuffer darauf wartet, in dem Register plaziert zu werden, dann ist das Ergebnis undefiniert. Die Ausführungseinheit des Piccolo wird unterbrochen, wenn aus einem leeren Register ausgelesen wird.
- Der Eingangsneuordnungspuffer (ROB) sitzt zwischen dem Coprozessorinterface und der Registerbank des Piccolo. Daten werden in den ROB mit ARM-Coprozessortransfers geladen. Der ROB enthält eine Anzahl von 32-Bit-Werten, jedes mit einem Kennzeichen, das das Piccoloregister anzeigt, für das der Wert bestimmt ist. Das Kennzeichen zeigt auch an, ob die Daten in ein ganzes 32-Bit-Register transferiert werden sollen oder nur zu den unteren 16 Bits eines 32-Bit-Registers.
- Wenn die Daten für ein ganzes Register bestimmt sind, werden die unteren 16 Bits des Eintrags in die untere Hälfte des Zielregisters transferiert und die oberen 16 Bits werden zu der oberen Hälfte des Registers (um ein Vorzeichen erweitert, falls das Zielregister ein 48-Bit-Akkumulator ist) transferiert. Wenn die Daten nur für die untere Hälfte eines Registers (das sogenannte "halbe Register") bestimmt sind, werden die unteren 16 Bits zuerst transferiert.
- Das Registerkennzeichen bezieht sich immer auf ein physikalisches Zielregister, es wird keine Registerneuzuordnung (siehe unten bezüglich einer Registerneuzuordnung) ausgeführt. Bei jedem Zyklus versucht Piccolo einen Dateneintrag aus dem ROB in die Registerbank zu transferieren wie folgt:
- - Jeder Eintrag in den ROB wird untersucht und die Kennzeichen mit den Registern, die leer sind, verglichen und es wird bestimmt, ob ein Transfer aus Teilen oder der Gesamtheit eines Eintrags in ein Register durchgeführt werden kann.
- - Aus einem Satz von Einträgen, der einen Transfer machen kann, wird der älteste Eintrag ausgewählt und seine Daten in die Registerbank transferiert.
- - Das Kennzeichen dieses Antrags wird aktualisiert, um den Eintrag als leer zu markieren. Wenn nur ein Teil des Eintrags transferiert wurde, wird nur der transferierte Teil als leer markiert.
- Zum Beispiel wenn das Zielregister komplett leer ist und der gewählte ROB-Eintrag Daten enthält, die für ein volles Register bestimmt sind, werden die ganzen 32 Bits transferiert und der Eintrag wird als leer markiert. Wenn dis untere Hälfte des Zielregisters leer ist und der ROB-Eintrag Daten enthält, die für die untere Hälfte eines Registers bestimmt sind, so werden die unteren 16 Bits des ROB-Eintrags in die untere Hälfte des Zielregisters transferiert und die untere Hälfte des ROB wird als leer markiert.
- Die oberen und unteren 16 Bits der Daten in irgendeinem Eintrag können unabhängig transferiert werden. Wenn kein Eintrag Daten enthält, die in die Registerbank transferiert werden können, so wird in diesem Zyklus kein Transfer durchgeführt. Die unten gegebene Tabelle beschreibt alle möglichen Kombinationen eines Ziel-ROB-Eintrags und eines Zielregisterzustandes.
- Um zusammenzufassen, die beiden Hälften eines Registers können unabhängig vom ROB wiederaufgefüllt werden. Die Daten in dem ROB sind entweder als für ein ganzes Register bestimmt markiert oder als zwei 16-Bit-Werte, die für die untere Hälfte eines Registers bestimmt sind.
- Daten werden unter Verwendung von ARM-Coprozessorbefehlen in den ROB geladen. Wie die Daten in dem ROB markiert werden, hängt davon ab, welcher ARM-Coprozessorbefehl verwendet wurde, um den Transfer durchzuführen. Die folgenden ARM-Befehle stehen zur Verfügung zum Auffüllen des ROB mit Daten:
- Der folgende ARM-Befehl ist zum Konfigurieren des ROB bestimmt:
- Die ersten drei sind zusammengesetzt als LDCs, MPR und MRP als MCRs, LDPA ist als CDP-Befehl zusammengesetzt.
- In dem oben genannten steht < dest> für ein Piccolo-Register (A0-Z3), Rn für ein ARM- Register, < size> für eine konstante Zahl von Bytes, die ein Vielfaches von 4 sein muß, das ungleich Null ist und < wrap> für eine Konstante (1, 2, 4, 8). Felder, die von {} umgeben sind, sind optional. Damit ein Transfer in den Recorderpuffer paßt, muß < size> mindestens 32 betragen. In vielen Fällen wird < size> kleiner sein als diese Begrenzung, um eine Blockierung zu vermeiden. Das < 16/32> - Feld zeigt an, ob die zu ladenden Daten als 16-Bit-Daten behandelt werden sollen und paßt die spezifischen zu unternehmenden Handlungen (siehe unten) der Bitreihenfolge (Endian) an, oder als 32- Bit-Daten.
- Anmerkung 1: Im folgenden Text wird, wenn auf die LDP oder LDPW Bezug genommen wird, sowohl auf die 16-Bit- als auch auf die 32-Bit-Varianten der Befehle Bezug genommen.
- Anmerkung 2: Ein "Wort" ist ein 32-Bit-Stück aus einem Speicher, welches aus zwei 16-Bit- Datenobjekten oder einem 32-Bit-Datenobjekt bestehen kann.
- Der LDP-Befehl transferiert eine Anzahl von Datenobjekten, wobei er sie als für ein volles Register bestimmt markiert. Der Befehl lädt < size> /4 Worte von der Adresse Rn in einen Speicher, wobei er sie in den ROB einfügt. Die Anzahl von Worten, die transferiert werden können, ist durch das folgende beschränkt:
- - Die Anzahl < size> muß ein von Null verschiedenes Vielfaches von 4 sein;
- - < size> muß weniger als oder gleich der Größe des ROB für eine bestimmte Implementierung (8 Worte in der ersten Version und garantiert nicht weniger als dies in zukünftigen Versionen) sein.
- Das erste zu transferierende Datenobjekt wird als für < dest> bestimmt markiert, das zweite als für < dest> + 1 bestimmt usw. (mit einem Umbruch von 23 nach A0). Wenn das! spezifiziert ist, dann wird das Register Rn anschließend um < size> erhöht.
- Wenn die LDP16-Variante verwendet wird, wird eine endianspezifische Handlung ausgeführt an den zwei 16-Bit-Halbworten, die die 32-Bit-Datenobjekte bilden, wenn sie aus dem Speichersystem zurückgegeben werden. Siehe unten wegen mehr Details über die Unterstützung von Big Endian und Little Endian.
- Der LDPW-Befehl transferiert eine Anzahl von Datenobjekten in einen Satz von Registern.
- Das erste transferierte Datenobjekt ist als für < dest> bestimmt markiert, das nächste für < dest> +1 etc. Wenn < wrap> -Transfers stattgefunden haben, so ist das nächste zu transferierende Objekt als für < dest> bestimmt markiert usw. Die Anzahl < wrap> ist in Anzahlen von Halbworten spezifiziert. Für LDPW gelten die folgenden Beschränkungen:
- - Die Anzahl < size> muß ein von Null verschiedenes Vielfaches von 4 sein;
- - < size> muß weniger als oder gleich der Größe des ROB für eine bestimmte Implementierung sein (8 Worte in der ersten Version und garantiert nicht weniger als dies in zukünftigen Versionen);
- - < dest> kann eines aus {A0, X0, Y0, Z0} sein;
- - < wrap> kann eines aus {2, 4, 8} Halbworten für LDP32 W und eines aus {1, 2, 4, 8} Halbworten für LDP16 W sein;
- - die Anzahl < size> muß größer als 2*< wrap> sein, sonst findet kein Umbruch statt und der LDP-Befehl sollte stattdessen benutzt werden.
- Zum Beispiel lädt der Befehl
- LDP32WX0, 2, [R0]!, #8
- zwei Worte in den ROB, wobei sie als für das volle Register X0 bestimmt markiert werden. R0 wird um 8 erhöht. Der Befehl
- LDP32WX0, 4, [R0], #16
- lädt vier Worte in den ROB, wobei sie als für X0, X1, X0, X1 (in dieser Reihenfolge) bestimmt markiert werden. R0 wird nicht beeinflußt.
- Für LDP16 W kann < wrap> als 1, 2, 4 oder 8 spezifiziert werden. Der Umbruch von 1 wird dazu führen, daß alle Daten als für die untere Hälfte des Zielregisters < dest> .I bestimmt markiert werden. Dies ist der "Halbregister"-Fall.
- Zum Beispiel lädt der Befehl
- LDP16WX0, 1, [R0]!, #8
- zwei Worte in den ROB, wobei er sie als 16-Bit-Daten, die für X0.I bestimmt sind, markiert. R0 wird um 8 erhöht. Der Befehl
- LDP16WX0; 4, [R0], #16
- wird sich auf ähnliche Art und Weise verhalten wie die LDP32 W-Beispiele, bis auf die Tatsache, daß endianspezifische Handlungen an den Daten ausgeführt werden können, die von einem Speicher zurückgegeben werden.
- Alle nicht verwendeten Codierungen können für zukünftige Erweiterungen reserviert werden.
- Der LDP16U-Befehl wird bereitgestellt, um den effizienten Transfer von nicht in Worten ausgerichteten 16-Bit-Daten zu unterstützen. LDP16U-Unterstützung wird für die Register D4 bis D15 (die X-, Y- und Z-Bänke) bereitgestellt. Der LDP16U-Befehl transferiert ein 32-Bit-Wort von Daten (die zwei 16-Bit-Datenobjekte enthalten) vom Speicher in den Piccolo. Der Piccolo wird die unteren 16 Bits dieser Daten verwerfen und die oberen 16 Bits in einem Halteregister speichern. Es gibt ein Halteregister für die X-, Y- und Z-Bänke. Sobald ein Halteregister einer Bank adressiert ist, wird das Verhalten der LDP{W}-Befehle modifiziert, wenn die Daten für ein Register in dieser Bank bestimmt sind. Die Daten, die in den ROB geladen werden, werden durch die Verknüpfung des Halteregisters und der unteren 16 Bits der Daten, die durch den LDP-Befehl transferiert werden, gebildet. Die oberen 16 Bits der transferierten Daten werden in das Halteregister eingefügt:
- Dieser Betriebsmodus hält an, bis er durch einen LDPA-Befehl abgestellt wird. Das Halteregister nimmt das Zielregisterkennzeichen oder die Größe nicht auf. Diese Charakteristiken werden von dem Befehl erhalten, der den nächsten Wert von data.I liefert.
- Endianspezifisches Verhalten kann immer auftreten bei den Daten, die von dem Speichersystem zurückgegeben werden. Es gibt kein nicht-16-Bit-Äquivalent zu LDP16U, da angenommen wird, daß alle 32-Bit-Datenobjekte in Worten im Speicher ausgerichtet sind.
- Der LDPA-Befehl wird verwendet, um den nichtausgerichteten Betriebsmodus, der von einem LDP16U-Befehl initiiert wurde, auszuschalten. Der nichtausgerichtete Modus kann unabhängig für die Bänke X, Y, Z ausgeschaltet werden. Der Befehl z. B.
- LDPA{X, Y}
- schaltet den nichtausgerichteten Modus in den Bänken X und Y aus. Daten in den Halteregistern dieser Bänke werden verworfen.
- Das Ausführen eines LDPA auf eine Bank, die nicht im nichtausgerichteten Modus ist, ist erlaubt und läßt die Bank im ausgerichteten Modus.
- Der MPR-Befehl plaziert den Inhalt des ARM-Registers Rn in den ROB, der für das Piccoloregister < dest> bestimmt ist. Das Zielregister < dest> kann jedes volle Register in dem Bereich A0 bis 23 sein. Zum Beispiel der Befehl
- MPRX0, R3
- transferiert den Inhalt von R3 in den ROB, wobei er die Daten als für das volle Register X0 bestimmt markiert.
- Es tritt kein endianspezifisches Verhalten für die Daten, die vom ARM zum Piccolo transferiert werden, auf, da der ARM ursprünglich ein Little Endian ist.
- Der MPRW-Befehl plaziert den Inhalt des ARM-Registers Rn in den ROB, wobei er ihn als zwei 16-Bit-Datenobjekte markiert, die für das 16-Bit-Piccoloregister < dest> .I bestimmt sind. Die Beschränkungen von < dest> sind die gleichen wie die für die LDPW-Befehle (d. h. A0, X0, Y0, Z0). Zum Beispiel transferiert der Befehl
- MPRWX0, R3
- den Inhalt von R3 in den ROB, wobei er die Daten als zwei 16-Bit-Größen, die für X0.I bestimmt sind, markiert. Es sollte hervorgehoben werden, daß für den LDP16 W-Fall mit einem Umbruch von 1 nur die untere Hälfte eines 32-Bit-Registers erreicht werden kann.
- Wie mit dem MPR werden keine endianspezifischen Operationen auf die Daten angewandt.
- LDP wird codiert als:
- wobei PICCOLO1 die erste Coprozessornummer (zur Zeit 9) des Piccolo ist. Die N Bits wählen zwischen LDP23 (1) und LDP16 (0).
- LDPW ist codiert als:
- wobei DEST 0-3 für Zielregister A0, X0, Y0, Z0 ist und WRAP 0-3 für Umbruchwerte 1, 2, 4, 8 ist. PICCOLO2 ist die zweite Coprozessornummer (zur Zeit 9) des Piccolo. Die N Bits wählen zwischen LDP32 (1) und LDP16 (0).
- LDP16U ist codiert als:
- wobei DEST 1-3 ist für die Zielbank X, Y, Z.
- LDPA ist codiert als:
- wobei BANK[3 : 0] verwendet wird, um den nichtausgerichteten Modus auf einer pro-Bank-Basis auszuschalten. Wenn BANK[1] gesetzt ist, ist der nichtausgerichtete Modus für X ausgeschaltet. BANK[2] und BANK[3] schalten den nichtausgerichteten Modus für die Bänke Y und Z aus, wenn sie entsprechend gesetzt sind. Anmerkung: Dies ist ein CDP-Befehl.
- MPR ist codiert als:
- MPRW ist codiert als:
- wobei DEST 1-3 ist für das Zielregister X0, Y0, Z0.
- Der Ausgangs-FIFO kann bis zu acht 32-Bit-Werte halten. Diese werden vom Piccolo unter Verwendung einer der folgenden (ARM) Opcodes transferiert:
- Der erste speichert < size> /4 Worte von dem Ausgangs-FIFO in die Adresse, die von dem ARM- Register Rn gegeben wird, wobei Rn indiziert wird, wenn das! präsent ist. Um eine Blockierung zu verhindern, darf < size> nicht größer sein als die Größe des Ausgangs-FIFOs (acht Einträge in dieser Implementierung). Wenn die STP16-Variante verwendet wird, kann endianspezifisches Verhalten in den Daten, die von dem Speichersystem zurückgegeben werden, auftreten.
- Der MRP-Befehl entfernt ein Wort aus dem Ausgangs-FIFO und plaziert es in dem ARM-Register Rn. Wie bei MPR werden keine endianspezifischen Operationen auf die Daten angewandt.
- Die ARM-Codierung für STP ist:
- wobei N zwischen STP32 (1) und STP16 (0) wählt. Für die Definitionen der P-, U- und W-Bits wird auf ein ARM-Datenblatt verwiesen.
- Die ARM-Codierung für MRP ist:
- Der Piccolo-Befehlssatz nimmt eine interne Little Endian-Operation an. Zum Beispiel wenn ein 32-Bit-Register als 16-Bit-Hälften angesprochen wird, wird angenommen, daß die untere Hälfte die Bits 15 bis 0 belegt. Der Piccolo kann in einem System operieren mit Big Endian-Speicher oder Peripherien und muß daher dafür Sorge tragen, daß er 16-Bit-gepackte Daten in der korrekten Art lädt.
- Der Piccolo (d. h. der DSP-adaptierte Coprozessor) hat wie der ARM (z. B. der ARM7- Mikroprozessor, der von Advanced Risk Machines Ltd. of Cambridge, United Kingdom hergestellt wird) einen "BIGEND"-Konfigurationsanschluß, welchen der Programmierer steuern kann, vielleicht mit einer programmierbaren Peripherie. Der Piccolo verwendet diesen Anschluß, um den Eingangsneüordnungspuffer und Ausgangs-FIFO zu konfigurieren.
- Wenn der ARM gepackte 16-Bit-Daten in den Neuordnungspuffer lädt, so muß er dies anzeigen, durch die Verwendung der 16-Bit-Form des LDT-Befehls. Diese Information wird kombiniert mit dem Zustand des "BIGEND"-Konfigurationseingangs, um Daten in die Halte-Auffang-Register zu plazieren und den Puffer in einer angemessenen Reihenfolge neu zu ordnen. Insbesondere, wenn er in einem Big Endian-Modus ist, speichert der Halteregister die unteren 16 Bits des geladenen Wortes und wird gepaart mit den oberen 16 Bits des nächsten zu ladenden Wortes. Der Inhalt des Halteregisters endet immer in den unteren 16 Bits des in den Neuordnungspuffer transferierten Wortes.
- Der Ausgangs-FIFO kann entweder gepackte 16-Bit- oder 32-Bit-Daten enthalten. Der Programmierer muß die richtige Form des STP-Befehls verwenden, so daß der Piccolo sicherstellen kann, daß die 16-Bit-Daten für die richtigen Hälften des Datenbusses bereitgehalten werden, wenn sie als Big Endian konfiguriert sind, werden die oberen und unteren 16-Bit-Hälften getauscht, wenn die 16-Bit-Formen des STP verwendet werden.
- Piccolo hat vier private Register, auf die nur von dem ARM zugegriffen werden kann. Sie werden S0-S2 genannt. Auf sie kann nur mit MRC- und MCR-Befehlen zugegriffen werden. Die Opcodes sind:
- MPSR Sn, Rm
- MPRS Rm, Sn
- Diese Opcodes transferieren einen 32-Bit-Wert zwischen ARM-Register Rm und dem privaten Register Sn. Sie sind im ARM wie ein Coprozessorregistertransfer codiert:
- wobei L 0 ist für den MPSR und 1 für den MRPS.
- Register 50 enthält den Piccolo-spezifischen ID- und Revisionscode
- Bits[3 : 0] enthalten die Revisionsnummer für den Prozessor
- Bits[15 : 4] enthalten eine dreistellige Teilnummer in binärcodiertem Dezimalformat: 0 · 500 für Piccolo.
- Bits[23 : 16] enthalten die Architekturversion: 0 · 00 = Version 1
- Bits[31 : 24] enthalten den ASCII-Code des Warenzeichens eines Implementators: 0 · 41 = A = ARM Ltd.
- Register S1 ist das Piccolo-Statusregister.
- Primäre Zustandsmarken (N, Z, C, V)
- Sekundäre Zustandscodemarken (SN, S2, SC, SV)
- E-Bit: Der Piccolo wurde von dem ARM abgeschaltet und hat angehalten:
- U-Bit: Der Piccolo ist auf einen UNDEFINED-Befehl gestoßen und hat angehalten.
- B-Bit: Der Piccolo ist auf einen BREAKPOINT gestoßen und hat angehalten.
- H-Bit: Der Piccolo ist auf einen HALT-Befehl gestoßen und hat angehalten.
- A-Bit: Der Piccolo erlitt einen Speicherabbruch (Laden, Speichern oder Piccolo-Befehl) und hat angehalten.
- D-Bit: Der Piccolo hat eine Abbruchsbedingung erkannt und hat angehalten (siehe unten).
- Register S2 ist der Piccolo-Programmzähler:
- Schreiben in den Programmzähler startet den Piccolo, um ein Programm bei dieser Adresse (wobei der angehaltene Zustand beibehalten wird, wenn er angehalten ist) auszuführen. Wenn das Programm zurückgesetzt wird, ist der Zähler undefiniert, da der Piccolo immer durch das Schreiben in den Programmzähler gestartet wird.
- Während der Ausführung überwacht der Piccolo die Ausführung von Befehlen und den Status des Coprozessorinterfaces. Wenn er detektiert, daß:
- - der Piccolo angehalten hat, um entweder auf das Auffüllen eines Registers zu warten oder darauf, daß der Ausgangs-FIFO einen verfügbaren Eintrag hat.
- - Das Coprozessorinterface ist wartend beschäftigt, weil der Raum in dem ROB unzureichend ist oder unzureichende Objekte in dem Ausgangs-FIFO sind.
- Wenn beide dieser Bedingungen erkannt sind, setzt der Piccolo das D-Bit in seinem Statusregister, hält an und lehnt den ARM-Coprozessorbefehl ab, wobei er den ARM veranlaßt, die "Falle" eines undefinierten Befehls zu nehmen.
- Dieses Detektieren von Abbruchbedingungen erlaubt es, ein System zu konstruieren, das den Programmierer zumindest warnen kann, daß die Bedingung aufgetreten ist und den exakten Fehlerpunkt berichten kann, in dem der ARM- und der Piccolo-Programmzähler und die Register gelesen werden. Es soll hervorgehoben werden, daß ein Abbruch nur aufgrund eines fehlerhaften Programmes oder vielleicht eines anderen Teiles des Systems, das den Zustand des Piccolo beschädigt, auftreten kann. Ein Abbruch kann nicht auftreten durch Datenmangel oder "Überlauf".
- Es sind vielfältige Befehle verfügbar, die verwendet werden können, um den Piccolo von dem ARM aus zu steuern, diese werden von CDP-Befehlen geliefert. Diese CDP-Befehle werden nur akzeptiert, wenn der ARM in einem privilegierten Zustand ist. Wenn dies nicht der Fall ist, wird der Piccolo den CDP-Befehl zurückweisen, was darin resultiert, daß der ARM in die "Falle" eines undefinierten Befehls läuft. Die folgenden Befehle sind verfügbar:
- - Reset (Zurücksetzen)
- - Enter State Access Mode (In den Zustands Zugriffs Modus eintreten)
- - Enable (Einschalten)
- - Disable (Ausschalten)
- Der Piccolo kann in der Software zurückgesetzt werden, indem der PRESET-Befehl verwendet wird.
- PRESET; Freimachen des Zustands des Piccolo
- Dieser Befehl ist codiert als:
- Wenn dieser Befehl ausgeführt ist, passiert das folgende:
- - Alle Register werden als leer (fertig zum Wiederbefüllen) markiert.
- - Die Eingabe des ROB wird freigemacht.
- - Der Ausgangs-FIFO wird freigemacht.
- - Schleifenzähler werden zurückgesetzt.
- - Der Piccolo wird in den angehaltenen Zustand versetzt (und das H-Bit von 52 wird gesetzt).
- Das Ausführen des PRESET-Befehls kann bis zum Abschluß mehrere Zyklen dauern (2-3 für diese Ausführungsform). Während er, die auszuführenden ARM-Coprozessorbefehle befolgend, ausgeführt wird, ist der Piccolo wartend beschäftigt.
- Im Zustands-Zugangsmodus kann der Zustand des Piccolo gespeichert werden und wiederhergestellt werden unter Verwendung der STC- und LDC-Befehle (siehe unten bezüglich des Zugangs des Piccolo-Zustands von dem ARM). Um den Zustands-Zugangsmodus einzugeben, muß zuerst der PSTATE-Befehl ausgeführt werden:
- PSTATE; Eingabe des Zustands-Zugangsmodus
- Dieser Befehl ist codiert als:
- Wenn er ausgeführt wird, wird der PSTATE-Befehl:
- - den Piccolo anhalten (wenn er nicht bereits angehalten wurde), wobei das E-Bit im Statusregister des Piccolo gesetzt wird.
- - den Piccolo konfigurieren in seinem Zustands-Zugangsmodus.
- Das Ausführen des PSTATE-Befehls kann mehrere Zyklen dauern, bis er fertig ist, da die Befehlspipeline des Piccolo entleert werden muß, bevor er anhalten kann. Während er, die auszuführenden Coprozessorbefehle befolgend, ausführt, ist der Piccolo wartend beschäftigt.
- Die PENABLE- und PDISABLE-Befehle werden verwendet für ein schnelles Umschalten des Inhalts. Wenn der Piccolo ausgeschaltet ist, sind nur die privaten Register und 0 und 1 (die 1D- und Statusregister) zugänglich, und nur dann aus einem privilegierten Modus. Zugang zu jedem anderen Zustand, oder jeder Zugang vom Benutzermodus bewirkt eine bei dem ARM undefinierte Befehlsausnahme. Das Abschalten des Piccolo bewirkt, daß er seine Ausführung anhält. Wenn der Piccolo seine Ausführung angehalten hat, wird er diese Tatsache durch Setzen des E-Bits in dem Statusregister quittieren.
- Der Piccolo wird eingeschaltet durch Ausführen des PENABLE-Befehls:
- PENABLE; Piccolo einschalten
- Dieser Befehl ist codiert als:
- Der Piccolo wird ausgeschaltet durch Ausführen des PDISABLE-Befehls:
- PDISABLE; Piccolo ausschalten
- Dieser Befehl ist codiert als:
- Wenn dieser Befehl ausgeführt wird, passiert das folgende:
- - Die Befehlspipeline des Piccolo wird entleert.
- - Der Piccolo hält an und das H-Bit in dem Statusregister wird gesetzt.
- Der Piccolo-Befehlscache hält die Piccolo-Befehle, welche den Datenpfad des Piccolo steuern. Zur Zeit ist es garantiert, zumindest 64 Befehle zu halten, wobei mit einer 16-Wort-Grenze begonnen wird. Der folgende ARM-Opcode wird in einen MCR umgesetzt (assembliert). Seine Handlung ist, den Cache zu zwingen, eine Zeile von (16) Befehlen, die bei der spezifizierten Adresse beginnen (welche auf einer 16-Wort-Grenze sein muß), zu holen. Dieses Abholen tritt auf, sogar wenn der Cache bereits Daten, die in Beziehung zu dieser Adresse stehen, hält.
- PMIR Rm
- Der Piccolo muß angehalten werden, bevor ein PMIR ausgeführt werden kann.
- Die MCR-Codierung dieses Opcodes ist:
- Dieser Abschnitt diskutiert den Befehlssatz des Piccolo, der den Datenpfad des Piccolo steuert. Jeder Befehl ist 32 Bits lang. Die Befehle werden aus dem Befehlscache des Piccolo gelesen.
- Die Decodierung des Befehlssatzes ist ziemlich einfach. Die oberen 6 Bits (26-31) geben einen Haupt-Opcode, wobei die Bits 22-25 einen Neben-Opcode für wenige spezifische Befehle liefern. Die in grau schattierten Befehle werden zur Zeit nicht benutzt und sind für Erweiterungen reserviert (sie müssen zur Zeit die angezeigten Werte enthalten).
- Es gibt elf Hauptbefehlsklassen. Dies stimmt nicht vollständig mit dem Haupt-Opcode überein, der in den Befehl eingeordnet ist, zur Erleichterung der Decodierung einiger Unterklassen.
- Die Befehle in der oben genannten Tabelle haben die folgenden Namen:
- Standard Data Operation
- Logical Operation
- Conditional Add/Subtract
- Undefined
- Shifts
- Select
- Undefined
- Parallel Select
- Multiply Accumulate
- Undefined
- Multiply Double
- Undefined
- Move Signed Immediate
- Undefined
- Repeat
- Repeat
- Repeat
- Register List Operations
- Branch
- Renaming Parameter Move
- Halt/Break
- Das Format für jede Klasse von Befehlen wird im Detail in den folgenden Abschnitten beschrieben. Die Felder des Quellen- und Zieloperanden sind den meisten Befehlen gemeinsam und werden im Detail in getrennten Abschnitten beschrieben, wie z. B. der Registerneuzuordnung.
- Die meisten Befehle erfordern zwei Quellenoperanden; Quelle 1 und Quelle 2. Einige Ausnahmen sättigen absolut.
- Der Quelle 1- (SRC&sub1;-) Operand hat das folgende 7-Bit-Format:
- Die Elemente des Feldes haben die folgende Bedeutung:
- - Size - zeigt die Größe der zu lesenden Operanden an (1 = 32-Bit, 0 = 16-Bit).
- - Refill - spezifiziert, daß das Register als leer markiert werden soll, nachdem es ausgelesen wurde und von dem ROB wiederbefüllt werden kann.
- - Register Number - codiert, welches der 16 32-Bit-Register gelesen werden soll.
- - Hi/Lo - Für 16-Bit-Auslesungen zeigt es an, welche Hälfte des 32-Bit-Registers gelesen werden soll. Für 32-Bit-Operanden, wenn die Setzung anzeigt, daß die beiden 16-Bit-Hälften des Registers ausgetauscht werden sollen.
- Die Registergröße ist in dem Assembler spezifiziert, durch Addieren eines Suffix zu der Registernummer: .I für die unteren 16 Bits, .h für die oberen 16 Bits oder .x für 32 Bits, wobei die oberen und unteren 16 Bits vertauscht sind.
- Die generelle Quelle 2 (SRC2) hat eines der folgenden drei 12-Bit-Formate.
- Fig. 4 illustriert eine Multiplexeranordnung, die auf das Hi/Lo- und Größen-Bit antwortet, um angemessene Hälften des gewählten Registers in den Datenpfad des Piccolo zu schalten. Wenn das Größen-Bit 16 Bits anzeigt, dann füllt ein vorzeichenerweiternder Schaltkreis die Bits mit hoher Ordnung aus dem Datenpfad entsprechend mit 0en oder 1en auf.
- Das erste Codieren spezifiziert die Quelle, so als ob sie ein Register sei, wobei die Felder die gleiche Codierung wie der SRC1-Spezifizierer haben. Das SCALE-Feld spezifiziert eine Skala bzw. Skalierung, die auf das Ergebnis der ALU angewandt werden soll.
- Die direkten 8 Bits mit rotierender Codierung erlauben die Generation direkter 32 Bits, welche durch einen 8-Bit-Wert und eine 2-Bit-Rotation ausgedrückt werden können. Die folgende Tabelle zeigt die Immediates, die aus dem 8-Bit-Wert XY generiert werden können:
- Die 6-Bit-Immediatecodierung erlaubt die Verwendung eines 6-Bit-Immediates ohne Vorzeichen (Bereich 0-63) zusammen mit einer auf den Ausgang der ALU angewandten Skala/Skalierung.
- Die generelle Quelle 2-Codierung ist in den meisten Befehlsvarianten üblich. Es gibt einige Ausnahmen von dieser Regel, die einen begrenzten Teilsatz der Quelle 2-Codierung verwenden oder ihn geringfügig modifizieren:
- - Auswahlbefehle.
- - Verschiebebefehle.
- - Paralleloperationen.
- - Multiplizier-Akkumulier-Befehle.
- - Multiplizier-Verdoppel-Befehle.
- Auswahlbefehle unterstützen nur einen Operanden, der ein Register oder ein 6-Bit- Immediate ohne Vorzeichen ist. Die Skala/Skalierung ist nicht verfügbar, da diese Bits von dem Bedingungsfeld des Befehls verwendet werden.
- Verschiebebefehle können nur einen Operanden unterstützen, der ein 16-Bit-Register oder ein 5-Bit-Immediate ohne Vorzeichen zwischen 1 und 31 ist. Eine Skala/Skalierung des Ergebnisses ist nicht verfügbar.
- Im Fall von Paralleloperationen, wenn ein Register als Quelle des Operanden spezifiziert ist, muß ein 32-Bit-Auslesen ausgeführt werden. Die Immediate-Codierung hat eine geringfügig andere Bedeutung für die Paralleloperationen. Dies erlaubt es, einen Immediate auf beide 16-Bit-Hälften eines 32-Bit-Operanden zu duplizieren. Eine geringfügig beschränkte Auswahl von Skalen ist verfügbar für Paralleloperationen.
- Wenn ein 6-Bit-Immediate verwendet wird, dann wird er immer auf beide Hälften der 32-Bit- Größe dupliziert. Wenn der 8-Bit-Immediate verwendet wird, wird er nur dupliziert, wenn der Rotator anzeigt, daß der 8-Bit-Immediate auf die obere Hälfte der 32-Bit-Größe rotiert werden soll:
- Für parallele Auswahloperationen ist keine Skala/Skalierung verfügbar; das Skalenfeld sollte für diese Befehle zu 0 gesetzt werden.
- Die Multiplizier-Akkumulier-Befehle erlauben keine 8-Bit-rotierten Immediates zu spezifizieren. Bit 10 des Feldes wird verwendet, um teilweise zu spezifizieren, welcher Akkumulator zu verwenden ist. Quelle 2 ist als ein 16-Bit-Operand impliziert.
- Multiplizier-Verdoppel-Befehle erlauben nicht alle die Verwendung einer Konstanten. Nur ein 16-Bit-Register kann spezifiziert werden. Bit 10 des Feldes wird verwendet, um teilweise zu spezifizieren, weicher Akkumulator zu verwenden ist.
- Manche Befehle implizieren immer eine 32-Bit-Operation (z. B. ADDADD) und in diesen Fällen sollte das Größen-Bit zu 1 gesetzt werden, wobei das Hi/Lo-Bit verwendet wird, um optional die beiden 16-Bit-Hälften des 32-Bit-Operanden zu tauschen. Manche Befehle implizieren immer eine 16-Bit-Operation (z. B. MUL) und das Größen-Bit sollte zu 0 gesetzt werden. Das Hi/Lo-Bit wählt dann, welche Hälfte des Registers verwendet wird (es wird vorausgesetzt, daß das fehlende Größen-Bit klar ist). Multiplizier-Akkumulier-Befehle erlauben eine unabhängige Spezifikation des Quellenakkumulators und des Zielregisters. Für diese Befehle werden die Größen-Bits verwendet, um den Quellenakkumulator anzuzeigen und es wird vom Befehlstyp vorausgesetzt, daß die Größen- Bits 0 sind.
- Wenn ein 16-Bit-Wert gelesen wird (über den A- oder B-Bus), so wird er automatisch um ein Vorzeichen erweitert auf eine 32-Bit-Größe. Wenn ein 48-Bit-Register gelesen wird (über den A- oder E-Bus), so erscheinen nur die unteren 32 Bits auf dem Bus. Daher werden in allen Fällen Quelle 1 und Quelle 2 in 32-Bit-Werte konvertiert. Nur Akkumulier-Befehle, die den Bus C verwenden, können auf die vollen 48 Bits eines Akkumulator-Registers zugreifen.
- Wenn das Wiederauffüllbit gesetzt ist, ist das Register nach der Benutzung als leer markiert und wird von dem ROB wiederaufgefüllt mit dem üblichen Wiederauffüllmechanismus (siehe den Abschnitt über den ROB). Der Piccolo wird nicht zum Anhalten gebracht, es sei denn, das Register wird emeut als ein Quellenoperand verwendet, bevor das Wiederauffüllen stattgefunden hat. Die minimale Anzahl von Zyklen, bevor die wiederaufgefüllten Daten gültig sind (der beste Fall - die Daten warten am oberen Ende des ROB), ist entweder 1 oder 2. Daher ist es ratsam, die wiederaufgefüllten Daten nicht zu verwenden für den Befehl, der der Wiederauffüllanforderung folgt. Wenn die Verwendung des Operanden auf die nächsten zwei Befehle vermieden werden kann, so sollte es getan werden, da dies Leistungsverluste bei tieferen Pipeline-Implementierungen verhindert.
- Das Wiederauffüllbit ist spezifiziert in dem Assembler durch Anhängen eines "^" an die Registernummer. Der Abschnitt des Registers, der als leer markiert wird, hängt von dem Registeroperanden ab. Die beiden Hälften jedes Registers können zum Wiederauffüllen unabhängig markiert werden (z. B. X0.I^ markiert nur die untere Hälfte des X0 zum Wiederauffüllen, X0^ markiert das ganze X0 zum Wiederauffüllen). Wenn die obere "Hälfte" (Bits 47 : 16) eines 48-Bit-Registers wiederaufgefüllt werden, so werden die 16 Bits von Daten auf die Bits 31 : 16 geschrieben und um ein Vorzeichen erweitert bis zu Bit 47.
- Wenn ein Versuch gemacht wird, das gleiche Register zweimal wiederaufzufüllen (z. B. ADD X1, X0^, X0^), so findet nur ein Wiederauffüllen statt. Der Assembler sollte nur die Syntax ADD X1, X0 ,X0^ erlauben.
- Wenn eine Registerauslese versucht wird, bevor das Register wieder gefüllt wurde, so hält der Piccolo an, um auf das Wiederbefüllen des Registers zu warten. Wenn ein Register zum Wiederbefüllen markiert ist und das Register dann aktualisiert wird, bevor der wiederaufgefüllte Wert gelesen wird, so ist das Ergebnis UNVORHERSEHBAR (z. B. ADD X0, X0^, X1 ist unvorhersehbar, da es X0 zum Wiederauffüllen markiert und es dann wiederauffüllt, indem es die Summe von X0 und X1 in ihm plaziert).
- Das 4-Bit-Skalenfeld codiert 14 Skalen-/Skalierungstypen:
- - ASR #0, 1, 2, 3, 4, 6, 10
- - ASR #12 bis 16
- - LSL #1
- Parallele Max/Min-Befehle liefern keine Skala/Skalierung und daher wird die konstante 6-Bit- Variante der Quelle 2 nicht benutzt (durch den Assembler zu 0 gesetzt).
- Mit einem REPEAT-Befehl wird die Registerneuzuordnung unterstützt, wobei es einem RE- PEAT erlaubt wird, auf ein sich bewegendes "Fenster" von Registern zuzugreifen, ohne die Schleife zu entrollen. Dies ist detaillierter unten beschrieben.
- Zieloperanden haben das folgende 7-Bit-Format:
- Es gibt zehn Varianten dieser Basiscodierung:
- Die Registernummer (Dx) zeigt an, welches der 16 Register adressiert wird. Das High/Low- Bit und das Größen-Bit arbeiten zusammen, um jedes 32-Bit-Register als ein Paar von 16-Bit- Registern zu adressieren. Das Größen-Bit definiert, wie die entsprechenden Marken, wie in dem Befehlstyp definiert, gesetzt werden, ungeachtet, ob ein Ergebnis in die Registerbank und/oder den Ausgangs-FIFO geschrieben wurde. Dies erlaubt die Konstruktion von Vergleichen und ähnlichen Befehlen. Das Hinzufügen mit der Akkumulier-Klasse von Befehlen muß das Ergebnis in ein Register zurückschreiben.
- Die folgende Tabelle zeigt das Verhalten jeder Codierung.
- In allen Fällen ist das Ergebnis irgendeiner Operation vor dem Zurückschreiben in ein Register oder Einfügen in den Ausgangs-FIFO eine 48-Bit-Größe. Es gibt zwei Fälle:
- Wenn das Schreiben aus 16 Bits besteht, so wird die 48-Bit-Größe reduziert zu einer 16-Bit-Größe durch Auswahl der unteren 16 Bits [15 : 0]. Wenn der Befehl sättigt, dann wird der Wert im Bereich -2^15 bis 2^15 - 1 gesättigt. Der 16-Bit-Wert wird dann zurückgeschrieben in das angezeigte Register urad wenn das Write-FIFO-Bit gesetzt ist, in den Ausgangs-FIFO. Wenn er in den Ausgangs-FIFO geschrieben wird, dann wird er gehalten, bis der nächste 16-Bit-Wert geschrieben wird, wenn die Werte gepaart sind und in den Ausgangs-FIFO als ein einzelner 32-Bit-Wert plaziert werden.
- Für 32-Bit-Schreibungen ist die 48-Bit-Größe reduziert auf eine 32-Bit-Größe durch Auswahl der unteren 32 Bits [31 : 0].
- Für beide 32-Bit- und 48-Bit-Schreibungen wird, wenn der Befehl sättigt, der 48-Bit-Wert in einen 32-Bit-Wert konvertiert in dem Bereich -2^31 - 1 bis 2^31. Der Sättigung folgt:
- - Wenn ein Zurückschreiben in einen Akkumulator ausgeführt wird, werden die ganzen 48 Bits geschrieben.
- - Wenn ein Zurückschreiben in ein 32-Bit-Register ausgeführt wird, werden die Bits [31 : 0] geschrieben.
- - Wenn ein Zurückschreiben in den Ausgangs-FIFO angezeigt wird, werden erneut die Bits [31 : 0] geschrieben.
- Die Größe des Ziels ist spezifiziert in dem Assembler durch ein .I oder .h hinter der Registernummer. Wenn kein Zurückschreiben in ein Register ausgeführt wird, dann ist die Registernummer unwichtig, lasse so das Zielregister weg, um anzuzeigen, daß kein Schreiben in ein Register erfolgt, oder verwende ^, um ein Schreiben nur in den Ausgangs-FIFO anzuzeigen. Zum Beispiel SUB, X0, Y0 ist äquivalent zu CMP X0, Y0 und ADD ^, iN X0, Y0 plaziert den Wert von X0 + Y0 in den Ausgangs- FIFO.
- Wenn es keinen Raum in dem Ausgangs-FIFO für einen Wert gibt, so hält der Piccolo an, um darauf zu warten, daß Raum verfügbar wird.
- Wenn ein 16-Bit-Wert ausgeschrieben wird, z. B. ADD X0.h^, X1, X2, dann wird der Wert festgehalten, bis ein zweiter 16-Bit-Wert geschrieben wird. Die zwei Werte werden dann kombiniert und in den Ausgangs-FIFO als eine 32-Bit-Zahl plaziert. Der erste geschriebene 16-Bit-Wert erscheint immer in der unteren Hälfte des 32-Bit-Wortes. Daten, die in den Ausgangs-FIFO eingegeben werden, werden entweder als 16- oder 32-Bit-Daten markiert, um eine Korrektur der Eigenschaften des Endians in Big Endian-Systemen zu erlauben.
- Wenn ein 32-Bit-Wert zwischen zwei 16-Bit-Schreibungen geschrieben wird, dann ist die Handlung undefiniert.
- Innerhalb eines REPEAT-Befehls wird die Registerneuzuordnung unterstützt, wobei einem REPEAT erlaubt wird, auf ein sich bewegendes "Fenster" eines Registers zuzugreifen, ohne die Schleife zu entrollen. Dies wird detailliert unten beschrieben.
- In bevorzugten Ausführungsformen der vorliegenden Erfindung liefert der REPEAT-Befehl einen Mechanismus, um die Art, in der Registeroperanden innerhalb einer Schleife spezifiziert werden, zu modifizieren. Unter diesem Mechanismus werden die Register, auf die zugegriffen werden soll, durch eine Funktion des Registeroperanden in dem Befehl und eines Offsets in die Registerbank bestimmt. Der Offset wird auf eine programmierbare Art verändert, vorzugsweise am Ende einer jeden Befehlsschleife. Der Mechanismus kann unabhängig auf Register, die sich in den X-, Y- und Z-Bänken befinden, angewandt werden. In bevorzugten Ausführungsformen ist diese Einrichtung nicht für Register in der A-Bank verfügbar.
- Die Idee eines logischen und physikalischen Registers kann verwendet werden. Die Befehlsoperanden sind logische Registeraufrufe und diese werden dann physikalischen Registeraufrufen zugeordnet, wobei sie spezifische Register 10 des Piccolo identifizieren. Alle Operationen, einschließlich Wiederauffüllen, werden auf die physikalischen Register angewandt. Die Registerneuzuordnung findet nur auf der Piccolo-Befehlsstromseite statt - Daten, die in den Piccolo geladen werden, sind immer für ein physikalisches Register bestimmt und Neuzuordnung wird nicht ausgeführt.
- Der Neuzuordnungsmechanismus wird weiter diskutiert mit Bezug auf Fig. 5, welche ein Blockdiagramm ist, das eine Anzahl von internen Komponenten des Piccolo-Coprozessors 4 darstellt. Datenobjekte, die von dem ARM-Kern 2 aus einem Speicher abgefragt werden, werden im Neuordnungspuffer 12 plaziert und die Piccolo-Register 10 werden von dem Neuordnungspuffer 12 in der unter Bezug auf Fig. 2 zuvor beschriebenen Art wiederaufgefüllt. Piccolo-Befehle, die in dem Cache 6 gespeichert sind, werden an einen Befehlsdecoder 50 innerhalb des Piccolo 4 weitergegeben, wo sie decodiert werden, bevor sie zu dem Piccolo-Prozessorkern 54 weitergegeben werden. Der Piccolo-Prozessorkern 54 umfaßt den Multiplizierer/Addierer-Schaltkreis 20, den Akkumulier/Deakkumulier-Schaltkreis 22 und den SkalierenlSättigen-Schaltkreis 24, die zuvor mit Bezug auf Fig. 3 diskutiert wurden.
- Wenn der Befehlsdecoder 50 Befehle abwickelt, die einen Teil einer Befehlsschleife, die von einem REPEAT-Befehl identifiziert wird, bilden, und der REPEAT-Befehl angezeigt hat, daß eine Neuzuordnung einer Anzahl von Registern stattfinden soll, dann wird die Registerneuzuordnungslogik 52 angewandt, um die notwendige Neuzuordnung auszuführen. Die Registerneuzuordnungslogik 52 kann betrachtet werden als sei sie Teil des Befehlsdecoders 50, obwohl es für Fachleute offensichtlich ist, daß die Registerneuzuordnungslogik 52 als eine komplett separate Einheit dem Befehlsdecoder 50 zur Verfügung gestellt wird.
- Ein Befehl umfaßt typischerweise einen oder mehrere Operanden, die die Register identifizieren, die die von dem Befehl benötigten Datenobjekte beinhalten. Zum Beispiel kann ein typischer Befehl zwei Source-Operanden und einen Zieloperanden umfassen, die zwei Register identifizieren, die die von dem Befehl benötigten Datenobjekte enthalten und ein Register, in das das Ergebnis des Befehls plaziert werden soll. Die Registerneuzuordnungslogik 52 empfängt die Operanden eines Befehls von dem Befehlsdecoder 50, wobei diese Operanden logische Registeraufrufe identifizieren. Basierend auf den logischen Registeraufrufen bestimmt die Registerneuzuordnungslogik, ob eine Neuzuordnung angewandt werden soll oder nicht und sie wird dann eine Neuzuordnung auf die physikalischen Registeraufrufe anwenden wie benötigt. Wenn bestimmt ist, daß eine Neuzuordnung nicht angewandt werden soll, so werden die logischen Registeraufrufe als die physikalischen Registeraufrufe geliefert. Die bevorzugte Art, in der die Neuzuordnung ausgeführt wird, wird später detaillierter beschrieben.
- Jeder ausgegebene physikalische Registeraufruf von der Registerneuzuordnungslogik wird an den Piccolo-Prozessorkern 54 weitergegeben, so daß der Prozessorkern dann den Befehl auf das Datenobjekt in dem bestimmten Register 10, das von dem physikalischen Registeraufruf identifiziert wird, anwenden kann.
- Der Neuzuordnungsmechanismus der bevorzugten Ausführungsform erlaubt jeder Registerbank, in zwei Abschnitte aufgeteilt zu werden, nämlich einen Abschnitt, innerhalb dessen Register neu zugeordnet werden können und einen Abschnitt, in dem Register ihren Original-Registeraufruf ohne Neuzuordnung behalten. In bevorzugten Ausführungsformen beginnt der Neuzuordnungsabschnitt am Boden der neu zuzuordnenden Registerbank.
- Eine Anzahl von Parametern wird von dem Neuzuordnungsmechanismus verwendet und diese Parameter werden im Detail mit Bezug auf Fig. 6 diskutiert, welche ein Blockdiagramm ist, das darstellt, wie die unterschiedlichen Parameter von der Registerneuzuordnungslogik 52 verwendet werden. Es sollte beachtet werden, daß diese Parameter gegebene Werte sind, die relativ zu einem Punkt innerhalb der neu zuzuordnenden Bank sind, wobei dieser Punkt z. B. der untere Teil der Bank ist.
- Die Registerneuzuordnungslogik 52 kann als aus zwei Haupt-logischen Blöcken bestehend betrachtet werden, nämlich dem Neuzuordnungsblock 56 und dem Basisaktualisierungsblock 58. Die Registerneuzuordnungslogik 52 verwendet einen Basiszeiger, der einen Offsetwert liefert, der zu dem logischen Registeraufruf hinzuaddiert wird, wobei dieser Basiszeigerwert an den Neuzuordnungsblock 56 durch den Basisaktualisierungsblock 58 geliefert wird.
- Ein BASESTART-Signal kann verwendet werden, um den anfänglichen Wert des Basiszeigers zu definieren, dieser ist z. B. typischerweise Null, obwohl einige andere Werte spezifiziert werden können. Dieses BASESTART-Signal wird an einen Multiplexer 60 innerhalb des Basisaktualisierungsblocks 58 weitergegeben. Während der ersten Näherung der Befehlsschleife wird das BASE- START-Signal von dem Multiplexer 60 an das Speicherelement 66 weitergegeben, wobei für nachfolgende Iterationen der Schleife der nächste Basiszeigerwert von dem Multiplexer 60 an das Speicherelement 66 geliefert wird.
- Der Ausgang des Speicherelements 66 wird als der aktuelle Basiszeigerwert an die Neuzuordnungslogik 56 weitergegeben und wird auch an einen der Eingänge eines Addierer 62 innerhalb der Basisaktualisierungslogik 58 weitergegeben. Der Addierer 62 empfängt auch ein BASEINC-Signal, das einen Basiserhöhungswert liefert. Der Addierer 62 ist so angeordnet, um den aktuellen Basiszeigerwert, der von einem Speicherelement 66 durch den BASEINC-Wert geliefert wird, zu erhöhen, und um das Ergebnis an den Modulo-Schaltkreis 64 weiterzugeben.
- Der Modulo-Schaltkreis empfängt auch einen BASEWRAP-Wert und vergleicht diesen Wert mit dem Ausgangs-Basiszeigersignal von dem Addierer 62. Wenn der erhöhte Basiszeigerwert gleich oder größer als der BASEWRAP-Wert ist, so wird der neue Basiszeiger auf einen neuen Offsetwert umgebrochen. Der Ausgang des Modulo-Schaltkreises 64 ist dann der nächste Basiszeigerwert, der in einem Speicherelement 66 gespeichert wird. Dieser Ausgang wird an den Multiplexer 60 geliefert und von dort an das Speicherelement 66.
- Aber dieser nächste Basiszeigerwert kann nicht in dem Speicherelement 66 gespeichert werden, bis ein BASEUPDATE-Signal von der Schleifenhardware, die den REPEAT-Befehl handhabt, der vom Speicherelement 66 empfangen wird. Das BASEUPDATE-Signal wird periodisch von der Schleifenhardware produziert, z. B. jedesmal, wenn die Befehlsschleife wiederholt werden soll. Wenn ein BASEUPDATE-Signal von dem Speicherelement 66 empfangen wird, so überschreibt das Speicherelement die vorhergehenden Basiszeigerwerte mit dem nächsten Basiszeigerwert, der von dem Multiplexer 60 geliefert wird. Auf diese Weise ändert sich der Basiszeigerwert, der von der Neuzuordnungslogik 58 geliefert wird, in den neuen Basiszeigerwert.
- Das physikalische Register, auf das innerhalb eines neu zugeordneten Abschnitts einer Registerbank zugegriffen werden soll, wird bestimmt durch die Addition eines logischen Registeraufrufs, der innerhalb eines Operanden eines Befehls enthalten ist und dem Basiszeigerwert, der von der Basisaktualisierungslogik 58 geliefert wird. Diese Addition wird von dem Addierer 68 ausgeführt und der Ausgang wird an den Modulo-Schaltkreis 70 weitergegeben. In bevorzugten Ausführungsformen empfängt der Modulo-Schaltkreis 70 auch einen Registerumbruchwert und wenn das Ausgangssignal von dem Addierer 68 (die Addition des logischen Registeraufrufs und des Basiszeigerwerts) den Registerumbruchwert übersteigt, so wird das Ergebnis bis an das untere Ende der neu zugeordneten Region umgebrochen. Der Ausgang des Modulo-Schaltkreises 70 wird dann an den Multiplexer 72 geliefert.
- Ein REGCOUNT-Wert wird an eine Logik 74 innerhalb des Remap-Blockes 56 geliefert, die die Anzahl von Registern innerhalb einer Bank, welche neu zugeordnet werden soll, identifiziert. Die Logik 74 vergleicht diesen REGCOUNT-Wert mit dem logischen Registeraufruf und gibt ein Steuersignal an den Multiplexer 72 weiter, abhängig von dem Ergebnis dieses Vergleichs. Der Multiplexer 72 empfängt als seine zwei Eingänge den logischen Registeraufruf und den Ausgang des Modulo- Schaltkreises 70 (der neu zugeordnete Registeraufruf). In bevorzugten Ausführungsformen der vorliegenden Erfindung, wenn der logische Registeraufruf weniger ist als der REGCOUNT-Wert, dann weist die Logik 74 den Multiplexer 72 an, den neu zugeordneten Registeraufruf als den physikalischen Registeraufruf auszugeben. Wenn jedoch der logische Registeraufruf größer oder gleich dem REGCOUNT-Wert ist, dann weist die Logik 74 den Multiplexer 72 an, den logischen Registeraufruf direkt als den physikalischen Registeraufruf auszugeben.
- Wie zuvor erwähnt, ist es in bevorzugten Ausführungsformen der REPEAT-Befehl, der den Neuzuordnungsmechanismus aufruft. Wie detaillierter später beschrieben werden wird, liefern die REPEAT-Befehle vier Null-Zyklus-Schleifen in der Hardware. Diese Hardwareschleifen sind in Fig. 5 als Teil des Befehlsdecoders 50 dargestellt. Jedesmal wenn der Befehlsdecoder 50 einen Befehl aus dem Cache 6 anfordert, gibt der Cache diesen Befehl an den Befehlsdecoder zurück, worauf der Befehlsdecoder bestimmt, ob der zurückgegebene Befehl ein REPEAT-Befehl ist. Ist dies der Fall, so wird eine der Hardwareschleifen so konfiguriert, um den REPEAT-Befehl zu handhaben.
- Jeder Repeat-Befehl spezifiziert die Zahl von Befehlen in der Schleife und wie viele Male die Schleife durchlaufen werden soll (welches entweder eine Konstante oder ein Auslesewert aus einem Piccolo-Register ist). Zwei Opcodes, REPEAT und NEXT, werden geliefert, um eine Hardwareschleife zu definieren, wobei der NEXT-Opcode lediglich als Delimiter verwendet wird und nicht als ein Befehl assembliert wird. Der REPEAT-Befehl geht an den Anfang der Schleife und NEXT begrenzt das Ende der Schleife, wobei sie dem Assembler erlauben, die Anzahl von Befehlen in dem Schleifenkörper zu berechnen. In bevorzugten Ausführungsformen kann der REPEAT-Befehl Neuzuordnungsparameter wie z. B. REGCOUNT-, BASEINC-, BASEWRAP- und REGWRAP- Parameter umfassen, um von der Registerneuzuordnungslogik 52 angewandt zu werden.
- Eine Anzahl von Registern kann bereitgehalten werden, um Neuzuordnungsparameter, die von der Registerneuzuordnungslogik verwendet werden, zu speichern. Innerhalb dieser Register kann eine Anzahl von Gesetzen vordefinierter Neuzuordnungsparameter geliefert werden, während einige Register für das Speichern von benutzerdefinierten Neuzuordnungsparametern übriggelassen werden. Wenn die Neuzuordnungsparameter, die mit dem REPEAT-Befehl spezifiziert sind, gleich einem aus den Sätzen von vordefinierten Neuzuordnungsparametern ist, dann wird die dazugehörige REPEAT-Codierung verwendet, wobei diese Codierung einen Multiplexer oder ähnliches veranlaßt, die zugehörigen Neuzuordnungsparameter von den Registern direkt an die Registerneuzuordnungslogik zu liefern. Wenn, auf der anderen Seite, die Neuzuordnungsparameter nicht die gleichen sind wie irgendwelche aus dem Satz von vordefinierten Neuzuordnungsparametern, dann generiert der Assembler einen Neuzuordnungsparameter-Bewegungsbefehl (Remapping Parameter Move Instruction - RMOV), welcher die Konfiguration von den benutzerdefinierten Neuzuordnungsparametern erlaubt, wobei der RMOV-Befehl von dem REPEAT-Befehl befolgt wird. Vorzugsweise würden die benutzerdefinierten Neuzuordnungsparameter von dem RMOV-Befehl in die Register, die zum Speichern solcher benutzerdefinierter Neuzuordnungsparameter freigehalten wurden, plaziert und der Multiplexer würde dann programmiert, um die Inhalte dieser Register an die Registerneuzuordnungslogik weiterzugeben.
- In den bevorzugten Ausführungsformen nehmen die REGCOUNT-, BASEINC-, BASEW- RAP- und REGWRAP-Parameter einen von den Werten an, die in der folgenden Aufstellung identifiziert werden:
- REGCOUNT Dies identifiziert die Anzahl von 16-Bit-Registern, auf die die Neuzuordnung angewandt werden soll, und kann die Werte 0, 2, 4, 8 annehmen. Register unter REGCOUNT werden neu zugeordnet, solche über oder gleich REGCOUNT werden direkt an es rochen.
- BASEINC Dies definiert, um wie viele 16-Bit-Register der Basiszeiger am Ende jeder Schleifennäherung erhöht wird. Er kann in bevorzugten Ausführungsformen die Werte 1, 2 oder 4 annehmen, obwohl er in der Tat, wenn gewünscht, andere Werte annehmen kann, einschließlich negativer Werte, wenn angebracht.
- BASEWRAP Dies bestimmt die Decke der Basisberechnung. Das Basisumbruchmodul kann die Werte 2, 4, 8 annehmen.
- REGWRAP Dies bestimmt die Decke der Neuzuordnungsberechnung. Das Registerumbruchmodul kann die Werte 2, 4, 8 annehmen. REGWRAP kann gewählt werden, so daß er gleich mit REGCOUNT ist.
- Zu Fig. 6 zurückkehrend, gibt es folgendes Beispiel, wie die verschiedenen Parameter von dem Neuzuordnungsblock 56 verwendet werden (in diesem Beispiel sind die logischen und physikalischen Registerwerte relativ zu der bestimmten Bank):
- if (logisches Register < REGCOUNT)
- phyikalisches Register = (logisches Register + Basis) MOD REGCOUNT
- else
- physikalisches Register = logisches Register
- end if
- Am Ende der Schleife, bevor die nächste Iteration der Schleife beginnt, wird die folgende Aktualisierung des Basiszeigers durch die Basisaktualisierungslogik 58 ausgeführt:
- Basis = (Basis + BASEINC) MOD BASEWRAP
- Am Ende einer Neuzuordnungsschleife wird die Registerneuzuordnung ausgeschaltet und auf alle Register wird dann wie auf physikalische Register zugegriffen. In bevorzugten Ausführungsformen ist nur ein Neuzuordnungs-REPEAT zu jedem Zeitpunkt aktiv. Schleifen können noch ineinander verschachtelt sein, aber nur eine kann zu einer gegebenen Zeit die Neuzuordnungsvariablen aktualisieren. Jedoch wird es geschätzt, daß, wenn benötigt, Neuzuordnungswiederholungen verschachtelt sein können.
- Um die erreichten Vorzüge darzustellen mit Bezug auf die Codedichte als ein Ergebnis der Anwendung des Neuzuordnungsmechanismus entsprechend der bevorzugten Ausführungsform der vorliegenden Erfindung wird nun ein typischer Blockfilteralgorithmus diskutiert. Die Prinzipien des Blockfilteralgorithmus werden zuerst mit Bezug auf Fig. 7 diskutiert. Wie in Fig. 7 dargestellt, ist ein Akkumulatorregister A0 so angeordnet, um die Ergebnisse von einer Zahl von Multiplikationsoperationen zu akkumulieren, wobei die Multiplikationsoperationen die Multiplikation eines Koeffizienten C0 mit dem Datenobjekt D0 sind, die Multiplikation eines Koeffizienten C1 mit einem Datenobjekt D1, die Multiplikation eines Koeffizienten C2 mit einem Datenobjekt D2 etc. Ein Register A1 akkumuliert die Ergebnisse eines ähnlichen Satzes von Multiplikationsoperationen, aber diesmal wurde der Satz von Koeffizienten verschoben, so daß C0 nun mit D1 multipliziert wird, C1 wird nun mit D2 multipliziert, C2 wird nun mit D3 multipliziert etc. Ähnlich akkumuliert ein Register A2 die Ergebnisse der Multiplikation der Datenwerte mit den Koeffizientenwerten, die um einen anderen Schritt nach rechts verschoben wurden, so daß C0 mit D2 multipliziert wird, C1 mit D3 multipliziert wird, C2 mit D4 multipliziert wird etc. Dieser Verschiebungs-, Multiplizier- und Akkumulierprozeß wird dann mit dem Ergebnis, das im Register A3 plaziert ist, wiederholt.
- Wenn eine Registerneuzuordnung in Übereinstimmung mit der bevorzugten Ausführungsform der vorliegenden Erfindung nicht angewandt wird, dann wird die folgende Befehlsschleife benötigt, um den Blockfilterbefehl auszuführen:
- In diesem Beispiel werden die Datenwerte in der X-Bank der Register plaziert und die Koeffizientenwerte werden in der Y-Bank der Register plaziert. Als ein erster Schritt werden die vier Akkumulator-Register A0, A1, A2 und A3 auf Null gesetzt. Sobald die Akkumulator-Register zurückgesetzt worden sind, wird dann eine Befehlsschleife eingegeben, die von den REPEAT- und NEXT- Befehlen begrenzt wird. Der Wert 21 identifiziert die Anzahl, für die die Befehlsschleife wiederholt werden soll und aus Gründen, die später diskutiert werden, wird diese tatsächlich gleich der Anzahl von Koeffizienten (c0, c1, c2 etc.) geteilt durch 4 sein.
- Die Befehlsschleife weist 16 Multiplizier-Akkumulier-Befehle (MULA) auf, die nach der ersten Iteration durch die Schleife in den Registern A0, A1, A2, A3 resultiert, wobei sie das Ergebnis der Berechnungen, die in dem oben gezeigten Code zwischen dem REPEAT- und dem ersten MULA- Befehl gezeigt sind, einschließt. Um darzustellen, wie der Multiplizier-Akkumulier-Befehl funktioniert, betrachten wir die ersten vier MULA-Befehle. Der erste Befehl multipliziert den Datenwert innerhalb der ersten oder unteren 16 Bits des X-Bankregisters 0 mit den unteren 16 Bits innerhalb des Y- Bankregisters 0 und addiert das Ergebnis zu dem Akkumulator-Register A0. In derselben Zeit werden die unteren 16 Bits des X-Bankregisters 0 von einem Wiederauffüllbit markiert, das anzeigt, daß dieser Teil des Registers nun mit einem neuen Datenwert wieder aufgefüllt werden kann. Es wird auf diese Art markiert, da, wie aus Abb. 4 ersichtlich ist, sobald ein Datenobjekt d0 mit dem Koeffizienten c0 multipliziert ist (dies wird von dem ersten MULA-Befehl repräsentiert, dann wird d0 nicht länger für den Rest des Blockfilterbefehls benötigt und kann so durch einen neuen Datenwert ersetzt werden.
- Der zweite MULA-Befehl multipliziert dann die zweiten oder höheren 16 Bits des X- Bankregisters 0 mit den unteren 16 Bits des Y-Bankregisters 0 (dies repräsentiert die Multiplikation d1 · c0, die in Fig. 7 gezeigt wird). Gleichfalls repräsentieren der dritte und vierte MULA-Befehl die Multiplikationen d2 · c0 und d3 · c0 entsprechend. Wie aus Figur T offensichtlich ist, wird, sobald das Datenobjekt d0 mit dem Koeffizienten c0 multipliziert worden ist (dies wird durch den ersten MULA-Befehl repräsentiert), dann d0 nicht länger für den Rest des Blockfilters benötigt und kann so von einem neuen Datenwert ersetzt werden.
- Der zweite MULA-Befehl multipliziert dann die zweiten oder höheren 16 Bits des X- Bankregisters 0 mit den unteren 16 Bits des Y-Bankregisters 0 (dies repräsentiert die Multiplikation d1 · c0, die in Fig. 7 gezeigt wird). Ähnlich repräsentieren der dritte und vierte MULA-Befehl die Multiplikationen d0 · c0 und d3 · c0 entsprechend. Wie aus Fig. 7 offensichtlich ist, wird der Koeffizient c0 nicht länger benötigt, sobald diese vier Berechnungen durchgeführt worden sind, und das Register Y0.I wird mit einem Wiederauffüllbit markiert, um zu ermöglichen, daß es mit einem anderen Koeffizienten (c4) überschrieben wird.
- Die nächsten vier MULA-Befehle repräsentieren die Berechnungen d1 · c1, d2 · c1, b3 · c1 und b4 · c1 entsprechend. Sobald die Berechnung d1 · c1 durchgeführt worden ist, wird das Register X0.h mit einem Wiederauffüllbit markiert, da d1 nicht länger benötigt wird. Ähnlich, sobald alle vier Berechnungen durchgeführt worden sind, wird das Register Y0.h zum Wiederauffüllen markiert, da der Koeffizient c1 nicht länger benötigt wird. Ähnlich, die nächsten vier MULA-Befehle entsprechend den Berechnungen d2 · c2, d3 · c2, d4 · c2 und d5 · c2, während die letzten vier Berechnungen entsprechend den Berechnungen d3 · c3, d4 · c3, d5 · c3 und d6 · c3. Da in der oben beschriebenen Ausführungsform Register nicht neu zugeordnet werden können, muß jede Multiplikationsoperation explizit reproduziert werden mit dem benötigten spezifischen Register, das in den Operanden als Ziel benannt wurde. Sobald die 16 MULA-Befehle ausgeführt worden sind, kann die Befehlsschleife für die Koeffizienten c4 bis c7 und die Datenobjekte d4 bis d10 wiederholt werden. Weil die Schleife auf vier Koeffizientenwerte pro Iteration wirkt, muß dann die Anzahl von Koeffizientenwerten ein Vielfaches von 4 sein und die Berechnung 21 = Anzahl der Koeffizienten/4 muß berechnet werden.
- Durch Anwenden des Neuzuordnungsmechanismus in Übereinstimmung mit der bevorzugten Ausführungsform der vorliegenden Erfindung kann die Befehlsschleife dramatisch reduziert werden, so daß sie nun nur vier Multiplizier-Akkumuüer-Befehle einschließt, anstatt den 16 Multiplizier- Akkumulier-Befehlen, die sonst benötigt werden. Den Neuzuordnungsmechanismus verwendend, kann der Code nun wie folgt geschrieben werden:
- Wie zuvor ist der erste Schritt dazu da, die vier Akkumulator-Register A0 bis A3 auf Null zu setzen. Dann wird die Befehlsschleife eingegeben, die von den REPEAT- und NEXT-Opcodes begrenzt wird. Der REPEAT-Befehl hat eine Anzahl von Parametern, die mit ihm assoziiert sind; diese sind wie folgt:
- X++ :zeigt an, daß BASEINC "1" ist für die X-Bank der Register
- n4 :zeigt an, daß REGCOUNT "4" ist und daher die ersten vier X-Bankregister X0.I bis X1.h neu zuzuordnen sind.
- w4 :zeigt an, daß BASEWRAP "4" ist für die X-Bank der Register
- r4 :zeigt an, daß REGWRAP "4" ist für die X-Bank des Registers
- Y++ :zeigt an, daß BASEINC "1" ist für die X-Bank der Register
- n4 :zeigt an, daß REGCOUNT "4" ist und daher die ersten vier Y-Bankregister Y0.I bis Y1.h neu zuzuordnen sind
- w4 :zeigt an, daß BASEWRAP "4" ist für die Y-Bank der Register
- r4: zeigt an, daß REGWRAP "4" ist für die Y-Bank der Register
- Es sollte auch beachtet werden, daß nun der Wert 21 gleich der Anzahl von Koeffizienten ist, statt daß er gleich der Anzahl der Koeffizienten/4 ist wie in dem Beispiel aus dem Stand der Technik.
- Für die erste Iteration der Befehlsschleife ist der Basiszeigerwert Null und es gibt keine Neuzuordnung. Jedoch ist das nächste Mal, wenn die Schleife ausgeführt wird, der Basiszeigerwert "1" für beide, die X- und Y-Banken. 5o werden die Operanden wie folgt neu zugeordnet:
- X0.I wird Xo.h
- X0.h wird X1.I
- X1.I wird X1.h
- X1.h wird X0.I (da BASEWRAP "4" ist)
- Y0.I wird Y0.h
- Y0.h wird Y1.I
- Y1.I wird Y1.h
- Y1.h wird Y0.I (da BASEWRAP "4" ist)
- Daher kann gesehen werden, daß in der zweiten Iteration die vier MULA-Befehle in der Tat die Berechnungen, die von den fünften bis achten MULA-Befehlen in dem früher diskutierten Beispiel, das die Neuzuordnung der vorliegenden Erfindung nicht umfaßt, identifiziert werden. Ähnlich führen die dritte und vierte Iteration durch die Schleife die Berechnungen aus, die zuvor von den neunten bis zwölften und dreizehnten bis sechzehnten MULA-Befehlen aus dem Code des Standes der Technik ausgeführt wurden.
- Daher kann gesehen werden, daß der obige Code exakt den gleichen Blockfilteralgorithmus ausführt wie der Code des Standes der Technik, aber die Codedichte innerhalb des Schleifenkörpers um einen Faktor vier verbessert, da nur vier Befehle geliefert werden müssen statt den sechzehn, die vom Stand der Technik benötigt werden.
- Durch Anwenden der Registerneuzuordnungstechnik in Übereinstimmung mit bevorzugten Ausführungsformen der vorliegenden Erfindung können die folgenden Vorteile realisiert werden:
- 1. Sie verbessert die Codedichte;
- 2. Sie kann in bestimmten Situationen die Wartezeit von dem Markieren eines Registers als leer bis zu dem Wiederbefüllen dieses Registers durch den Neuordnungspuffer des Piccolo beseitigen. Dies könnte von ablaufenden Schleifen auf Kosten einer erhöhten Codegröße erreicht werden;
- 3. Sie ermöglicht, daß auf eine variable Anzahl von Registern zugegriffen werden kann - durch Variation der Anzahl von durchgeführten Schleifeniterationen kann die Anzahl der Register, auf die zugegriffen werden kann, variiert werden; und
- 4. Sie kann die Entwicklung von Algorithmen erleichtern. Für geeignete Algorithmen kann der Programmierer ein Stück eines Codes für die n-te Stufe des Algorithmus produzieren und dann Registerneuzuordnung verwenden, um die Formel auf einen gleitenden Satz von Daten anzuwenden.
- Es wird offensichtlich sein, daß bestimmte Änderungen an dem oben beschriebenen Registerneuzuordnungsmechanismus gemacht werden können, ohne den Rahmen der vorliegenden Erfindung zu verlassen. Zum Beispiel ist es möglich, auf jeder Registerbank 10 mehr physikalische Register zur Verfügung zu stellen als von dem Programmierer in einem Befehlsoperanden spezifiziert werden können. Während diese zusätzlichen Register nicht direkt angesprochen werden können, kann der Registerneuzuordnungsmechanismus diese Register verfügbar machen. Zum Beispiel, betrachtet man das früher diskutierte Beispiel, in dem die X-Bank der Register vier 32-Bit- Register hat, die dem Programmierer verfügbar sind, und daher acht 16-Bit-Register von dem logischen Registeraufruf spezifiziert werden können. Es ist möglich, daß die X-Registerbank, tatsächlich aus z. B. sechs 32-Bit-Registern besteht; in diesem Fall gibfes vier zusätzliche 16-Bit-Register, die dem Programmierer nicht direkt zugänglich sind. Jedoch können diese zusätzlichen vier Register verfügbar gemacht werden durch den Neuzuordnungsmechanismus, der dabei zusätzliche Register für die Speicherung der Datenobjekte zur Verfügung stellt.
- Die folgende Assembler-Syntax könnte verwendet werden:
- ROR bedeutet nach rechts drehen.
- SAT(a) bedeutet den gesättigten Wert von a (gesättigt für 16 oder 32 Bits, abhängig von der Größe des Zielregisters). Genauer wird jeder Wert größer äls +0x7fff durch +0x7fff ersetzt und jeder Wert kleiner als -0x8000 wird durch -0x8000 ersetzt, um auf 16 Bits zu sättigen. Sättigung auf 32 Bits ist gleichbedeutend mit den Extrema +0x7fffffff und -0x80000000. Wenn das Zielregister 48 Bits ist, ist die Sättigung immer noch bei 32 Bits.
- Der Source-Operand 1 kann eines der folgenden Formate sein:
- Der Source-Operand 2 kann eines aus den folgenden Formaten sein:
- < src2> ist eine Abkürzung für drei Optionen:
- Für Befehle, die einen dritten Operanden spezifizieren:
- Das Zielregister hat das Format:
- Der Ausdruck < cond> ist eine Abkürzung für einen jeden aus den folgenden Bedingungscodes. Beachten Sie, daß die Codierung ein wenig unterschiedlich von dem ARM ist, da die LS- und HI-Codes ohne Vorzeichen durch nützlichere Überlauf/Unterlauf-Tests mit Vorzeichen ersetzt wurden. Die V- und N-Marken werden auf dem Piccolo verschieden von dem ARM gesetzt, so daß auch die Übersetzung von dem Bedingungstesten zu der Markenüberprüfung nicht die gleiche ist wie in dem ARM.
- Da sich der Piccolo mit vorzeichenbehafteten Größen befaßt, wurden die LS- und HI- Bedingungen ohne Vorzeichen ausgelassen und durch VP und VN ersetzt, die die Richtung eines jeden Überlaufs beschreiben. Da das Ergebnis des ALU 48 Bits breit ist, erfüllen nun MI und LT die gleiche Funktion, ähnlich PL und GE. Dies läßt 3 Plätze für zukünftige Erweiterungen.
- Alle Operationen sind vorzeichenbehaftet, falls nicht anderweitig angezeigt.
- Die primären und sekundären Bedingungscodes weisen jeder auf:
- N - negativ.
- Z - Null.
- C - Übertragen/Überlauf ohne Vorzeichen.
- V - vorzeichenbehafteter Überlauf.
- Arithmetische Befehle können in zwei Typen unterteilt werden; parallele und solche mit voller Breite ("full width"). Die "full width"-Befehle setzen nur die primären Marken, wohingegen die parallelen Operatoren die primären und sekundären Marken setzen, die auf den oberen und unteren 16-Bit- Hälften des Ergebnisses basieren.
- Die N-, Z- und V-Marken werden berechnet, basierend auf dem ganzen ALU-Ergebnis, nachdem die Skalierung angewandt wurde, jedoch bevor sie in die Ziele geschrieben werden. Ein ASR wird immer die Anzahl von Bits, die benötigt werden, um das Ergebnis zu speichern, reduzieren, aber ein ASL würde sie immer erhöhen. Um dies zu vermeiden, schneidet der Piccolo die 48- Bit-Ergebnisse immer ab, wenn eine ASL-Skala/Skalierung angewandt wird, um die Anzahl von Bits zu limitieren, über die Nulldetektion und Overflow ausgeführt werden müssen.
- Die N-Marke wird berechnet, annehmend, daß eine vorzeichenbehaftete Arithmetik ausgeführt wird. Dies ist so, weil, wenn ein Overflow auftritt, das signifikanteste Bit des Ergebnisses entweder die C-Marke oder die N-Marke ist, abhängig davon, ob der Eingangs-Operand vorzeichenbehaftet ist oder ohne Vorzeichen ist.
- Die V-Marke zeigt an, wenn irgendein Verlust an Präzision als Ergebnis des Schreibens des Ergebnisses in das gewählte Ziel auftritt. Wenn kein Zurückschreiben gewählt ist, ist trotzdem eine Größe impliziert und die Overflow-Marke ist richtig gesetzt. Overflow kann auftreten:
- - Falls in ein 16-Bit-Register geschrieben wird, wenn das Ergebnis nicht in dem Bereich -2^15 bis 2^15 - 1 liegt.
- - Falls in ein 32-Bit-Register geschrieben wird, wenn das Ergebnis nicht in dem Bereich -2^31 bis 2^31 - 1 liegt.
- Parallele Addier-/Subtrahier-Befehle setzen die N-, Z-, V-Marken unabhängig auf die oberen und unteren Hälften des Ergebnisses.
- Wenn in einen Akkumulator geschrieben wird, ist die V-Marke gesetzt, als ob in ein 32-Bit- Register geschrieben würde. Dies ist so, um eine Sättigung von Befehlen zu erlauben, um Akkumulatoren als 32-Bit-Register zu verwenden.
- Der sättigende absolute Befehl (SABS) setzt auch die Überlauf-Marke, wenn der absolute Wert des Eingangs-Operanden nicht in die vorbestimmte Zieladresse passen würde.
- Die Übertragsmarke wird von Addier- und Subtrahierbefehlen gesetzt und wird als "binäre" Marke von den MAX/IMIN-, SABS- und CLB-Befehlen benutzt. Alle anderen Befehle einschließlich der Multiplizieroperationen erhalten die Übertragsmarke(n).
- Für Addier- und Subtrahieroperationen ist der Übertrag das, was von entweder Bit 31 oder Bit 15 oder dem Ergebnis generiert wird, abhängig davon, ob die Zieladresse 32 oder 16 Bits breit ist.
- Die standard-arithmetischen Befehle können in eine Anzahl von Typen unterteilt werden, in Abhängigkeit davon, wie die Marken gesetzt sind:
- Im Falle von Addier- und Subtrahierbefehlen, wenn das N-Bit gesetzt ist, dann werden alle Marken erhalten. Wenn das N-Bit nicht gesetzt ist, dann werden die Marken wie folgt aktualisiert:
- Z wird gesetzt, wenn das gesamte 48-Bit-Ergebnis 0 war.
- N wird gesetzt, wenn das gesamte 48-Bit-Ergebnis das Bit 47 gesetzt hatte (negativ war).
- V wird gesetzt, wenn entweder:
- Das Zielregister 16-Bit ist und das vorzeichenbehaftete Ergebnis nicht in ein 16-Bit- Register paßt (nicht in den Bereich -2^15 ≤ x < 2^15).
- Das Zielregister ein 32/48-Bit-Register ist und das vorzeichenbehaftete Ergebnis nicht in 32 Bits paßt.
- Wenn < dest> ein 32- oder 48-Bit-Register ist, dann wird die C-Marke gesetzt, wenn es einen Überlauf aus Bit 31 gibt bei der Summierung von < src1> und < src2> oder wenn kein Borgen von Bit 31 auftritt bei der Subtraktion von < scr2> von < src1> (der gleiche Übertragswert, den man auf dem ARM erwarten würde). Wenn < dest> ein 16-Bit-Register ist, dann wird die C-Marke gesetzt, wenn es einen Überlauf aus Bit 15 der Summe gibt.
- Die sekundären Marken (S2, SN, SV, SC) werden erhalten.
- Im Falle von Befehlen, die entweder eine Multiplikation oder Akkumulierung eines 48-Bit- Registers ausführen:
- Z wird gesetzt, wenn das gesamte 48-Bit-Ergebnis 0 war.
- N wird gesetzt, wenn das gesamte 48-Bit-Ergebnis Bit 47 gesetzt hatte (negativ war).
- V wird gesetzt, wenn entweder (1) das Zielregister 16-Bit ist und das vorzeichenbehaftete
- Ergebnis nicht in ein 16-Bit-Register paßt (nicht in dem Bereich in -2^15 ≤ x < 2^15) oder (2) das Zielregister ein 32/48-Bit-Register ist und das vorzeichenbehaftete Ergebnis nicht in 32 Bits paßt.
- C wird erhalten.
- Die sekundären Marken (SZ, SN, SV, SC) werden erhalten.
- Die anderen Befehle einschließlich logischer Operationen, paralleler Additionen und Subtraktionen, max und min. Verschiebungen etc. werden unten behandelt.
- Die Addier- und Subtrahierbefehle addieren oder subtrahieren zwei Register, skalieren das Ergebnis und speichern dann zurück in ein Register. Die Operanden werden behandelt wird vorzeichenbehaftete Werte. Das Aktualisieren von Marken für nicht sättigende Varianten ist optional und kann durch Anhängen eines N an das Ende des Befehls unterdrückt werden.
- OPC spezifiziert den Typ des Befehls.
- Handlung (OPC):
- Kürzel:
- Der Assembler unterstützt die folgenden Opcodes:
- CMP ist eine Subtraktion, welche die Marken setzt, wobei das Schreiben in ein Register ausgeschaltet ist. CMM ist eine Addition, welche die Marken setzt, wobei das Schreiben in ein Register ausgeschaltet ist.
- Marken:
- Diese wurden oben diskutiert.
- Gründe für eine Einbeziehung:
- ADC ist nützlich für das Einfügen eines Überlaufs in den unteren Teil eines Registers, eines Verschiebe/MAX/MIN-Befehls. Es wird auch verwendet, um eine 32/32-Bit-Division durchzuführen. Es liefert auch Additionen mit erweiterter Präzision. Die Addition eines N Bits gibt feinere Steuerung über die Marken, speziell über die des Überlaufs. Dies ermöglicht eine 32/32-Bit-Division bei zwei Zyklen pro Bit.
- Gesättigte Additionen und Subtraktionen werden für G.729 etc. benötigt.
- Ansteigende/absteigende Zähler. RSB ist nützlich zum Berechnen von Verschiebungen (x = 32 - x ist eine gewöhnliche Operation). Ein gesättigter RSB wird für eine gesättigte Negation benötigt (verwendet in G.729).
- Addier-/Subtrahier-Akkumulier-Befehle führen Addition und Subtraktion mit Akkumulation und Skalierung/Sättigung durch. Die Nummer des Akkumulators kann nicht wie die Multiplizier- Akkumulier-Befehle unabhängig von dem Zielregister spezifiziert werden. Die unteren zwei Bits des Zielregisters geben die Nummer, acc, des 48-Bit-Akkumulators an, in die akkumuliert wird. Daher sind ADDA X0, X1, X2, A0 und ADDA A3, X1, X2, A3 gültig, aber ADDA X1, X1, X2, A0 ist es nicht. Mit dieser Befehlsklasse muß das Ergebnis zurück in ein Register geschrieben werden - die nicht- Zurückschreib-Codierungen des Zielfeldes sind nicht erlaubt.
- OPC spezifiziert den Typ des Befehls. Im folgenden ist acc gleich (DEST[1 : 0]). Das Sa-Bit zeigt eine Sättigung an.
- Handlung (OPC):
- Kürzel:
- Ein S vor der Anweisung zeigt Sättigung an.
- Marken:
- Siehe oben.
- Gründe für die Einbeziehung:
- Der ADDA- (Addier-Akkumulier-) Befehl ist nützlich zum Addieren zweier Worte eines Arrays von ganzen Zahlen mit einem Akkumulator (z. B. um ihr Mittel zu finden) pro Zyklus. Der SUBA- (Subtrahier-Akkumulier-) Befehl ist nützlich in der Berechnung der Summe der Differenzen (zur Korrelation); er subtrahiert zwei separate Werte und addiert die Differenz in ein drittes Register.
- Addition mit Rundung kann durchgeführt werden durch Verwenden von < dest> im Unterschied zu < acc> . Zum Beispiel X0 = (X1 + X2 + 16384) > > 15 kann in einem Zyklus durchgeführt werden durch Halten von 16384 in A0. Addition mit einer Rundungskonstante kann durchgeführt werden durch ADDA X0, X1, #16384, A0.
- Für eine bitgenaue Implementierung von:
- sum von ((a_i*b_i) > > k) (recht üblich - verwendet in TrueSpeech)
- der Standard-Piccolo würde sein:
- Es gibt zwei Probleme mit diesem Code; er ist zu lang und die Additionen sind nicht in 48-Bit- Präzision, so können Wächterbits nicht benutzt werden. Eine bessere Lösung ist es, ADDA zu verwenden:
- Dies gibt eine 25%-ige Verbesserung der Geschwindigkeit und bewahrt eine 48-Bit-Genauigkeit.
- Addition/Subtraktion in Parallelbefehlen führt Addition und Subtraktion auf zwei vorzeichenbehaftete 16-Bit-Größen, die in Paaren in 32-Bit-Registern gehalten werden, aus. Die primären Bedingungscodemarken werden von dem Ergebnis der signifikantesten 16 Bits gesetzt, die sekundären Marken werden von der am wenigsten signifikanten Hälfte aktualisiert. Nur 32-Bit-Register können als die Quelle für diese Befehle spezifiziert werden, obwohl die Werte halbwortgetauscht werden können. Die individuellen Hälften eines jeden Registers werden wie vorzeichenbehaftete Werte behandelt. Die Berechnungen und Skalierungen werden ohne Verlust an Präzision durchgeführt. Daher produzieren ADDADD X0, X1, X2, ASR#1 die richtigen Mittel in den oberen und unteren Hälften von X0. Optional wird Sättigung für jeden Befehl geliefert, für den das Sa-Bit gesetzt werden muß.
- OPC definiert die Operation.
- Handlung (OPC):
- Jede Summe/Differenz ist unabhängig gesättigt, wenn das Sa-Bit gesetzt ist.
- Kürzel:
- Ein S vor der Anweisung zeigt Sättigung an.
- Der Assembler unterstützt auch
- generiert von den Standardbefehlen ohne Zurückschreiben.
- Marken:
- C wird gesetzt, wenn es einen Überlauf aus Bit 15 gibt, wenn die beiden oberen 16-Bit- Hälften addiert werden.
- Z wird gesetzt, wenn die Summe der oberen 16-Bit-Hälften 0 ist.
- N wird gesetzt, wenn die Summe der oberen 16-Bit-Hälften negativ ist.
- V wird gesetzt, wenn die vorzeichenbehaftete 17-Bit-Summe der oberen 16-Bit-Hälften nicht in 16 Bits (nach Skalieren) paßt.
- SZ, SN, SV und SC werden gleich für die unteren 16-Bit-Hälften gesetzt.
- Gründe für eine Einbeziehung:
- Die parallelen Addier-/Subtrahier-Befehle sind nützlich zum Ausführen von Befehlen auf komplexe Zahlen, die in einem einzelnen 32-Bit-Register gehalten werden. Sie werden in dem FFT-Kernel benutzt. Es ist auch nützlich für einfache Addition/Subtraktion von Vektoren von 16-Bit-Daten, wobei es erlaubt ist, zwei Elemente pro Zyklus zu bearbeiten.
- Der Verzweigungs- (Bedingungs-) Befehl erlaubt bedingte Wechsel im Steuerstrom. Der Piccolo kann drei Zyklen nehmen, um eine genommenen Verzweigung auszuführen.
- Handlung:
- Verzweigung durch Offset, wenn < cond> entsprechend den primären Marken hält.
- Der Offset ist eine vorzeichenbehaftete 16-Bit-Anzahl von Worten. Im Moment ist der Bereich des Offsets von -32768 bis +32767 Worte beschränkt.
- Die ausgeführte Adressenberechnung ist
- Zieladresse = Verzweigungsbefehlsadresse + 4 + OFFSET
- Kürzel:
- Marken:
- Unbeeinflußt.
- Gründe für eine Einbeziehung:
- Hochgradig nützlich in den meisten Routinen.
- Bedingte Addier- oder Subtrahierbefehle addieren oder subtrahieren bedingt src2 zu src1.
- OPC spezifiziert den Typ des Befehls.
- Handlung (OPC):
- 0 wenn (Überlauf gesetzt) temp = src1-src2, sonst temp = src1 + src2 dest = temp {- > > scale}
- 1 wenn (Überlauf gesetzt) temp = src1 + src2, sonst temp = src1 + src2 dest = temp {- > > scale}, ABER wenn scale eine Verschiebung nach links ist, dann wird der neue Wert des Überlaufs (aus src1 - src2 oder src1 + src2) in den unteren Teil verschoben.
- Kürzel:
- Marken:
- Siehe oben.
- Gründe für die Einbeziehung:
- Der bedingte Addier- oder Subtrahierbefehl ermöglicht die Konstruktion von effizienten Dividiercodes.
- Beispiel 1: Teile den 32-Bit-Wert ohne Vorzeichen in X0 durch den 16-Bit-Wert ohne Vorzeichen in X1 (unter der Annahme, daß X0 < (XI < < 16) und X1.h = 0).
- An dem Ende der Schleife hält X0.I den Quotienten der Division. Der Rest kann wiederhergestellt werden aus X0.h, abhängig von dem Wert des Überlaufs.
- Beispiel 2: Dividiere den positiven 32-Bit-Wert in X0 durch den positiven 32-Bit-Wert in X1 mit frühzeitiger Beendung.
- Am Ende hält X2 den Quotienten und der Rest kann aus X0 wiederhergestellt werden.
- Der Count Leading Bits-Befehl erlaubt, die Daten zu normalisieren.
- Handlung:
- dest wird auf die Anzahl von Plätzen gesetzt, um die der Wert in src1 nach links verschoben werden muß, damit Bit 31 verschieden von Bit 30 ist. Dies ist ein Wert in dem Bereich 0-30 außer in speziellen Fällen, wo src1 entweder -1 oder 0 ist, wenn 31 zurückgegeben wird. Kürzel:
- Marken:
- Z wird gesetzt, wenn das Ergebnis Null ist.
- N wird freigemacht.
- C wird gesetzt, wenn src1 entweder -1 oder 0 ist.
- V wird erhalten.
- Gründe für eine Einbeziehung:
- Der Schritt wird für eine Normalisierung benötigt.
- Halt- und Breakpoint-Befehle werden bereitgestellt zum Anhalten der Piccolo-Ausführung.
- OPC spezifiziert den Typ des Befehls.
- Handlung (OPC):
- 0 Die Piccolo-Ausführung wird angehalten und das Halt-Bit in dem Piccolo- Statusregister wird gesetzt.
- 1 Die Piccolo-Ausführung wird angehalten, das Break-Bit in dem Piccolo-Statusregister wird gesetzt und der ARM wird unterbrochen, um zu sagen, daß ein Breakpoint erreicht wurde.
- Kürzel:
- 0 HALT
- 1 BREAK
- Marken:
- Unbeeinflußt.
- Logische Operationsbefehle führen eine logische Operation auf ein 32- oder 16-Bit-Register aus. Die Operanden werden als Werte ohne Vorzeichen behandelt.
- OPC codiert die auszuführende logische Operation.
- Handlung (OPC):
- Kürzel:
- Der Assembler unterstützt die folgenden Opcodes:
- TST ist ein AND, wobei das Schreiben in ein Register ausgeschaltet ist. TEQ ist ein EOR, wobei das Schreiben in ein Register ausgeschaltet ist.
- Marken:
- Z wird gesetzt, wenn das Ergebnis nur aus Nullen besteht.
- N, C, V werden erhalten.
- SN, SC, SV werden erhalten.
- Gründe für die Einbeziehung:
- Sprachkompressionsalgorithmen verwenden gepackte Bitfelder zur Codierung von Information. Bitmaskierungsbefehle helfen, diese Felder zu entpacken/packen.
- Max- und Min-Operationsbefehle führen Maximum- und Minimum-Operationen aus.
- OPC spezifiziert den Typ des Befehls.
- Handlung (OPC):
- Kürzel:
- Marken:
- Z wird gesetzt, wenn das Ergebnis Null ist.
- N wird gesetzt, wenn das Ergebnis negativ ist.
- C für Max: C wird gesetzt, wenn src2 > = src1 (dest = src1 Fall)
- für Min: C wird gesetzt, wenn src2 > = src1 (dest = src2 Fall)
- V erhalten.
- Gründe für eine Einbeziehung:
- Um die Stärke eines Signals zu finden, scannen viele Algorithmen eine Probe, um das Minimum/Maximum des absoluten Wertes der Probe zu finden. Die MAX- und MIN-Operationen sind unschätzbar für dies. Abhängig davon, ob man wünscht, das erste oder letzte Maximum in dem Signal zu finden, können die Operanden src1 und src2 vertauscht werden.
- MAX X0, X0, #0 konvertiert X0 in eine positive Zahl mit unterem Abschneiden.
- MIN X0, X0, #255 schneidet X0 oben ab. Dies ist nützlich für die Verarbeitung von Grafiken.
- Max- und Min-Operationen in Parallelbefehlen führen Maximum- und Minimum-Operationen an parallelen 16-Bit-Daten aus.
- OPC spezifiziert den Typ des Befehls.
- Handlung (OPC):
- Kürzel:
- Marken:
- Z wird gesetzt, wenn die oberen 16 Bits des Ergebnisses Null sind.
- N wird gesetzt, wenn die oberen 16 Bits des Ergebnisses negativ sind.
- C für Max: C wird gesetzt, wenn src2.h > = src1.h (dest = src1 Fall) für Min: C wird gesetzt, wenn src2.h > = src1.h (dest = src2 Fall)
- V erhalten.
- SZ, SN, SC, SV werden gleich gesetzt für die unteren 16-Bit-Hälften.
- Gründe für die Einbeziehung:
- Wie für 32-Bit Max und Min.
- Bewege-Lange-Immediate-Operations-Befehle erlauben, ein Register auf jeden vorzeichenbehafteten 16-Bit-Wert, der um ein Vorzeichen erweitert ist. Zwei von diesen Befehlen können ein 32-Bit-Register auf einen jeden Wert setzen (durch Zugreifen auf die obere und untere Hälfte in Sequenz). Für Bewegungen zwischen Registern siehe die Auswahloperationen.
- Kürzel:
- Der Assembler wird eine nicht sperrende NOP-Operation liefern, die diesen MOV-Befehl verwendet, d. h. NOP ist äquivalent zu MOV, #0.
- Marken:
- Marken sind unbeeinflußt.
- Gründe für eine Einbeziehung:
- Initialisieren der Register/Zähler.
- Multiplizier-Akkumulier-Operationsbefehle führen vorzeichenbehaftete Multiplikation mit Akkumulation oder Deakkumulation, Skalieren und Sättigen aus.
- Das Feld OPC spezifiziert den Befehlstyp.
- Handlung (OPC):
- In jedem Fall ist das Ergebnis gesättigt, bevor es in das Ziel geschrieben wird, wenn das Sa- Bit gesetzt ist.
- Kürzel:
- Ein S vor dem Befehl zeigt Sättigung an.
- Marken:
- Siehe den oberen Abschnitt.
- Gründe für die Einbeziehung:
- Ein in einem Zyklus aufrechterhaltener MULA wird für einen FIR-Code benötigt. MULS werden in dem FFT-Butterfly verwendet. Ein MULA ist auch nützlich zum Multiplizieren mit Rundung. Zum Beispiel A0 = (X0*X1 + 16384) > > 15 kann in einem Zyklus ausgeführt werden durch Halten von 16384 in einem anderen Akkumulator (z. B. A1). Unterschiedliche < dest> und < acc> werden auch benötigt für den FFT-Kernel.
- Multiplizier-Verdoppel-Operationsbefehle führen vorzeichenbehaftete Multiplikationen aus, wobei das Ergebnis vor einer Akkumulation oder einer Deakkumulation, Skalierung oder Sättigung verdoppelt wird.
- OPC spezifiziert den Befehlstyp.
- Handlung (OPC):
- Kürzel:
- Marken:
- Siehe den oberen Abschnitt.
- Gründe für eine Einbeziehung:
- Der MLD-Befehl wird benötigt für G.729 und andere Algorithmen, die fraktionale Arithmetik verwenden. Die meisten DSPs liefern einen fraktionalen Modus, der eine Verschiebung nach links eines Bits an dem Ausgang des Multiplizierers ermöglicht vor einer Akkumulation oder Zurückschreibung. Die Unterstützung dessen als ein spezifischer Befehl bietet mehr Flexibilität beim Programmieren. Die Namensäquivalente für einige der G-Serien-Grundbefehle:
- L_msu = > SMLDS
- L_mac = > SMLDA
- Diese machen Gebrauch von der Sättigung des Multiplizierers, wenn sie nach links um ein Bit verschieben. Wenn eine Sequenz von fraktionalen Multiplizier-Akkumulierern benötigt wird, ohne Vertust an Präzision, kann MULA verwendet werden, wobei die Summe im 33.14-Format aufrechterhalten wird. Eine Verschiebung nach links und Sättigung kann am Ende verwendet werden, um in ein 1.15-Format zu konvertieren, falls benötigt.
- Multiplizieroperationsbefehle führen vorzeichenbehaftete Multiplikation aus und optional Skalierung/Sättigung. Die Quellenregister (nur 16-Bit) werden als vorzeichenbehaftete Zahlen behandelt.
- OPC spezifiziert den Befehlstyp.
- Handlung (OPC):
- Kürzel:
- Marken:
- Siehe oberer Abschnitt.
- Gründe für die Einbeziehung:
- Vorzeichenbehaftete und gesättigte Vielfache werden von vielen Prozessen benötigt.
- Registerlistenoperationen werden verwendet, um Handlungen auf einen Satz von Registern anzuwenden. Die Empty- und Zero-Befehle werden zur Verfügung gestellt, um eine Auswahl von Registern zurückzusetzen, bevor oder zwischen Routinen. Der Ausgangs-Befehl wird bereitgestellt, um den Inhalt einer Liste von Registern in den Ausgangs-FIFO zu speichern.
- OPC spezifiziert den Befehlstyp.
- Handlung (OPC):
- 000 für (k = 0; k < 16; k++) wenn Bit k der Registerliste gesetzt ist, dann ist Register k als leer markiert.
- 001 für (k = 0; k < 16; k++) wenn Bit k aus der Registerliste gesetzt ist, dann ist das Register k gesetzt, um 0 zu enthalten.
- 010 undefiniert
- 011 undefiniert
- 100 für (k = 0; k < 16; k++) wenn Bit k aus der Registerliste gesetzt ist, dann (Register k - > > scale) wird in den Ausgangs-FIFO geschrieben.
- 101 für (k = 0; k < 16; k++) wenn Bit k aus der Registerliste gesetzt ist, dann wird (Register k - > > scale) in den Ausgangs-FIFO geschrieben und Register k wird als leer markiert.
- 110 für (k = 0; k < 16; k++) wenn Bit k aus der Registerliste gesetzt ist, dann wird SAT (Register k - > > scale) in den Ausgangs-FIFO geschrieben.
- 111 für (k = 0; k < 16; k++) wenn Bit k aus der Registerliste gesetzt ist, dann wird SAT (Register k -» scale) in den Ausgangs-FIFO geschrieben und Register k wird als leer markiert.
- Kürzel:
- Marken:
- Unbeeinflußt. Beispiele:
- Der Assembler unterstützt außerdem die Syntax
- OUTPUT Rn
- In diesem Fall wird er ein Register ausgeben, wobei ein MOV^, Rn-Befehl verwendet wird.
- Der EMPTY-Befehl wird unterbrechen, bis alle zu leerenden Register gültige Daten enthalten (d. h. nicht leer sind).
- Registerlistenoperationen dürfen nicht innerhalb von Neuzuordnungs-REPEAT-Schleifen verwendet werden.
- Der OUTPUT-Befehl kann nur bis zu acht Register zur Ausgabe spezifizieren.
- Gründe für eine Einbeziehung:
- Nachdem eine Routine geendet hat, erwartet die nächste Routine, daß alle Register leer sind, so daß sie Daten von dem ARM empfangen kann. Ein EMPTY-Befehl wird benötigt, um dies zu erreichen. Bevor ein FIR oder andere Filter ausgeführt werden, müssen alle Akkumulatoren und Teilergebnisse zu Null gesetzt werden. Der ZERO-Befehl hilft dabei. Beide sind gestaltet, um die Codedichte zu verbessern, durch Ersetzen einer Serie von einzelnen Registerbewegungen. Der OUT- PUT-Befehl wird eingeschlossen, um die Codedichte zu erhöhen, durch Ersetzen einer Serie von MOVA, Rn-Befehlen.
- Ein Neuzuordnungsparameter-Bewegungsbefehl RMOV wird bereitgestellt, um die Konfiguration der benutzerdefinierten Registerneuzuordnungsparameter zu erlauben.
- Die Befehlscodierung ist wie folgt:
- Jedes PARAMS-Feld weist die folgenden Einträge auf:
- Die Bedeutung dieser Einträge ist unten beschrieben.
- Kürzel:
- Das < PARAMS> -Feld hat das folgende Format:
- Wenn der RMOV-Befehl verwendet wird, während eine Neuzuordnung aktiv ist, ist das Verhalten unvorhersagbar.
- Marken:
- Unbeeinflußt.
- Repeat-Befehle liefern vier Nullzyklusschleifen in Hardware. Der REPEAT-Befehl definiert eine neue Hardwareschleife. Der Piccolo verwendet Hardwareschleife 0 für den ersten REPEAT- Befehl, Hardwareschleife 1 für einen REPEAT-Befehl, der innerhalb des ersten REPEAT-Befehls verschachtelt ist usw. Der REPEAT-Befehl muß nicht spezifizieren, welche Schleife verwendet wird. REPEAT-Schleifen müssen strikt verschachtelt sein. Wenn ein Versuch gemacht wird, Schleifen in einer Tiefe größer als 4 zu verschachteln, dann ist das Verhalten unvorhersehbar.
- Jeder REPEAT-Befehl spezifiziert die Anzahl von Befehlen in der Schleife (welche sofort dem REPEAT-Befehl folgt) und die Anzahl, für die die Schleife durchlaufen werden soll (welche entweder eine Konstante ist oder aus einem Piccolo-Register gelesen wird).
- Wenn die Anzahl von Befehlen in der Schleife klein ist (1 oder 2), dann kann der Piccolo Extra-Zyklen nehmen, um die Schleife einzurichten.
- enn der Schleifenzähler registerspezifiziert ist, ist ein 32-Bit-Zugriff impliziert (S1 = 1), jedoch sind nur die unteren 16 Bits signifikant und die Zahl wird betrachtet, als hätte sie kein Vorzeichen. Wenn der Schleifenzähler Null ist, dann ist die Handlung der Schleife undefiniert. Eine Kopie des Schleifenzählers wird genommen, so daß das Register sofort wiederverwendet werden kann (oder sogar wiederbefüllt werden kann), ohne die Schleife zu beeinflussen.
- Der REPEAT-Befehl liefert einen Mechanismus, um die Art, in der Registeroperanden innerhalb einer Schleife spezifiziert werden, zu modifizieren. Die Details sind oben beschrieben. Codierung eines REPEATs mit einer registerspezifizierten Anzahl von Schleifen:
- Codierung von REPEAT mit einer festen Anzahl von Schleifen:
- Der RFIELD-Operand spezifiziert, welche der 16 Neuzuordnungsparameterkonfigurationen innerhalb der Schleife benutzt werden sollen.
- RFIELD Neuzuordnungsoperation
- 0 keine Neuzuordnung durchgeführt
- 1 benutzerdefinierte Neuzuordnung
- 2...15 voreingestellte Neuzuordnungskonfigurationen TBD
- Der Assembler liefert zwei Opcodes REPEAT und NEXT, um eine Hardwareschleife zu definieren. Der REPEAT geht an den Beginn der Schleife und der NEXT legt das Ende der Schleife fest, wobei dem Assembler erlaubt wird, die Anzahl von Befehlen in dem Schleifenkörper zu berechnen. Für den REPEAT ist es nur notwendig, die Anzahl von Schleifen zu spezifizieren, entweder als eine Konstante oder ein Register. Zum Beispiel:
- Dies führt die zwei MULA-Befehle X0-mal aus. Auch
- führt 10 Multiplizier-Akkumulierungen aus.
- Der Assembler unterstützt die Syntax:
- Um die Neuzuordnungsparameter zu spezifizieren, die für den REPEAT verwendet werden. Wenn die benötigten Neuzuordnungsparameter einem aus dem vordefinierten Satz von Parametern gleich sind, dann wird die dazugehörige REPEAT-Codierung verwendet. Wenn sie nicht gleich sind, generiert der Assembler ein RMOV, um die benutzerdefinierten Parameter zu laden, gefolgt von einem REPEAT-Befehl. Siehe den oberen Abschnitt für Details des RMOV-Befehls und des Neuzuordnungsparameterformats.
- Wenn die Anzahl von Iterationen für eine Schleife 0 ist, dann ist die Handlung von REPEAT UNVORHERSEHBAR.
- Wenn die Anzahl von Befehlsfeldern zu 0 gesetzt ist, dann ist die Handlung von REPEAT UNVORHERSEHBAR.
- Eine Schleife, die aus nur einem Befehl besteht, wobei dieser Befehl eine Verzweigung ist, hat ein UNVORHERSEHBARES Verhalten.
- Verzweige innerhalb der Begrenzungen einer REPEAT-Schleife, die sich außerhalb der Begrenzungen dieser Schleife verzweigen, sind UNVORHERSEHBAR.
- Der sättigende Absolutbefehl berechnet den gesättigten Absolutwert der Quelle 1.
- Handlung:
- dest = SAT((src1 > = 0) 7 src1 : -src1). Dieser Wert ist immer gesättigt. Insbesondere ist der Absolutwert von 0x80000000 gleich Ox7fffftfund NICHT 0x80000000!
- Kürzel:
- Marken:
- Z wird gesetzt, wenn das Ergebnis Null ist.
- N wird erhalten.
- C wird von src1 < 0 (dest = -src1 Fall) gesetzt.
- V wird gesetzt, wenn Sättigung auftrat.
- Gründe für eine Einbeziehung:
- Nützlich in vielen DSP-Anwendungen.
- Auswahloperationen (bedingte Bewegungen) dienen der bedingten Bewegung entweder der Quelle 1 oder der Quelle 2 in das Zielregister. Ein Auswahlbefehl ist immer äquivalent zu einem Bewegungsbefehl. Es gibt also Paralleloperationen für die Benutzung nach parallelen Additionen/Subtraktionen.
- Zu beachten ist, daß beide Quellenoperanden aus Gründen der Implementierung von dem Befehl gelesen werden können und so, wenn einer von ihnen leer ist, hält der Befehl an, unabhängig davon, ob der Operahd genau genommen benötigt wird.
- OPC spezifiziert den Befehlstyp.
- Handlung (OPC):
- Kürzel:
- Wenn ein Register zum Wiederbefüllen markiert ist, wird es unbedingt wiederbefüllt. Der Assembler liefert auch die Kürzel:
- MOV< ccond> A, B ist äquivalent zu SEL< cond> A, B, A. SELFT und SELFF werden erhalten durch Vertauschen von src1 und src2 und Verwenden von SELTF, SELTT.
- Marken:
- Alle Marken werden erhalten, so daß eine Sequenz von Auswahlen durchgeführt werden kann.
- Gründe für eine Einbeziehung:
- Verwendet zum Treffen einfacher Entscheidungen inline, ohne eine Verzweigung neu sortieren zu müssen. Verwendet von Viterbi-Algorithmen und wenn eine Probe oder ein Vektor auf das größte Element hin durchgesehen wird.
- Verschiebeoperationsbefehie liefern logische Verschiebungen nach links und rechts, arithmetische Verschiebungen nach rechts und Rotationen um einen spezifischen Betrag. Der Verschiebungsbetrag wird als vorzeichenbehaftete ganze Zahl zwischen -128 und +127 betrachtet, die aus den unteren 8 Bits des Registerinhalts entnommen werden oder als ein Immediate in dem Bereich +1 bis +31. Eine Verschiebung um einen negativen Betrag verursacht eine Verschiebung in die entgegengesetzte Richtung von ABS (Verschiebungsbetrag).
- Die Eingangs-Operanden sind um Vorzeichen erweitert auf 32-Bits; der resultierende 32-Bit- Ausgang ist um ein Vorzeichen erweitert auf 48-Bits vor dem Zurückschreiben, so daß ein Schreiben in einem 48-Bit-Register sich vernünftig verhält.
- OPC spezifiziert den Befehlstyp.
- Handlung (OPC):
- Kürzel:
- Marken:
- Z wird gesetzt, wenn das Ergebnis Nuil ist.
- N wird gesetzt, wenn das Ergebnis negativ ist.
- V wird erhalten
- C wird auf den Wert des letzten herausgeschobenen Bits gesetzt (wie auf dem ARM)
- Das Verhalten von registerspezifizierten Verschiebungen ist:
- - LSL um 32 hat ein Ergebnis Null, C wird zu Bit 0 von src1 gesetzt.
- - LSL um mehr als 32 hat ein Ergebnis Null, C zu Null gesetzt.
- - LSR um 32 hat ein Ergebnis Null, C zu Bit 31 aus src1 gesetzt.
- - LSR um mehr als 32 hat ein Ergebnis Null, C ist zu Null gesetzt.
- - ASR um 32 oder mehr hat ein Ergebnis gefüllt mit und C gleich zu Bit 31 aus src1.
- - ROR um 32 hat ein Ergebnis gleich Bit src1 und C zu Bit 31 aus src1 gesetzt.
- - ROR um n, wobei n größer ist als 32, gibt das gleiche Ergebnis und Überlauf aus wie ROR um n- 32; daher wird wiederholt 32 von n abgezogen, bis der Betrag im Bereich 1-32 ist und siehe oben.
- Gründe für eine Einbeziehung:
- Multiplikation/Division mit einer Potenz von 2. Bit und Feldextraktion. Serielle Register.
- Undefinierte Befehle werden oben in der Befehlssatzauflistung dargelegt. Ihre Ausführung wird den Piccolo veranlassen, die Ausführung anzuhalten und das U-Bit in dem Statusregister zu setzen und sich selbst auszuschalten (als ob das I-Bit in dem Steuerregister gelöscht wurde). Dies erlaubt allen zukünftigen Erweiterungen des Befehlssatzes, abgefangen zu werden und optional auf existierenden Implementierungen emuliert zu werden.
- Zugreifen auf den Piccolo-Zustand vom ARM funktioniert wie folgt. Ein Zustandszugriffsmodus wird verwendet, um den Zustand des Piccolo zu beobachten/zu modifizieren. Dieser Mechanismus wird aus zwei Gründen bereitgehalten:
- - Inhaltsschalter.
- - Debug (Fehlersuche).
- Piccolo wird in den Zustandszugriffsmodus versetzt durch Ausführen des PSTATE-Befehls. Dieser Modus erlaubt, alle Piccolo-Zustände abzuspeichern und mit einer Sequenz von STC- und LDC- Befehlen wiederherzustellen. Wenn in einen Zustandszugriffsmodus versetzt, wird die Benutzung der Piccolo-Coprozessor-1D PICCOL01 modifiziert, um zu erlauben, auf den Zustand des Piccolo zuzugreifen. Es gibt 7 Bänke von Piccolo-Zuständen. Alle Daten in einer bestimmten Bank können mit einem einzelnen LDC oder STC geladen oder gespeichert werden.
- - 1 32-Bit-Wort, das den Werte des Piccolo-1D-Registers (Read Only) enthält.
- - 1 32-Bit-Wort, das den Zustand des Steuerregisters enthält.
- - 1 32-Bit-Wort, das den Zustand des Statusregisters enthält.
- - 1 32-Bit-Wort, das den Zustand des Programmzählers enthält.
- - 16 32-Bit-Worte, die den Zustand des Registers für eine generelle Verwendung enthalten.
- - 4 32-Bit-Worte, die die oberen 32-Bits des Akkumulatorregisters enthalten (Anmerkung: Vervielfältigung mit dem GPR-Zustand ist notwendig für Wiederherstellungszwecke - ansonsten würde eine andere Schreibausschaltung auf der Registerbank impliziert).
- - 1 32-Bit-Wort, das anzeigt, welche Register zum Wiederbefüllen markiert sind (2 Bits für jedes 32- Bit-Register).
- - 8 32-Bit-Worte, die den Zustand der ROB-Kennzeichen beinhalten (8 7-Bit-Objekte, die in Bits 7-0 gespeichert sind).
- - 3 32-Bit-Worte, die den Zustand der nicht ausgerichteten ROB-Auffangregister beinhalten (Bits 17- 0).
- - 1 32-Bit-Wort, das anzeigt, welche Plätze in dem Ausgang-Schieberegister gültige Daten enthalten (Bit 4 zeigt an leer, Bits 3-0 codieren die Anzahl der verwendeten Einträge).
- - 1 32-Bit-Wort, das den Zustand des Ausgang-FIFO-Halteauffangregisters beinhaltet (Bits 17-0).
- - 8 32-Bit-Datenwerte.
- - 8 32-Bit-Datenwerte.
- - 4 32-Bit-Worte, die die Schleifenanfangsadressen beinhalten.
- - 4 32-Bit-Worte, die die Schleifenendadressen beinhalten.
- - 4 32-Bit-Worte, die den Schleifenzähler beinhalten (Bits 15-0).
- - 1 32-Bit-Wort, das benutzerdefinierte Neuzuordnungsparameter und andere Neuzuordnungszustände enthält.
- Der LDC-Befehl wird verwendet, um den Piccolo-Zustand zu laden, wenn der Piccolo in dem Zustandszugangsmodus ist. Das BANK-Feld spezifiziert, welche Bank geladen wird.
- Die folgende Sequenz lädt alle Piccolozustände von den Adressen in das Register R0.
- Der STC-Befehl wird verwendet, um den Piccolo-Zustand zu speichern, wenn der Piccolo in dem Züstandszugriffsmodus ist. Das BANK-Feld spezifiziert, welche Bank gespeichert wird.
- Die folgende Sequenz speichert alle Piccolo-Zustände in die Adresse in Register R0.
- Debug-Modus - Piccolo muß auf die gleichen Debug-Mechanismen antworten, wie sie von ARM unterstützt werden, d. h. Software durch Demon und Angel und Hardware mit Embedded ICE. Es gibt verschiedene Mechanismen zum Debuggen eines Piccolo-Systems:
- - ARM-Befehls-Haltepunkte (Breakpoints).
- - Daten-Haltepunkte (Überwachungspunkte).
- - Piccolo-Befehls-Haltepunkte.
- - Piccolo-Software-Haltepunkte.
- ARM-Befehle und Daten-Haltepunkte werden von dem ARM-Embedded-ICE-Modul gehandhabt; Piccolo-Befehls-Haltepunkte werden von dem Piccolo-Embedded-ICE-Modul gehandhabt; Piccolo-Software-Haltepunkte werden von dem Piccolo-Kern gehandhabt. Das Hardware-Breakpoint-System ist konfigurierbar, so daß beide, der ARM und der Piccolo, mit Haltepunkte versehen werden.
- Software-Haltepunkte werden von einem Piccolo-Befehl (Halt oder Break) gehandhabt, wobei der Piccolo veranlaßt wird, die Ausführung anzuhalten und in den Debug-Modus zu gehen (B-Bit in dem Statusregistersatz), und sich selbst auszuschalten (als ob der Piccolo mit einem PDISABLE-Befehl ausgeschaltet worden wäre). Der Programmzähler bleibt gültig, wobei er der Adresse des Haltepunkts erlaubt, wiederhergestellt zu werden. Der Piccolo wird nicht länger Befehle ausführen.
- Einzelschritt-Piccolo wird durchgeführt durch Setzen von Breakpoint nach Breakpoint auf dem Piccolo-Befehlsstrom.
- Software-Debug - Die grundlegende Funktionalität, die vom Piccolo bereitgestellt wird, ist die Fähigkeit, alle Zustände in einen Speicher über Coprozessorbefehle zu laden und zu speichern, wenn er in dem Zustandszugriffsmodus ist. Dies erlaubt einem Debugger, alle Zustände in einen Speicher zu speichern, zu lesen und/oder sie zu aktualisieren und sie in dem Piccolo wiederherzustellen. Der Piccolo-Speicherzustandsmechanismus ist nicht destruktiv, d. h. die Aktion des Speicherns des Zustands des Piccolo korrumpiert keinen der internen Piccolo-Zustände. Dies bedeutet, daß der Piccolo neu gestartet werden kann, nachdem sein Zustand fallengelassen wurde, ohne ihn zunächst nochmals neu zu starten.
- Der Mechanismus, um den Status des Piccolo-Caches zu finden, muß bestimmt werden.
- Hardware-Debug - Hardware-Debug wird von einer Scankette auf dem Coprozessorinterface des Piccolo erleichtert. Der Piccolo kann dann in den Zustandszugangsmodus versetzt werden und sein Zustand über die Abfragefolge untersucht/modifiziert werden.
- Das Piccolo-Statusregister enthält ein einzelnes Bit, um anzuzeigen, daß er einen Befehl, der mit einem Breakpoint markiert ist, ausgeführt hat. Wenn ein mit einem Breakpoint markierter Befehl ausgeführt wird, setzt der Piccolo das B-Bit in dem Statusregister und hält die Ausführung an. Um in der Lage zu sein, den Piccolo abzufragen, muß der Debugger den Piccolo aktivieren und ihn in den Zustandszugangsmodus versetzen durch Schreiben in sein Steuerregister, bevor nachfolgende Zugriffe stattfinden können.
- Fig. 4 stellt eine Multiplexeranordnung dar, die auf das Hi/Lo-Bit und Größen-Bit antwortet, um entsprechende Hälften des gewählten Registers auf den Piccolo-Datenpfad zu schalten. Wenn das Größen-Bit 16 Bits anzeigt, dann füllt ein vorzeichenerweiternder Schaltkreis die Bits hoher Ordnung des Datenpfades mit Nullen und Einsen wie jeweils anwendbar auf.
Claims (22)
1. Datenverarbeitungsvorrichtung mit:
einer Mehrzahl von Registern (10) zum Speichern von zu verarbeitenden Datenobjekten,
einem Prozessor (54) für das Verarbeiten von Befehlen, die auf die in der Mehrzahl von
Registern gespeicherten Datenobjekte angewendet werden sollen,
einer Registerneuzuordnungslogik (52), um einen logischen Registeraufruf innerhalb eines
vorgewählten Satzes von Befehlen umzuwandeln in einen physikalischen Registeraufruf, welcher
das Register kennzeichnet, welches das für die Verarbeitung durch den Prozessor erforderliche
Datenobjekt enthält,
wobei die Datenverarbeitungsvorrichtung gekennzeichnet ist durch:
einen Wiederholbefehl, um einen Bereich von Befehlen zu definieren, der wiederholt werden
soll und um zu bewirken, daß die Registerneuzuordnungslogik für einen definierten Teilsatz von
Registern aufgerufen wird, wobei der Bereich von Befehlen den vorgewählten Satz von Befehlen
umfaßt, und
eine Schleifenhardware, um den Wiederholbefehl zu handhaben, welche dafür ausgelegt ist,
periodisch die Registerneuzuordnungslogik (52) auf den neuesten Stand zu bringen (zu
aktualisieren), um so die Umwandlung des logischen Registeraufrufs in den physikalischen Registeraufruf zu
verändern, die durch die Registerneuzuordnungslogik vorgenommen wird.
2. Datenverarbeitungsvorrichtung nach Anspruch 1, wobei die Registerneuzuordnungslogik
(52) durch einen Neuzuordnungsbefehl konfigurierbar ist, der so ausgelegt ist, daß er vor dem
vorgewählten Satz von Befehlen verarbeitet wird.
3. Datenverarbeitungsvorrichtung nach Anspruch 1, wobei die Schleifenhardware dafür
ausgelegt ist, die Registerneuzuordnungslogik (52) jedesmal dann auf den neuesten Stand zu bringen,
wenn der Bereich von Befehlen wiederholt wird.
4. Datenverarbeitungsvorrichtung nach Anspruch 1 oder 3, wobei der Wiederholbefehl einen
oder mehrere Neuzuordnungsparameter enthält, die verwendet werden, um die
Registerneuzuordnungslogik (52) zu konfigurieren.
5. Datenverarbeitungsvorrichtung nach Anspruch 4, wobei ein Neuzuordnungsbefehl so
ausgelegt ist, daß er vor der Ausführung des Wiederholbefehls ausgeführt wird, um die
Registerneuzuordnungslogik (52) unter Verwendung des einen oder der mehreren Neuzuordnungsparameter zu
konfigurieren, wobei der Neuzuordnungsbefehl nicht in dem Bereich von Befehlen enthalten ist, welcher
durch den Wiederholbefehl definiert wird.
6. Datenverarbeitungsvorrichtung nach Anspruch 4 oder 5, welche weiterhin eine
Speichervorrichtung für das Speichern zumindest eines Satzes vordefinierter Neuzuordnungsparameter
aufweist, wobei jeder Satz eine Neuzuordnungskonfiguration für die Registerneuzuordnungslogik (52)
definiert, wobei, wenn der eine oder die mehreren Neuzuordnungsparameter, die in dem
Wiederholbefehl enthalten sind, einem der Sätze vordefinierter Neuzuordnungsparameter entspricht, die
entsprechende Neuzuordnungskonfiguration für die Registerneuzuordnungslogik verwendet wird, ohne
daß es erforderlich ist, daß ein Neuzuordnungsbefehl ausgeführt wird.
7. Datenverarbeitungsvorrichtung nach einem der Ansprüche 4 bis 6, wobei ein erster
Neuzuordnungsparameter (REGCOUNT) eine Anzahl der Mehrzahl von Registern kennzeichnet, die
Gegenstand der Neuzuordnung durch die Neuzuordnungslogik sind.
8. Datenverarbeitungsvorrichtung nach einem der Ansprüche 4 bis 7, wobei die
Registerneuzuordnungslogik (52) dafür ausgelegt ist, ein Neuzuordnen mit einer Anzahl aus der Mehrzahl von
Registern auszuführen, und wobei ein Basiszeiger durch die Registerneuzuordnungslogik als ein
Offset-Wert verwendet wird, welcher dem logischen Registeraufruf hinzuzufügen ist, wobei der
Wiederholbefehl einen zweiten Neuzuordnungsparameter (BaseInc) umfaßt, welcher einen Wert
kennzeichnet, durch welchen der Basiszeiger zu vorbestimmten Intervallen weiterbewegt werden soll.
9. Datenverarbeitungsvorrichtung nach Anspruch 8, wobei der Wiederholbefehl einen dritten
Zuordnungsparameter (BaseWrap) umfaßt, der einen ersten Umbruchwert bereitstellt, und wobei,
wenn während des Weiterbewegens des Basiszeigers der Basiszeiger gleich dem ersten
Umbruchwert wird oder diesen überschreitet, das Weiterbewegen des Basiszeigers in einem Umbruch zu
einem neuen Offset-Wert erfolgt.
10. Datenverarbeitungsvorrichtung nach Anspruch 8 oder 9, wobei der Wiederholbefehl einen
vierten Zuordnungsparameter (RegWrap) umfaßt, der einen zweiten Umbruchwert bereitstellt und
wobei, wenn der Registeraufruf, der durch die Hinzufügung des Basiszeigers gebildet wird, und der
logische Registeraufruf gleich dem zweiten Umbruchwert ist oder diesen übersteigt, dieser
Registeraufruf zu einem neuen Registeraufruf umgebrochen wird.
11. Datenverarbeitungsvorrichtung nach einem der vorstehenden Ansprüche, wobei die
Mehrzahl von Registern Registerbänke (X, Y, Z) enthält, wobei die Registerneuzuordnungslogik (52)
dafür ausgelegt ist, daß sie ein Neuzuordnen mit einer Anzahl von Registern innerhalb eines
bestimmten Bank ausführt.
12. Datenverarbeitungsvorrichtung nach Anspruch 11, wobei die Registerneuzuordnungslogik
(52) dafür ausgelegt ist, ein unabhängiges Neuzuordnen für jede Registerbank (X, Y, Z)
auszuführen.
13. Datenverarbeitungsvorrichtung nach einem der vorstehenden Ansprüche, wobei ein Befehl
eine Mehrzahl von Operanden enthält, jeder Operand einen logischen Registeraufruf aufweist und
die Registerneuzuordnungslogik (52) dafür ausgelegt ist, ein unabhängiges Neuzuordnen für jeden
Operanden auszuführen.
14. Datenverarbeitungsvorrichtung nach einem der vorstehenden Ansprüche, wobei die
Vorrichtung eine digitale Signalverarbeitungseinrichtung ist.
15. Verfahren zum Betreiben einer Datenverarbeitungsvorrichtung mit den Schritten:
(a) Speichern von zu verarbeitenden Datenobjekten in einer Mehrzahl von Registern (10),
(b) Wiederholen bzw. Wiedergewinnen eines oder mehrerer Datenobjekte, die für die
Verarbeitung eines Befehles erforderlich sind, aus der Mehrzahl von Registern (10), einschließlich, falls der
Befehl einer aus einem vorgewählten Satz von Befehlen ist, des Verwendens einer
Registerneuzuordnungslogik (52), um einen logischen Registeraufruf innerhalb des Befehls in einen physikalischen
Registeraufruf umzuwandeln, welcher das Register kennzeichnet, das das für die Verarbeitung des
Befehls erforderliche Datenobjekt enthält;
(c) Verarbeiten des Befehles unter Verwendung des einen oder der mehreren Datenobjekte, die
wiedergewonnen wurden,
wobei das Verfahren gekennzeichnet ist durch die Schritte
(d) Ausführen eines Wiederholbefehls, der einen Bereich von Befehlen definiert, die wiederholt
werden sollen, und Bewirken, daß die Registerneuzuordnungslogik für einen festgelegten Teilsatz
von Registern aufgerufen wird, wobei der Bereich von Befehlen den vorgewählten Satz von
Befehlen enthält, und
(e) Verwenden einer Schleifenhardware, um den Wiederholbefehl zu verwalten bzw. zu
handhaben und um die Registerneuzuordnungslogik (52) periodisch auf den neuesten Stand zu bringen,
um so die von der Registerneuzuordnungslogik verwendete Umwandlung des logischen
Registeraufrufs in einen physikalischen Registeraufruf zu verändern.
16. Verfahren nach Anspruch 15, wobei die Schleifenhardware die Registerneuzuordnungslogik
(52) jedesmal dann auf den neuesten Stand bringt, wenn der Bereich von Befehlen wiederholt wird.
17. Verfahren nach Anspruch 15 oder 16, wobei der Schritt des Definierens eines Bereichs von
Befehlen, die wiederholt werden sollen, den Schritt einschließt, daß einer oder mehrere
Neuzuordnungsparameter definiert werden, die für die Konfigurierung der Registerneuzuordnungslogik (52)
verwendet werden sollen.
18. Verfahren nach Anspruch 17, wobei ein Neuzuordnungsbefehl vor der Ausführung des zu
wiederholenden Bereichs von Befehlen ausgeführt wird, um die Registerneuzuordnungslogik (52)
unter Verwendung des einen oder der mehreren Neuzuordnungsparameter zu konfigurieren.
19. Verfahren nach Anspruch 17 oder 18, welches weiterhin die Schritte aufweist:
Speichern zumindest eines Satzes vordefinierter Neuzuordnungsparameter, wobei jeder
Satz eine Neuzuordnungskonfiguration für die Registerneuzuordnungslogik (52) definiert, und
falls der eine oder die mehreren Neuzuordnungsparameter einem der Sätze der
vordefinierten Neuzuordnungsparameter entspricht, Verwenden der entsprechenden
Neuzuordnungskonfiguration für die Registerneuzuordnungslogik, ohne daß es erforderlich ist, daß ein Neuzuordnungsbefehl
ausgeführt wird.
20. Verfahren nach einem der Ansprüche 15 bis 19, wobei die Mehrzahl von Registern
Registerbänke (X, Y, Z) enthält, wobei das Verfahren den Schritt aufweist, daß das Neuzuordnen mit einer
Anzahl von Registern innerhalb einer bestimmten Bank ausgeführt wird.
21. Verfahren nach Anspruch 20, welches weiterhin den Schritt aufweist, daß eine unabhängige
Neuzuordnung für jede Registerbank (X, Y, Z) ausgeführt wird.
22. Verfahren nach einem der Ansprüche 15 bis 21, wobei ein Befehl eine Mehrzahl von
Operanden enthält und jeder Operand einen logischen Registeraufruf aufweist, und wobei das Verfahren
weiterhin den Schritt aufweist, daß eine unabhängige Neuzuordnung für jeden Operanden
durchgeführt wird.
Applications Claiming Priority (2)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| GB9619823A GB2317464A (en) | 1996-09-23 | 1996-09-23 | Register addressing in a data processing apparatus |
| PCT/GB1997/002258 WO1998012625A1 (en) | 1996-09-23 | 1997-08-22 | Register addressing in a data processing apparatus |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| DE69718485D1 DE69718485D1 (de) | 2003-02-20 |
| DE69718485T2 true DE69718485T2 (de) | 2003-12-04 |
Family
ID=10800360
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| DE69718485T Expired - Lifetime DE69718485T2 (de) | 1996-09-23 | 1997-08-22 | Registeraddressierung in einer datenverarbeitungsvorrichtung |
Country Status (9)
| Country | Link |
|---|---|
| EP (1) | EP0927389B1 (de) |
| JP (1) | JP3645573B2 (de) |
| KR (1) | KR100500889B1 (de) |
| CN (1) | CN1103959C (de) |
| DE (1) | DE69718485T2 (de) |
| IL (1) | IL128211A0 (de) |
| MY (1) | MY121677A (de) |
| RU (1) | RU2193228C2 (de) |
| TW (1) | TW343318B (de) |
Families Citing this family (22)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US6950929B2 (en) | 2001-05-24 | 2005-09-27 | Samsung Electronics Co., Ltd. | Loop instruction processing using loop buffer in a data processing device having a coprocessor |
| TW200422870A (en) * | 2002-12-20 | 2004-11-01 | Qualcomm Inc | System to automatically process components on a device |
| CN100409187C (zh) * | 2004-02-12 | 2008-08-06 | 松下电器产业株式会社 | 程序转换装置及程序转换方法 |
| RU2390823C2 (ru) * | 2004-08-05 | 2010-05-27 | Сони Эрикссон Мобайл Коммьюникейшнз Аб | Компактное хранение программного кода на мобильных терминалах |
| JP4982971B2 (ja) * | 2004-09-29 | 2012-07-25 | ソニー株式会社 | 情報処理装置、プロセス制御方法、並びにコンピュータ・プログラム |
| US8274518B2 (en) | 2004-12-30 | 2012-09-25 | Microsoft Corporation | Systems and methods for virtualizing graphics subsystems |
| US20060200655A1 (en) * | 2005-03-04 | 2006-09-07 | Smith Rodney W | Forward looking branch target address caching |
| US7962731B2 (en) | 2005-10-20 | 2011-06-14 | Qualcomm Incorporated | Backing store buffer for the register save engine of a stacked register file |
| US7844804B2 (en) * | 2005-11-10 | 2010-11-30 | Qualcomm Incorporated | Expansion of a stacked register file using shadow registers |
| US9710269B2 (en) | 2006-01-20 | 2017-07-18 | Qualcomm Incorporated | Early conditional selection of an operand |
| JP5289688B2 (ja) * | 2006-07-05 | 2013-09-11 | ルネサスエレクトロニクス株式会社 | プロセッサシステム及びプロセッサシステムを動作させるオペレーティングシステムプログラムの処理方法 |
| SG177213A1 (en) * | 2006-12-28 | 2012-01-30 | Arcsight Inc | Storing log data efficiently while supporting querying to assist in computer network security |
| US8914619B2 (en) * | 2010-06-22 | 2014-12-16 | International Business Machines Corporation | High-word facility for extending the number of general purpose registers available to instructions |
| CN102231180B (zh) * | 2011-07-30 | 2014-05-28 | 张鹏 | 处理器指令编码可重定义的方法 |
| RU2586589C2 (ru) * | 2011-12-30 | 2016-06-10 | Интел Корпорейшн | Модуль сопроцессора кэша |
| US9588762B2 (en) * | 2012-03-15 | 2017-03-07 | International Business Machines Corporation | Vector find element not equal instruction |
| US20130339656A1 (en) * | 2012-06-15 | 2013-12-19 | International Business Machines Corporation | Compare and Replace DAT Table Entry |
| US10228941B2 (en) | 2013-06-28 | 2019-03-12 | Intel Corporation | Processors, methods, and systems to access a set of registers as either a plurality of smaller registers or a combined larger register |
| US20150293767A1 (en) * | 2014-04-11 | 2015-10-15 | Fujitsu Limited | Rotating register file with bit expansion support |
| RU2666458C1 (ru) * | 2017-11-27 | 2018-09-07 | Акционерное общество "МЦСТ" | Микропроцессор |
| CN110350922A (zh) * | 2019-07-18 | 2019-10-18 | 南京风兴科技有限公司 | 一种二进制编码的寻址方法及寻址器 |
| CN115858018B (zh) * | 2023-02-27 | 2023-05-16 | 珠海星云智联科技有限公司 | 一种嵌入式系统的自适应寄存器更新方法、设备及介质 |
Family Cites Families (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JPH04293124A (ja) * | 1991-03-20 | 1992-10-16 | Hitachi Ltd | データ処理プロセッサ |
| US5655132A (en) * | 1994-08-08 | 1997-08-05 | Rockwell International Corporation | Register file with multi-tasking support |
-
1996
- 1996-10-08 TW TW085112298A patent/TW343318B/zh not_active IP Right Cessation
-
1997
- 1997-08-22 EP EP97937701A patent/EP0927389B1/de not_active Expired - Lifetime
- 1997-08-22 CN CN97198142A patent/CN1103959C/zh not_active Expired - Fee Related
- 1997-08-22 JP JP51437198A patent/JP3645573B2/ja not_active Expired - Fee Related
- 1997-08-22 KR KR10-1999-7002442A patent/KR100500889B1/ko not_active Expired - Fee Related
- 1997-08-22 RU RU99108433/09A patent/RU2193228C2/ru not_active IP Right Cessation
- 1997-08-22 DE DE69718485T patent/DE69718485T2/de not_active Expired - Lifetime
- 1997-08-22 IL IL12821197A patent/IL128211A0/xx not_active IP Right Cessation
- 1997-08-30 MY MYPI97004024A patent/MY121677A/en unknown
Also Published As
| Publication number | Publication date |
|---|---|
| TW343318B (en) | 1998-10-21 |
| EP0927389A1 (de) | 1999-07-07 |
| JP3645573B2 (ja) | 2005-05-11 |
| CN1103959C (zh) | 2003-03-26 |
| KR100500889B1 (ko) | 2005-07-14 |
| RU2193228C2 (ru) | 2002-11-20 |
| KR20000048532A (ko) | 2000-07-25 |
| JP2001505679A (ja) | 2001-04-24 |
| MY121677A (en) | 2006-02-28 |
| CN1231740A (zh) | 1999-10-13 |
| DE69718485D1 (de) | 2003-02-20 |
| IL128211A0 (en) | 1999-11-30 |
| EP0927389B1 (de) | 2003-01-15 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| DE69718485T2 (de) | Registeraddressierung in einer datenverarbeitungsvorrichtung | |
| DE69801673T2 (de) | Co-prozessordatenzugangskontrolle | |
| DE69707486T2 (de) | Architektur eines integrierten bausteins zur digitalen signalverarbeitung | |
| DE69627807T2 (de) | Datenprozessor zum gleichzeitigen Dataladen und Durchführung einer multiplizier-addier Operation | |
| DE69131637T2 (de) | Registerhaltige Datenbearbeitung in einem Prozessor mit reduziertem Befehlssatz | |
| DE69625256T2 (de) | Mikrorechner | |
| DE69233412T2 (de) | Vorrichtung und Rechnerprogrammprodukt zur Ausführung von Verzweigungsbefehlen | |
| DE69227604T2 (de) | Rückwärts kompatible Rechnerarchitektur mit erweiterten Wortbreiten und Adressraum | |
| DE19735350B4 (de) | Vektorprozessor zum Ausführen paralleler Operationen und Verfahren hierfür | |
| DE69230057T2 (de) | Risc mikroprozessorarchitektur mit mehrere registersätze von unterschiedlichen typen | |
| DE69311330T2 (de) | Befehlsablauffolgeplanung von einem risc-superskalarprozessor | |
| DE69901708T2 (de) | Gemischter vektor/skalar-registersatz | |
| DE19735348B4 (de) | Vektorprozessor zur Einzelbefehl-Mehrdaten-Verarbeitung unter Verwendung von mehreren Bänken von Vektorregistern und zugehöriges Verfahren zum Betreiben desselben | |
| DE69130379T2 (de) | Datenvorausladebefehl in einem Prozessor mit reduziertem Befehlssatz | |
| DE3689923T2 (de) | Dreiphasen-Pipeline-Signalprozessor. | |
| DE69127242T2 (de) | Sicherung der Datenintegrität in einem Multipipelineprozessorsystem | |
| DE2903349C2 (de) | Prozessor und Verfahren zur Datenverarbeitung | |
| DE68928677T2 (de) | Verfahren und digitaler Computer zur Vorverarbeitung mehrerer Befehle | |
| DE3486085T2 (de) | Zentrale Verarbeitungseinheit für einen Digitalrechner. | |
| DE60032794T2 (de) | Bit-dekompression-verarbeitung mit einem vielseitigen ausrichtungswerkzeug | |
| DE69412504T2 (de) | Hardware-unterstützter zählungsänderungsbefehl | |
| DE69616718T4 (de) | Vorrichtung und verfahren zur bestimmung von adressen fehlausgerichteter daten | |
| DE69732793T2 (de) | Acht-bit-mikrokontroller mit risc-architektur | |
| DE69721023T2 (de) | Bearbeitung bedingter auswahl-übertragungsbefehle | |
| DE19735349B4 (de) | Vektorprozessor und Verfahren zu dessen Betrieb |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| 8381 | Inventor (new situation) |
Inventor name: YORK, RICHARD, CAMBRIDGE CB1 4YW, GB Inventor name: FRANCIS, HEDLEY JAMES, WESTON COLVILLE, GB Inventor name: SYMES, DOMINIC, CAMBRIDGE CB1 4HY, GB Inventor name: BILES, STUART, CAMBRIDGE CB5 8LP, GB |
|
| 8364 | No opposition during term of opposition |