neg
pseudolyszt.net aborda neg e outras instruções RISC-V com mais detalhes.
Descrição
neg inverte o sinal de um número: 5 se torna -5, e -5 se torna 5. O nome é a abreviação de negate. A forma abaixo coloca a negação do registrador de origem rs no registrador de destino rd.
neg rd, rs
neg é uma pseudoinstrução. Um montador reescreve uma pseudoinstrução, que é um nome legível, em uma ou mais instruções reais antes que o processador a encontre. neg se torna a instrução abaixo, que subtrai o número de zero, o registrador especial que sempre contém 0.
sub rd, zero, rs
0 menos x é igual a -x, então isso produz a negação. O RISC-V mantém seu conjunto de instruções reais pequeno ao reutilizar a subtração e o registrador zero dessa forma.
O intervalo dos números negativos se estende um passo além do intervalo positivo. Ele alcança cerca de -2,1 bilhões e apenas cerca de +2,1 bilhões. O número mais negativo não tem contraparte positiva, então negá-lo causa um wraparound e resulta no mesmo número. O código que calcula valores absolutos deve considerar esse caso.
O manual do RISC-V define sub como a subtração de rs2 de rs1 e descreve o registrador x0, chamado zero aqui, como fixado em hardware a um valor cujos bits são todos 0. Subtrair um valor de x0 produz seu negativo, que é a forma que neg assume.
O exemplo nega 5 em -5. Combinado com um desvio que pula neg quando o número já é positivo, ele produz o valor absoluto usual em duas instruções.
Expande para
sub rd, zero, rs
O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.
Exemplo
li t0, 5 neg t1, t0 # t1 = -5
Referências
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.2, Integer Register-Register Instructions, page 29.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.1, Programmers' Model for Base Integer ISA, page 23.
