beq

beq

Assembleur RISC-V Référence

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

Format d'encodage

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Description

beq permet à un programme de prendre une décision. Le processeur exécute normalement les instructions dans l'ordre où elles apparaissent dans la liste. Cet ordre à lui seul ne peut rien choisir ni répéter. Un branchement modifie l'ordre. Il teste une condition, et si la condition est vraie, le processeur continue à un autre endroit au lieu de la ligne suivante. Toutes les instructions if et les boucles sont construites à partir de branchements.

L'autre endroit est nommé par une étiquette, un nom suivi de deux-points qui marque une position dans le code, comme l'étiquette done dans l'exemple. beq (branch if equal, brancher si égal) compare deux registres. Lorsqu'ils contiennent la même valeur, il saute à la position étiquetée ; lorsqu'ils diffèrent, l'exécution se poursuit avec l'instruction suivante. La forme apparaît ci-dessous.

beq rs1, rs2, label

beq change uniquement l'instruction qui s'exécute ensuite. Stocker le résultat oui ou non d'une comparaison sous forme de nombre nécessite une instruction différente, décrite sur la page slt.

Le processeur suit sa position avec un registre appelé compteur de programme, qui contient l'adresse de l'instruction en cours d'exécution. Un branchement pris modifie cette adresse, de sorte que l'instruction suivante provient de l'étiquette.

Le manuel RISC-V indique qu'un branchement conditionnel stocke son décalage sous forme d'une valeur de 12 bits comptée en multiples de 2 octets. Le décalage est étendu en signe et ajouté à l'adresse de l'instruction de branchement, ce qui donne une plage de plus ou moins 4 Kio, où un Kio vaut 1024 octets. Les instructions de branchement comparent deux registres directement et n'utilisent aucun code de condition. Le manuel donne comme raison qu'une instruction combinée de comparaison et de branchement s'intègre dans un pipeline régulier et ne nécessite ni état supplémentaire ni registre temporaire. Il conseille également au logiciel de garder le chemin le plus courant sous forme de code linéaire et de s'attendre à ce que les branchements vers l'arrière soient prédits comme pris et les branchements vers l'avant comme non pris, au moins la première fois qu'ils sont rencontrés.

Un branchement compare deux registres et ne peut pas prendre une constante écrite dans l'instruction, donc une forme comme beq t0, 5, label n'existe pas. Pour comparer un registre avec une constante, chargez d'abord la constante dans un registre avec li, puis comparez les deux registres.

li t1, 5
beq t0, t1, done

La valeur 0 n'a pas besoin d'être chargée, car le registre zero la contient toujours.

Un usage courant compare un registre avec zero, le registre qui contient toujours 0, pour demander si une valeur a atteint zéro. Cela termine les boucles de compte à rebours et vérifie les résultats. L'exemple branche vers done lorsque a0 a été décrémenté jusqu'à zéro. beq et les étiquettes suffisent pour construire chaque décision et chaque boucle dans un programme.

Exemple

beq a0, zero, done   # if a0 == 0, jump to 'done'