remu

remu

Assembly RISC-V Riferimento

lyszt.net tratta remu e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

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

Descrizione

remu calcola il resto senza segno, il valore che rimane dopo una divisione senza segno. Si rapporta a divu come rem si rapporta a div. La u significa che i bit sono trattati come numeri non negativi, da 0 fino a circa 4 miliardi. La pagina divu spiega come differiscono le letture con segno e senza segno degli stessi bit.

Un risultato di remu cade sempre tra 0 e il divisore meno 1, quindi non è mai negativo e non ha una regola del segno. Ciò lo rende utile per far girare una posizione attorno a un buffer circolare, distribuire valori di hash su un numero fisso di slot e scorrere ciclicamente una sequenza ripetitiva.

Un resto per zero restituisce il numero originale.

Secondo il manuale RISC-V, l'overflow della divisione senza segno non può verificarsi, quindi remu non ha un caso di overflow. Un resto per zero è uguale al dividendo. Il manuale raccomanda di eseguire divu e remu sugli stessi operandi quando servono sia il quoziente sia il resto, così un processore può fonderli in un'unica divisione.

Per un divisore che è una potenza di due, un AND bit a bit (andi) produce lo stesso risultato in modo più economico. La riga seguente calcola il resto dopo la divisione per 8, poiché il resto per una potenza di due è costituito dai bit più bassi del valore.

andi t0, t0, 7

Questa scorciatoia si applica solo alle potenze di due.

Esempio

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