divu
lyszt.net tratta divu e altre istruzioni RISC-V in modo più dettagliato.
Formato di codifica
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)
