mulh

mulh

Assembleur RISC-V Référence

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

mulh renvoie les 32 bits supérieurs d'un produit. Deux nombres de 32 bits peuvent être multipliés pour donner un résultat allant jusqu'à 64 bits, alors qu'un registre en contient 32. L'instruction mul conserve les 32 bits inférieurs et rejette le reste. mulh (multiply high) conserve les 32 bits supérieurs.

Exécutez les deux instructions sur les mêmes entrées et vous obtenez le produit complet. mulh écrit la moitié supérieure dans un registre, mul écrit la moitié inférieure dans un autre, et la paire contient le résultat complet sur 64 bits.

La moitié supérieure indique un débordement, c'est-à-dire un produit trop grand pour 32 bits. Une valeur significative dans la moitié supérieure signifie que le produit ne tient pas dans un seul registre. L'arithmétique sur de très grands nombres et la cryptographie reposent sur les deux moitiés.

Le manuel RISC-V définit deux autres variantes en plus de mulh. mulhu multiplie deux nombres non signés, et mulhsu multiplie un nombre signé dans rs1 par un nombre non signé dans rs2. Selon le manuel, mulhsu apparaît dans la multiplication signée multi-mots, où le mot le plus significatif d'un nombre, qui porte le bit de signe, est multiplié par les mots moins significatifs de l'autre, qui sont non signés.

Le h signifie high (supérieur). Cette version traite ses opérandes comme signés, ils peuvent donc être négatifs. La spécification RISC-V définit également des variantes non signées, et ce simulateur fournit le mulh signé. Comme pour toutes les instructions de multiplication et de division, aucune forme à constante n'existe, donc les deux entrées proviennent de registres.

Exemple

li t0, 100000
li t1, 100000
mulh t2, t0, t1   # t2 = 2 (high bits of 100000 * 100000)