bgeu

bgeu

RISC-V Assembler Referenz

lyszt.net behandelt bgeu 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

bgeu ist die vorzeichenlose Version von bge und das Gegenteil von bltu. Der Name bedeutet branch if greater than or equal, unsigned. Er springt zur Marke, wenn rs1 mindestens rs2 ist, wobei beide als nicht negative Zahlen gelesen werden. Siehe bge für den Vergleich und bltu für das, was das Vorzeichenlose ändert.

Mit bgeu hat die Familie sechs Branches. Es gibt drei Fragen, gleich, kleiner als und größer oder gleich, und die letzten beiden gibt es in einer vorzeichenbehafteten und einer vorzeichenlosen Form. beq und bne prüfen auf Gleichheit, blt und bge vergleichen vorzeichenbehaftete Werte, und bltu und bgeu vergleichen vorzeichenlose Werte. Diese sechs decken zusammen mit dem Vertauschen der Operanden für die Richtungen größer als und kleiner oder gleich jeden Vergleich ab, den ein Programm benötigt.

bgeu eignet sich für Grenzen von Größen, die nicht negativ sein können. Beispiele sind das Verlassen einer Schleife, wenn eine Position das Ende erreicht, das Zurückweisen eines Index, der die Arraygröße erreicht hat, und das Verzweigen zu einem Handler, wenn eine Länge die Kapazität erreicht. Der Vergleich von Speicheradressen verwendet bltu und bgeu, da Adressen vorzeichenlos sind, und die vorzeichenbehafteten Versionen dort falsche Ergebnisse liefern.

Das RISC-V-Handbuch sagt, dass vorzeichenbehaftete Array-Grenzen mit einem einzigen vorzeichenlosen Branch geprüft werden können, da jeder negative Index größer als jede nicht negative Grenze verglichen wird. bgeu und bltu sind die beiden Formen dieser Prüfung.

Die folgende Zeile führt die kombinierte Grenzprüfung in einer einzigen Anweisung aus.

bgeu i, n, error

Sie fängt einen Index ab, der zu groß oder negativ ist, weil ein negativer Index als riesiger vorzeichenloser Wert gelesen wird und den Test nicht besteht.

Beispiel

li t0, -1
li t1, 1
bgeu t0, t1, done   # t0 read as unsigned is huge, so jump to 'done'