divu
lyszt.net aborda divu e outras instruções RISC-V com mais detalhes.
Formato de codificação
Descrição
divu realiza divisão sem sinal. Os 32 bits de um registrador podem ser interpretados de duas maneiras. Na leitura com sinal, o bit mais significativo indica um número negativo, então os bits representam valores de cerca de -2 bilhões a +2 bilhões. Na leitura sem sinal, não existem negativos e os bits contam de 0 a cerca de 4 bilhões. Os bits não mudam. Apenas a interpretação muda.
div trata suas entradas como com sinal, enquanto divu as trata como sem sinal. Perto do topo do intervalo, os dois produzem resultados diferentes. Um registrador com todos os bits definidos como 1 é -1 para div e 4.294.967.295 para divu.
divu é adequado para valores que não podem ser negativos: posições em arrays, tamanhos em bytes, contagens de laço, coordenadas de pixel. Quando um desses valores ultrapassa cerca de 2 bilhões, o div com sinal retorna resultados errados. O bit mais significativo é ativado, e a leitura com sinal torna o valor negativo.
O manual do RISC-V define o quociente de uma divisão sem sinal por zero como todos os bits definidos, e o resto como igual ao dividendo. O estouro da divisão sem sinal não pode ocorrer, segundo o manual. Todos os bits definidos é o maior número sem sinal, e circuitos divisores sem sinal simples o produzem por conta própria. É por isso que o manual o escolheu.
A divisão por zero retorna o maior valor sem sinal, com todos os bits definidos. Se o divisor for uma potência de dois, um deslocamento lógico à direita (srli) divide mais rápido. Deslocar à direita em 3 divide um número sem sinal por 8.
Exemplo
li t0, -2 li t1, 2 divu t2, t0, t1 # t2 = 2147483647 (t0 read as unsigned)
