snez
pseudolyszt.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
