bge
lyszt.net behandelt bge und andere RISC-V-Befehle ausführlicher.
Kodierungsformat
Beschreibung
bge bildet ein Paar mit blt und kehrt dessen Bedingung um. Die Buchstaben stehen für branch if greater than or equal (Verzweigung, wenn größer oder gleich). Wenn rs1 mindestens rs2 entspricht, springt die untenstehende Anweisung zur markierten Position. Andernfalls wird die Ausführung mit der nächsten Anweisung fortgesetzt.
bge rs1, rs2, label
Für zwei beliebige Werte führt genau eine von blt und bge die Verzweigung aus, sodass die beiden alle Fälle abdecken. Der Vergleich wird unter blt beschrieben, und Verzweigungen im Allgemeinen unter beq.
bge erscheint häufig am Anfang einer Schleife als Abbruchtest. Die folgende Zeile verlässt die Schleife, sobald der Zähler t1 seinen Grenzwert t2 erreicht.
bge t1, t2, done
Der Schleifenkörper folgt, und ein unbedingter Sprung an seinem Ende kehrt zum Anfang zurück. Das Testen vor dem Körper behandelt null Wiederholungen, da ein Körper, dessen Bedingung bereits erfüllt ist, nie ausgeführt wird.
Der Teil or equal (oder gleich) entscheidet über das Verhalten an der Grenze. bge verzweigt, wenn die beiden Werte gleich sind, und Off-by-one-Fehler in Schleifen lassen sich meist auf diese Grenze zurückführen. Eine Schleife, die von 0 bis n zählt, wird verlassen, wenn der Zähler n erreicht.
Gemäß dem RISC-V-Handbuch führen bge und bgeu die Verzweigung aus, wenn rs1 größer oder gleich rs2 ist, wobei sie vorzeichenbehaftete bzw. vorzeichenlose Werte vergleichen. Ein Verzweigungsversatz ist ein 12-Bit-Wert, gemessen in Vielfachen von 2 Bytes.
Wie bei blt ist der Vergleich vorzeichenbehaftet, sodass negative Werte zulässig sind. bgeu ist die vorzeichenlose Form, die für Adressen und Größen verwendet wird. Ein häufiger Anwendungsfall ist die Prüfung, dass ein Wert nicht negativ ist, wie in der folgenden Zeile.
bge t0, zero, ok
Beispiel
bge t1, t2, done # leave the loop once i >= n
