bltu

bltu

RISC-V Assembler Referenz

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

bltu führt denselben Sprung wie blt aus, liest aber beide Register als vorzeichenlos. Der Name steht für branch if less than, unsigned. Der Sprung wird genommen, wenn rs1 kleiner als rs2 ist, wobei beide Werte als nicht negative Zahlen von 0 bis etwa 4 Milliarden gelesen werden. Die Seite blt beschreibt den Sprung selbst. Diese Seite erklärt, warum die vorzeichenlose Lesart eine eigene Instruktion hat.

Dieselben 32 Bits stellen unterschiedliche Zahlen dar, je nachdem, ob das höchste Bit als Vorzeichen oder als Teil des Werts gelesen wird. blt liest die Bits als vorzeichenbehaftet und bltu liest sie als vorzeichenlos, und die beiden Lesarten stimmen nicht überein. Ein Register, bei dem alle Bits auf 1 gesetzt sind, ist für blt -1, ein sehr kleiner Wert, und für bltu der größtmögliche Wert. Die falsche Instruktion zu wählen, liefert ein falsches Ergebnis ohne Fehlermeldung.

bltu passt zu allem, was nicht negativ sein kann, wie Speicheradressen, Größen, Zähler und Positionen. Der Vergleich von Adressen mit dem vorzeichenbehafteten blt schlägt fehl, sobald eine Adresse groß genug ist, dass ihr höchstes Bit gesetzt ist, weil die vorzeichenbehaftete Lesart sie negativ macht.

Das RISC-V-Handbuch erwähnt dieselbe Bereichsprüfung. Eine vorzeichenbehaftete Array-Grenze kann mit einem einzigen bltu geprüft werden, da jeder negative Index größer als jede nicht negative Grenze verglichen wird.

Ein einzelnes bltu prüft, ob ein Index im Bereich liegt, mindestens 0 und unter der Größe n.

bltu i, n, ok

Wenn i negativ ist, ist seine vorzeichenlose Lesart eine sehr große Zahl und besteht den Test nicht, sodass ein einziger vorzeichenloser Vergleich sowohl den zu großen als auch den negativen Fall abfängt.

Beispiel

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