Frage

Für SPARC Montage besonders, wie Zweige unterscheidet sich von regulären Filialen für nichtig erklärt werden?

Ich habe immer gedacht, dass für nichtig erklärt Verzweigungsbefehle erforderlich ist, wenn ich die nop Verzögerungsschlitz für Verzweigungsbefehle füllen müssen. Aber ich glaube nicht, dass ich auf diesem Teil richtig bin, weil Sie die nop ohne Aufhebungs den Zweig füllen können.

War es hilfreich?

Lösung

Die annullierte Verzweigungs Anweisung bewirkt, dass der Befehl in der Verzögerungslücke - die Anweisung nach der Verzweigung - ignoriert werden, wenn die Verzweigung nicht genommen wird

.

Warum sollte dies wichtig sein? Denn normalerweise wird der Befehl nach der Verzweigung ausgeführt, selbst wenn die Verzweigung genommen wird. Dies liegt daran, es gibt zwei Programmzähler, PC und NPC. PC, der die Anweisung ausgeführt wird, anzeigt, wird an NPC aktualisiert, die PC + 4, zur gleichen Zeit wie NPC an das Ziel des Verzweigungsbefehls aktualisiert wird. Also wegen des Zeitpunkts dieser Ereignisse hat der nächste Befehl geladen werden. Anstatt nur entfernt, diesen Kreislauf werfen, es ist mehr rentabel diesen Zyklus zu verwenden, wenn wir können. Wir würden dann machen genau das Anweisungsteil der Schleife.

loop:   someOp                
        someOtherOp
        branch      loop      ;
        delayslotOp           ; will actually be executed, before someOp, after branch

Wenn wir nicht den Befehls-Slot nach der Verzweigung verwenden können, dann halten wir eine nop dort, und nichts zu tun auf diesem Zyklus.

Also, warum hat dann verschiedene Befehle mit für nichtig erklärt und nicht annullierte Verzweigungsmöglichkeiten? Um uns die Wahl von dem, was aus der Schleife passiert, an der Ausfahrt. Wenn wir den Verzögerungsschlitzteil der Schleife Aktivität gemacht haben, könnten wir nicht, dass op von der Schleife ausgeführt werden sollen beim Verlassen. Daher möchten wir hinzufügen „ein“ bis zum Ende des Verzweigungsbefehls.

Diese Seite hat einige schöne Beispiele.

Andere Tipps

Nach dem SPARC Architecture Manual (v9) :

  

3.2.3 Control-Transfer

     

[...]

     

Die meisten der Steuertransferbefehle verzögert werden; das heißt, der Befehl unmittelbar nach einem   Steuerübertragungsbefehl in logischer Reihenfolge wird ausgelöst, bevor   die Steuerübertragung an die Zieladresse abgeschlossen ist.

     

[...]

     

Die Anweisung nach einem verzögerten Steuertransferbefehl aufgerufen    Verzögerungsbefehl . Ein Bit in einer verzögerten Steuer-Übertragungsanweisung   (Das Annullierungsbit) kann bewirken, dass der Verzögerungsbefehl annulliert werden (das   ist, keine Wirkung haben), wenn die Verzweigung nicht genommen wird.

     

6.3.4 Zugsteuerung Transferieren (CTIs)

     

[...]

     

Programmierung Hinweis: : Die Annullierungs Bit erhöht die Wahrscheinlichkeit, dass ein   Compiler kann eine nützliche Anweisung findet die Verzögerungsschlitz nach einem füllen   Zweig, wodurch die Anzahl von Befehlen durch einen ausgeführten   Programm. Zum Beispiel kann das für nichtig zu erklären Bit verwendet werden, um eine Anweisung zu bewegen   innerhalb einer Schleife der Verzögerungslücke des Zweiges zu füllen, die schließen,   die Schleife. Ebenso können die für nichtig zu erklären Bit verwendet werden, um eine Anweisung zu bewegen   entweder von der „else“ oder „dann“ Zweig eines „ifthen- else“ Programm   Block an den Verzögerungsschlitz des Verzweigungs, die zwischen ihnen auswählt. Schon seit   eine ganze Reihe von Bedingungen zur Verfügung gestellt werden, kann ein Compiler den Code anordnen   (Umkehren möglicherweise den Sinn des Zustandes), so dass eine Anweisung   entweder von dem „else“ Zweig oder die „dann“ Zweig kann die bewegt werden   Delay-Slot.

Der folgende Code zeigt zwei Zweige, in der ersten der Verzögerungsbefehl immer ausgeführt wird, in der zweiten die Verzögerungsanweisung annulliert wird, wenn die Verzweigung nicht genommen wird:

cmp   %i3, %i0
ble   %icc, -0x5c
ld    [%l0 - 0x4], %i5  ; executed whether the branch is taken or not

...

cmp   %l1, 0x80
bl,a  %icc, +0x40
ld    [%fp + 0x7c7], %g2    ; annulled if the branch is not taken, executed otherwise
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top