div
lyszt.net tratta div e altre istruzioni RISC-V in modo più dettagliato.
Formato di codifica
Descrizione
div divide un registro per un altro. Legge i registri sorgente rs1 e rs2, divide il primo per il secondo e scrive il risultato nel registro di destinazione rd. La forma seguente significa rd = rs1 / rs2.
div rd, rs1, rs2
Come la moltiplicazione, appartiene all'estensione M delle istruzioni matematiche opzionali, che questo simulatore include.
Questa è una divisione intera, quindi la parte frazionaria viene scartata. 7 diviso per 2 dà 3. L'1 rimanente proviene da rem, che calcola il resto degli stessi due numeri. I risultati negativi arrotondano verso zero, quindi -7 / 2 dà -3.
La divisione per zero restituisce -1, un registro con ogni bit impostato a 1. L'hardware non dà alcun avviso, quindi il codice che deve trattare un divisore zero come errore controlla il divisore prima di dividere.
Il manuale RISC-V specifica i casi speciali. La divisione per zero dà un quoziente con ogni bit impostato, che si legge come -1 per div, e un resto uguale al dividendo. L'overflow con segno avviene solo quando il numero più negativo viene diviso per -1. Il quoziente allora è uguale al dividendo e il resto è zero. Il manuale dice che una trap sulla divisione per zero è stata considerata e rifiutata, perché sarebbe l'unica trap aritmetica nel set di istruzioni, e che tutti i bit impostati mantiene semplice il circuito divisore.
Per qualsiasi divisione che non va in overflow, il dividendo è uguale al divisore per il quoziente più il resto. Quando sono necessari sia il quoziente che il resto, il manuale raccomanda le due righe seguenti, con rdq diverso da rs1 e rs2. Un processore può quindi fondere le due in un'unica divisione.
div rdq, rs1, rs2 rem rdr, rs1, rs2
La divisione è l'aritmetica più lenta che un processore esegue, spesso molte volte più lenta della moltiplicazione. La divisione per una potenza di due (2, 4, 8 e così via) può usare invece uno scorrimento a destra (vedi srai). L'esempio divide 17 per 5. Il 5 entra nel 17 tre volte intere con 2 rimanenti, quindi il quoziente 3 va in t2.
Esempio
li t0, 17 li t1, 5 div t2, t0, t1 # t2 = 3
