remu

remu

RISC-V Assembler Referenz

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

remu berechnet den vorzeichenlosen Rest, den Wert, der nach einer vorzeichenlosen Division übrig bleibt. Es verhält sich zu divu wie rem zu div. Das u bedeutet, dass die Bits als nicht negative Zahlen behandelt werden, von 0 bis etwa 4 Milliarden. Die Seite divu behandelt, wie sich vorzeichenbehaftete und vorzeichenlose Lesarten derselben Bits unterscheiden.

Ein remu-Ergebnis liegt immer zwischen 0 und dem Divisor minus 1, ist also nie negativ und hat keine Vorzeichenregel. Dadurch ist es nützlich, um eine Position in einem Ringpuffer umlaufen zu lassen, Hash-Werte auf eine feste Anzahl von Slots zu verteilen und eine sich wiederholende Sequenz zyklisch zu durchlaufen.

Ein Rest durch null gibt die ursprüngliche Zahl zurück.

Laut dem RISC-V-Handbuch kann ein Überlauf bei der vorzeichenlosen Division nicht auftreten, daher hat remu keinen Überlauf-Fall. Ein Rest durch null ist gleich dem Dividenden. Das Handbuch empfiehlt, divu und remu mit denselben Operanden auszuführen, wenn sowohl der Quotient als auch der Rest benötigt werden, damit ein Prozessor sie zu einer einzigen Division verschmelzen kann.

Für einen Divisor, der eine Zweierpotenz ist, liefert ein bitweises UND (andi) dasselbe Ergebnis kostengünstiger. Die folgende Zeile berechnet den Rest nach Division durch 8, da der Rest durch eine Zweierpotenz die niedrigsten Bits des Werts sind.

andi t0, t0, 7

Diese Abkürzung gilt nur für Zweierpotenzen.

Beispiel

li t0, -1
li t1, 10
remu t2, t0, t1   # t2 = 5 (t0 read as unsigned)