snezpseudo

snez

pseudo
Assembly RISC-V Referência

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

Descrição

snez testa se um registrador contém um valor diferente de zero, o inverso de seqz. O nome significa set if not equal to zero (definir se diferente de zero). Quando rs é diferente de zero, a forma abaixo escreve 1 em rd, e quando rs é zero ela escreve 0.

snez rd, rs

snez é uma pseudoinstrução, como seqz, e o montador a expande em uma instrução real. Essa instrução pergunta se zero é menor que o valor.

sltu rd, zero, rs

Isso vale para qualquer valor exceto zero. O montador realiza a tradução quando você escreve snez.

Um cálculo frequentemente produz um valor cuja única propriedade útil é saber se ele é zero, como uma contagem de itens restantes, a diferença entre duas coisas ou um grupo de flags. snez reduz esse valor a 1 quando ele é diferente de zero e a 0 quando ele é zero, a forma padrão para uma função que retorna uma resposta de sim ou não.

O manual do RISC-V define snez como uma pseudoinstrução de montador para sltu com x0 como primeira fonte. Ela define rd como 1 se rs2 for diferente de zero e como 0 caso contrário.

snez funciona com XOR para testar desigualdade. Aplique XOR aos dois valores, o que produz um resultado diferente de zero apenas quando eles diferem, e então aplique snez para obter 1 quando eles forem diferentes. Juntamente com seqz, isso produz um resultado verdadeiro ou falso para igual e para diferente, que você pode combinar com and e or em condições maiores sem um salto.

Expande para

sltu rd, zero, rs

O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.

Exemplo

li t0, 5
snez t1, t0       # t1 = 1