negpseudo

neg

pseudo
Assembly RISC-V Referência

lyszt.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