bgt
Pseudoelementlyszt.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'
