beqz
pseudolyszt.net aborda beqz e outras instruções RISC-V com mais detalhes.
Descrição
beqz desvia quando um registrador contém zero. O nome significa desviar se igual a zero. Com a forma abaixo, o processador salta para a posição rotulada quando rs é zero e, caso contrário, continua para a próxima instrução.
beqz rs, label
beqz é uma pseudoinstrução, um nome legível que o montador reescreve como uma instrução real. Ela se torna a instrução abaixo, que compara o registrador com zero, o registrador especial que sempre contém 0.
beq rs, zero, label
beqz oferece uma forma mais curta de escrever a comparação mais comum. Consulte beq para saber como funcionam os desvios e os rótulos.
Zero aparece com frequência em código de baixo nível, e é por isso que a forma abreviada existe. Um byte zero marca o fim de um texto. Zero é o sinal habitual de que uma operação teve sucesso. Zero também representa um valor vazio ou ausente, e laços de contagem regressiva terminam em zero. O teste de zero é usado após carregar um caractere para detectar o fim de uma string, em um status retornado para seguir o caminho de sucesso e em um contador para encerrar um laço.
O manual do RISC-V apresenta uma razão pela qual seus desvios comparam dois registradores em vez de comparar um registrador com zero. As comparações com zero exigem um atraso de circuito não trivial, por isso são quase tão custosas quanto as comparações de magnitude aritmética. beqz é, portanto, uma pseudoinstrução que usa beq com zero.
A primeira linha abaixo é mais clara que a segunda, que explicita a comparação com zero.
beqz t0, done beq t0, zero, done
As pseudoinstruções existem para facilitar a leitura, e o código de máquina que produzem é idêntico. Seu oposto é bnez, que desvia quando um valor não é zero.
Expande para
beq rs, zero, label
O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.
Exemplo
li t0, 0 beqz t0, done # t0 == 0, so jump to 'done'
