bge

bge

RISC-V Assembler Referenz

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

Kodierungsformat

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

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