div
lyszt.net cubre div y otras instrucciones RISC-V con más detalle.
Formato de codificación
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
