divu

divu

RISC-V Assembler Referenz

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

divu führt eine vorzeichenlose Division durch. Die 32 Bits eines Registers können auf zwei Arten interpretiert werden. Bei der vorzeichenbehafteten Lesart signalisiert das höchste Bit eine negative Zahl, sodass die Bits Werte von etwa -2 Milliarden bis +2 Milliarden darstellen. Bei der vorzeichenlosen Lesart gibt es keine negativen Werte, und die Bits zählen von 0 bis etwa 4 Milliarden. Die Bits ändern sich nicht. Nur die Interpretation ändert sich.

div behandelt seine Eingaben als vorzeichenbehaftet, während divu sie als vorzeichenlos behandelt. Nahe dem oberen Ende des Bereichs liefern die beiden unterschiedliche Ergebnisse. Ein Register, bei dem alle Bits auf 1 gesetzt sind, ist für div -1 und für divu 4.294.967.295.

divu eignet sich für Werte, die nicht negativ sein können: Array-Positionen, Größen in Bytes, Schleifenzähler, Pixelkoordinaten. Sobald einer dieser Werte etwa 2 Milliarden überschreitet, liefert das vorzeichenbehaftete div falsche Ergebnisse. Das höchste Bit wird gesetzt, und die vorzeichenbehaftete Lesart macht den Wert negativ.

Das RISC-V-Handbuch definiert den Quotienten einer vorzeichenlosen Division durch null als alle Bits gesetzt und den Rest als gleich dem Dividenden. Ein Überlauf bei der vorzeichenlosen Division kann laut Handbuch nicht auftreten. Alle Bits gesetzt ist die größte vorzeichenlose Zahl, und einfache vorzeichenlose Divisionsschaltungen erzeugen sie von selbst. Deshalb hat das Handbuch sie gewählt.

Die Division durch null liefert den größten vorzeichenlosen Wert, bei dem alle Bits gesetzt sind. Wenn der Divisor eine Zweierpotenz ist, teilt eine logische Rechtsverschiebung (srli) schneller. Eine Verschiebung um 3 nach rechts teilt eine vorzeichenlose Zahl durch 8.

Beispiel

li t0, -2
li t1, 2
divu t2, t0, t1   # t2 = 2147483647 (t0 read as unsigned)