div

div

Assembly RISC-V Referência

lyszt.net aborda div e outras instruções RISC-V com mais detalhes.

Formato de codificação

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

Descrição

div divide um registrador por outro. Ele lê os registradores de origem rs1 e rs2, divide o primeiro pelo segundo e escreve o resultado no registrador de destino rd. A forma abaixo significa rd = rs1 / rs2.

div rd, rs1, rs2

Como a multiplicação, pertence à extensão M de instruções matemáticas opcionais, que este simulador inclui.

Esta é uma divisão inteira, então a parte fracionária é descartada. 7 dividido por 2 dá 3. O 1 restante vem de rem, que calcula o resto dos mesmos dois números. Resultados negativos arredondam em direção a zero, então -7 / 2 dá -3.

Dividir por zero retorna -1, um registrador com todos os bits definidos como 1. O hardware não dá nenhum aviso, então o código que deve tratar um divisor zero como erro verifica o divisor antes de dividir.

O manual RISC-V especifica os casos especiais. Dividir por zero dá um quociente com todos os bits definidos, que é lido como -1 para div, e um resto igual ao dividendo. O overflow com sinal acontece apenas quando o número mais negativo é dividido por -1. O quociente então é igual ao dividendo e o resto é zero. O manual diz que uma armadilha na divisão por zero foi considerada e rejeitada, porque seria a única armadilha aritmética no conjunto de instruções, e que todos os bits definidos mantém o circuito divisor simples.

Para qualquer divisão que não cause overflow, o dividendo é igual ao divisor vezes o quociente mais o resto. Quando tanto o quociente quanto o resto são necessários, o manual recomenda as duas linhas abaixo, com rdq diferente de rs1 e rs2. Um processador pode então fundir as duas em uma única divisão.

div rdq, rs1, rs2
rem rdr, rs1, rs2

A divisão é a aritmética mais lenta que um processador faz, muitas vezes várias vezes mais lenta que a multiplicação. Dividir por uma potência de dois (2, 4, 8 e assim por diante) pode usar um deslocamento à direita em vez disso (veja srai). O exemplo divide 17 por 5. 5 cabe em 17 três vezes inteiras com 2 de sobra, então o quociente 3 vai para t2.

Exemplo

li t0, 17
li t1, 5
div t2, t0, t1   # t2 = 3