add

add

Assembleur RISC-V Référence

lyszt.net couvre add 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

add additionne les valeurs de deux registres et stocke le résultat dans un troisième. Un registre est un petit emplacement à l'intérieur du processeur qui contient un seul nombre de 32 bits. RISC-V fournit 32 registres. Un bit vaut 0 ou 1, et 32 bits couvrent les nombres entiers de 0 jusqu'à environ quatre milliards. L'arithmétique se déroule entre registres et ne touche jamais directement la mémoire.

add a la forme ci-dessous, et le résultat est rd = rs1 + rs2. rd est le registre de destination, où va la réponse. rs1 et rs2 sont les registres sources, et leurs valeurs restent inchangées.

add rd, rs1, rs2

La destination peut aussi servir de source. La ligne ci-dessous ajoute t1 à t0 et remet le résultat dans t0. Les cumuls dans les boucles utilisent cette forme.

add t0, t0, t1

Un registre contient au plus 32 bits. Lorsqu'une somme dépasse la plus grande valeur qu'un registre peut contenir, le résultat revient à un petit nombre, comme une horloge de 24 heures passe de 23:59 à 00:00. C'est un débordement, et RISC-V n'émet aucun avertissement lorsqu'il se produit.

Le manuel RISC-V indique qu'aucune instruction de calcul entier ne déclenche d'exception arithmétique, et que le jeu d'instructions de base n'effectue aucun contrôle de débordement car les branchements s'en chargent à faible coût. Pour l'addition non signée, un seul branchement après l'add suffit. Dans les deux lignes ci-dessous, le branchement saute vers l'étiquette overflow lorsque la somme est inférieure à un opérande, ce qui ne se produit que si la somme a débordé.

add t0, t1, t2
bltu t0, t1, overflow

Dans l'exemple, les deux premières lignes utilisent li (load immediate) pour placer les constantes 3 et 4 dans t0 et t1. La ligne add laisse ensuite 7 dans t2.

Exemple

li t0, 3
li t1, 4
add t2, t0, t1   # t2 = 7