div

div

Assembly RISC-V Riferimento

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

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