divu

divu

Assembly RISC-V Referência

lyszt.net aborda divu e outras instruções RISC-V com mais detalhes.

Formato de codificação

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

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)