bgtPseudoelement

bgt

Pseudoelement
RISC-V Assembler Referenz

lyszt.net behandelt bgt und andere RISC-V-Befehle ausführlicher.

Beschreibung

bgt ist ein Branch, der ausgelöst wird, wenn ein Wert größer als ein anderer ist. Sein Name steht für branch if greater than (Verzweigung, wenn größer als). Die folgende Anweisung springt zur Marke, wenn rs1 strikt größer als rs2 ist, wobei beide als vorzeichenbehaftete Werte verglichen werden.

bgt rs1, rs2, label

Keiner der sechs Kern-Branches von RISC-V prüft auf Größer-als. Ob a größer als b ist, ist dieselbe Frage wie ob b kleiner als a ist, mit vertauschten Operanden. bgt ist eine Pseudoanweisung, und der Assembler schreibt sie als blt mit vertauschten Operanden um. Die Hardware bleibt einfacher und der Vergleich kann trotzdem in der Richtung geschrieben werden, die sich natürlich liest. Der zugrunde liegende Kleiner-als-Branch ist unter blt beschrieben.

Greife zu bgt, wenn die Bedingung sich in dieser Richtung natürlich liest, zum Beispiel um abzuzweigen, sobald ein Wert ein Maximum überschreitet, sobald eine Länge größer als der dafür vorgesehene Platz ist, oder wenn der größere von zwei Pfaden gewählt wird.

Das RISC-V-Handbuch gibt an, dass bgt, bgtu, ble und bleu synthetisiert werden können, indem die Operanden zu blt, bltu, bge und bgeu vertauscht werden.

Strikt ist das entscheidende Wort. bgt verzweigt nicht, wenn die beiden Werte gleich sind. Um gleiche Werte ebenfalls zu erfassen, verwende bge, das bei größer oder gleich verzweigt. Off-by-one-Fehler in Schleifen und Prüfungen stammen meist aus diesem Unterschied. Der Vergleich ist vorzeichenbehaftet. Für vorzeichenlose Daten gilt derselbe Tausch für bltu.

Wird erweitert zu

blt rs2, rs1, label

Der Assembler ersetzt diese Pseudoanweisung durch die oben aufgeführte(n) echte(n) Anweisung(en).

Beispiel

li t0, 5
li t1, 2
bgt t0, t1, done   # 5 > 2, so jump to 'done'