mul

mul

Assembleur RISC-V Référence

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

mul multiplie deux registres. Il lit rs1 et rs2, multiplie ces valeurs et écrit le produit dans rd. Le format ci-dessous signifie rd = rs1 * rs2.

mul rd, rs1, rs2

RISC-V est organisé en couches appelées extensions. La multiplication et la division appartiennent à l'extension nommée M, que le plus petit cœur RISC-V peut omettre. Ce simulateur l'inclut, car son nom complet RV32IM se termine par M, donc mul et div sont disponibles. Un processeur sans M doit effectuer le travail en logiciel.

Le produit de deux nombres de 32 bits peut atteindre 64 bits, ce qui dépasse ce qu'un registre peut contenir. mul conserve les 32 bits inférieurs. Pour de petites valeurs, c'est la réponse complète. Les 32 bits supérieurs proviennent d'une instruction distincte, mulh. Les entrées signées et non signées produisent les mêmes 32 bits inférieurs, donc une seule instruction couvre les deux cas.

Lorsque les deux moitiés d'un produit sont nécessaires, le manuel RISC-V recommande une paire fixe d'instructions. Une instruction mulh (ou l'une de ses variantes non signées) fournit la moitié supérieure, et mul avec les mêmes registres sources dans le même ordre fournit la moitié inférieure. La destination de la moitié supérieure ne peut pas être rs1 ou rs2. Un processeur peut alors fusionner les deux instructions en une seule multiplication.

Multiplier par une puissance de deux (2, 4, 8, 16, etc.) peut utiliser un décalage à gauche à la place. Un décalage à gauche de 3 places multiplie par 8, et un décalage coûte moins qu'une multiplication (voir slli). Les compilateurs effectuent ce remplacement automatiquement. L'exemple multiplie 6 par 7 et laisse 42 dans t2.

Exemple

li t0, 6
li t1, 7
mul t2, t0, t1   # t2 = 42