divu
lyszt.net cubre divu y otras instrucciones RISC-V con más detalle.
Formato de codificación
Descripción
divu realiza una división sin signo. Los 32 bits de un registro pueden interpretarse de dos maneras. Bajo la lectura con signo, el bit superior indica un número negativo, por lo que los bits representan valores desde aproximadamente -2 mil millones hasta +2 mil millones. Bajo la lectura sin signo, no existen negativos y los bits cuentan de 0 a aproximadamente 4 mil millones. Los bits no cambian. Solo cambia la interpretación.
div trata sus entradas como con signo, mientras que divu las trata como sin signo. Cerca del extremo superior del rango, ambas producen resultados diferentes. Un registro con todos los bits en 1 es -1 para div y 4.294.967.295 para divu.
divu es adecuado para valores que no pueden ser negativos: posiciones de arrays, tamaños en bytes, recuentos de bucles, coordenadas de píxeles. Una vez que uno de estos valores supera aproximadamente los 2 mil millones, div con signo devuelve resultados incorrectos. El bit superior se activa y la lectura con signo hace que el valor sea negativo.
El manual de RISC-V define el cociente de una división sin signo por cero como todos los bits en 1, y el resto como igual al dividendo. Según el manual, el desbordamiento en la división sin signo no puede ocurrir. Todos los bits en 1 es el mayor número sin signo, y los circuitos divisores sin signo simples lo producen por sí solos. Por eso el manual lo eligió.
La división por cero devuelve el mayor valor sin signo, con todos los bits en 1. Si el divisor es una potencia de dos, un desplazamiento lógico a la derecha (srli) divide más rápido. Desplazar a la derecha 3 divide un número sin signo entre 8.
Ejemplo
li t0, -2 li t1, 2 divu t2, t0, t1 # t2 = 2147483647 (t0 read as unsigned)
