bltu
lyszt.net behandelt bltu und andere RISC-V-Befehle ausführlicher.
Kodierungsformat
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'
