remu

remu

Assembly RISC-V Referência

lyszt.net aborda remu 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

remu calcula o resto sem sinal, o valor que sobra após uma divisão sem sinal. Ele se relaciona com divu assim como rem se relaciona com div. O u significa que os bits são tratados como números não negativos, de 0 até aproximadamente 4 bilhões. A página divu aborda como as leituras com e sem sinal dos mesmos bits diferem.

Um resultado de remu sempre fica entre 0 e o divisor menos 1, portanto nunca é negativo e não tem regra de sinal. Isso o torna útil para fazer uma posição dar a volta em um buffer circular, distribuir valores de hash por um número fixo de slots e percorrer ciclicamente uma sequência repetitiva.

Um resto por zero retorna o número original.

De acordo com o manual RISC-V, o overflow de divisão sem sinal não pode ocorrer, então remu não tem caso de overflow. Um resto por zero é igual ao dividendo. O manual recomenda executar divu e remu sobre os mesmos operandos quando tanto o quociente quanto o resto são necessários, para que um processador possa fundi-los em uma única divisão.

Para um divisor que é uma potência de dois, um AND bit a bit (andi) produz o mesmo resultado de forma mais barata. A linha abaixo calcula o resto após dividir por 8, já que o resto por uma potência de dois são os bits mais baixos do valor.

andi t0, t0, 7

Esse atalho se aplica apenas a potências de dois.

Exemplo

li t0, -1
li t1, 10
remu t2, t0, t1   # t2 = 5 (t0 read as unsigned)