Information Technology Reference
In-Depth Information
1:
cmp.eq
p1, p0 = r0, r0
;;
// p1 mit 1 initialisieren
2:
cmp.eq.and p1, p0 = r1, r2
// Falls r1 = r2 ist, p1 gesetzt lassen
3:
cmp.ne.and p1, p0 = r3, r4
// Falls zusätzlich auch r3
r4 ist, p1 gesetzt lassen
4: (p1)
pr.cond
anywhere
;;
// Verzweigen, wenn r1 = r2 UND r3
r4
Bild 3.22. Zusammengesetzte Bedingung bei einem Prozessor mit IA-64-Architektur
Das in Bild 3.21b und erneut in Bild 3.23a aufgelistete Assemblerprogramm lässt
sich auch ohne Sprungvermeidung optimiert in zwei Befehlen codieren und ist
somit vergleichbar schnell wie das in Bild 3.21c dargestellten Assemblerprogramm
ausführbar. Hierzu werden die im if-Zweig stehenden Operationen in den Zeilen 3
und 4 spekulativ vor die bedingte Sprungoperation in Zeile 2 verschoben und
anschließend die beiden nun direkt aufeinander folgenden Sprungoperationen aus
den Zeilen 2 und 5 zu einer einzelnen Sprungoperation zusammengefasst. Letzteres
erfordert, dass die dabei ausgewertete Bedingung komplementiert wird, also r1 und
Null nicht auf Gleichheit, sondern auf Ungleichheit überprüft werden.
Das Ergebnis der Optimierung zeigt Bild 3.23b. Falls r1 ungleich Null ist, kommt es
zunächst zur Ausführung der Operationen des if-Zweigs in den Zeilen 2 und 3, um
anschließend zum Ende des Assemblerprogramms zu verzweigen. Falls r1 umge-
kehrt gleich Null ist, werden die Operationen des if-Zweigs ebenfalls ausgeführt, die
spekulativ erzeugten Ergebnisse jedoch durch die Operationen des else-Zweigs in
den Zeilen 5 und 6 überschrieben. Das Assemblerprogramm ist in zwei VLIW-
Befehlen codierbar und lässt sich bei korrekter Sprungvorhersage in einem Takt,
nämlich wenn der then-Zweig durchlaufen wird, und in zwei Takten, wenn der else-
Zweig durchlaufen wird, ausführen (letzteres sollte der seltener auftretende Fall
sein). Zum Vergleich: Das in Bild 3.21c dargestellte Assemblerprogramm benötigt
immer zwei Takte.
1:
cmp.eq
p1, p0 = r1, 0
1:
cmp. ne
p1, p0 = r1, 0
;;
2: (p1)
br.cond
else
2:
add
r2 = r3, r4
3:
add
r2 = r3, r4
3:
sub
r5 = r5, 1
4:
sub
r5 = r5, 1
4: (p1)
br.cond
end;;
5:
br
end;;
5:
sub
r2 = r3, r4
6: else:
7:
6:
add
r5 = r5, 1;;
sub
r2 = r3, r4
7: end:
8:
add
r5 = r5, 1;;
9: end:
a
b
Bild 3.23. Optimierung eines if-then-else-Konstrukts, ohne Sprungoperationen zu vermeiden. a
Nicht optimiertes Assemblerprogramm (entspricht Bild 3.21b). b Optimiertes Assemblerprogramm
In diesem Beispiel wirkt sich positiv aus, dass die Operationen im if- und im else-
Zweig jeweils dieselben Zielregister verwenden. Wäre dies nicht der Fall, dürften
die spekulativ ausgeführten Operationen die Inhalte der Register r2 und r5 nur dann
verändern, wenn andere auf das if-then-else-Konstrukt folgende Operationen nicht
lesend darauf zugreifen. Gegebenenfalls müssen die spekulativen Ergebnisse zuerst
in temporären Registern zwischengespeichert und später, z.B. im if-Zweig, den
eigentlichen Zielregistern zugewiesen werden. Die Bearbeitung eines derart modifi-
Search WWH ::




Custom Search