beqzpseudo

beqz

pseudo
Assembleur RISC-V Référence

lyszt.net couvre beqz et d'autres instructions RISC-V plus en détail.

Description

beqz effectue un branchement lorsqu'un registre contient zéro. Le nom signifie « brancher si égal à zéro ». Avec la forme ci-dessous, le processeur saute à la position étiquetée lorsque rs vaut zéro et, sinon, passe à l'instruction suivante.

beqz rs, label

beqz est une pseudo-instruction, un nom lisible que l'assembleur réécrit en une véritable instruction. Elle devient l'instruction ci-dessous, qui compare le registre avec zero, le registre spécial qui contient toujours 0.

beq rs, zero, label

beqz offre une façon plus courte d'écrire la comparaison la plus courante. Voir beq pour comprendre le fonctionnement des branchements et des étiquettes.

Zéro apparaît souvent dans le code de bas niveau, c'est pourquoi ce raccourci existe. Un octet nul marque la fin d'un texte. Zéro est le signal habituel qu'une opération a réussi. Zéro représente aussi une valeur vide ou manquante, et les boucles de décompte se terminent à zéro. Le test de zéro est utilisé après le chargement d'un caractère pour détecter la fin d'une chaîne, sur un statut renvoyé pour emprunter le chemin de succès et sur un compteur pour terminer une boucle.

Le manuel RISC-V donne une raison pour laquelle ses branchements comparent deux registres au lieu de comparer un registre avec zéro. Les comparaisons avec zéro nécessitent un délai de circuit non trivial, elles sont donc presque aussi coûteuses que les comparaisons de magnitude arithmétique. beqz est donc une pseudo-instruction qui utilise beq avec zero.

La première ligne ci-dessous se lit plus clairement que la seconde, qui explicite la comparaison avec zéro.

beqz t0, done
beq t0, zero, done

Les pseudo-instructions existent pour la lisibilité, et le code machine qu'elles produisent est identique. Son opposé est bnez, qui branche lorsqu'une valeur n'est pas zéro.

Se développe en

beq rs, zero, label

L'assembleur remplace cette pseudo-instruction par la ou les instructions réelles listées ci-dessus.

Exemple

li t0, 0
beqz t0, done   # t0 == 0, so jump to 'done'