rem
lyszt.net aborda rem e outras instruções RISC-V com mais detalhes.
Formato de codificação
Descrição
rem retorna o resto de uma divisão, ou seja, o valor que sobra. Ao dividir 17 por 5, o número cabe 3 vezes, sobrando 2. div retorna o 3 e rem retorna o 2. O nome é a abreviação de “remainder” (restante). A sintaxe é mostrada abaixo e significa rd = o resto da divisão de rs1 por rs2.
rem rd, rs1, rs2
Pertence à mesma extensão matemática opcional M que div.
As duas instruções operam sobre o mesmo par de números e, juntas, fornecem o quociente e o resto. rem é a forma em linguagem de montagem do operador % (módulo) em linguagens de alto nível.
Com números negativos, o resto assume o sinal do número que está sendo dividido. 7 com resto 2 é 1, e -7 com resto 2 é -1. Um teste para números ímpares que verifica se o resto da divisão por 2 é igual a 1 fornece a resposta errada para números negativos. Verificar se o resto é zero determina se o número é par ou ímpar para qualquer sinal.
O manual do RISC-V afirma que rem fornece o resto da divisão correspondente e que um resultado diferente de zero tem o sinal do dividendo. Toda divisão que não cause estouro satisfaz a relação: dividendo = divisor vezes quociente mais resto. Um resto da divisão por zero é igual ao dividendo, e o caso de estouro com sinal, o número mais negativo dividido por -1, resulta em um resto igual a zero. Para obter o quociente e o resto da mesma divisão, o manual recomenda usar div e, em seguida, rem nos mesmos operandos, o que um processador pode fundir em uma única divisão.
Os restos são usados para fazer um contador voltar ao início de um buffer, para remover dígitos de um número e para distribuir itens entre slots. Um resto por zero retorna o número original. O exemplo calcula 17 com resto 5 e deixa 2 em t2.
Exemplo
li t0, 17 li t1, 5 rem t2, t0, t1 # t2 = 2
