div

div

Ensamblador RISC-V Referencia

lyszt.net cubre div y otras instrucciones RISC-V con más detalle.

Formato de codificación

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

Descripción

div divide un registro entre otro. Lee los registros fuente rs1 y rs2, divide el primero entre el segundo y escribe el resultado en el registro destino rd. La forma de abajo significa rd = rs1 / rs2.

div rd, rs1, rs2

Al igual que la multiplicación, pertenece a la extensión M de instrucciones matemáticas opcionales, que este simulador incluye.

Es una división entera, por lo que se descarta la parte fraccionaria. 7 dividido entre 2 da 3. El 1 sobrante proviene de rem, que calcula el resto de los mismos dos números. Los resultados negativos se redondean hacia cero, por lo que -7 / 2 da -3.

Dividir entre cero devuelve -1, un registro con todos los bits puestos a 1. El hardware no da ninguna advertencia, por lo que el código que debe tratar un divisor cero como un error comprueba el divisor antes de dividir.

El manual de RISC-V especifica los casos especiales. Dividir entre cero da un cociente con todos los bits puestos, que se lee como -1 para div, y un resto igual al dividendo. El desbordamiento con signo ocurre solo cuando el número más negativo se divide entre -1. El cociente entonces es igual al dividendo y el resto es cero. El manual dice que se consideró y se rechazó una trampa en la división entre cero, porque sería la única trampa aritmética en el conjunto de instrucciones, y que todos los bits puestos mantiene simple el circuito divisor.

Para cualquier división que no se desborde, el dividendo es igual al divisor por el cociente más el resto. Cuando se necesitan tanto el cociente como el resto, el manual recomienda las dos líneas de abajo, con rdq distinto de rs1 y rs2. Un procesador puede entonces fusionar las dos en una sola división.

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

La división es la aritmética más lenta que hace un procesador, a menudo muchas veces más lenta que la multiplicación. Dividir entre una potencia de dos (2, 4, 8 y así sucesivamente) puede usar un desplazamiento a la derecha en su lugar (véase srai). El ejemplo divide 17 entre 5. 5 cabe en 17 tres veces enteras con 2 de sobra, por lo que el cociente 3 va a t2.

Ejemplo

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