divu

divu

Assembly RISC-V Riferimento

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

divu esegue una divisione senza segno. I 32 bit di un registro possono essere interpretati in due modi. Nella lettura con segno, il bit più alto segnala un numero negativo, quindi i bit rappresentano valori da circa -2 miliardi a +2 miliardi. Nella lettura senza segno, non esistono negativi e i bit contano da 0 a circa 4 miliardi. I bit non cambiano. Cambia solo l'interpretazione.

div tratta i suoi input come con segno, mentre divu li tratta come senza segno. Vicino al limite superiore dell'intervallo i due producono risultati diversi. Un registro con tutti i bit impostati a 1 è -1 per div e 4.294.967.295 per divu.

divu è adatto a valori che non possono essere negativi: posizioni negli array, dimensioni in byte, conteggi di ciclo, coordinate dei pixel. Una volta che uno di questi valori supera circa 2 miliardi, div con segno restituisce risultati errati. Il bit più alto si attiva, e la lettura con segno rende il valore negativo.

Il manuale RISC-V definisce il quoziente di una divisione senza segno per zero come tutti i bit impostati, e il resto come uguale al dividendo. Secondo il manuale, l'overflow della divisione senza segno non può verificarsi. Tutti i bit impostati è il più grande numero senza segno, e i semplici circuiti divisori senza segno lo producono da soli. Ecco perché il manuale lo ha scelto.

La divisione per zero restituisce il più grande valore senza segno, con tutti i bit impostati. Se il divisore è una potenza di due, uno scorrimento logico a destra (srli) divide più velocemente. Scorrere a destra di 3 divide un numero senza segno per 8.

Esempio

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