div
lyszt.net aborda div e outras instruções RISC-V com mais detalhes.
Formato de codificação
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
