mulh

mulh

RISC-V アセンブリ 参考

lyszt.netはmulhおよびその他のRISC-V命令をより詳しく扱っています。

エンコーディング形式

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

説明

mulh は積の上位 32 ビットを返します。2 つの 32 ビット数を掛けると、結果は 64 ビットもの幅になり得ますが、レジスタは 32 ビットしか保持できません。mul 命令は下位 32 ビットを保持し、残りを破棄します。mulh(multiply high)は上位 32 ビットを保持します。

同じ入力に対して両方の命令を実行すれば、積全体が得られます。mulh は上半分を一方のレジスタに書き込み、mul は下半分を別のレジスタに書き込み、このペアで完全な 64 ビットの結果を保持します。

上半分はオーバーフロー、つまり 32 ビットには大きすぎる積を示します。上半分に意味のある値があれば、その積は 1 つのレジスタに収まらないということです。非常に大きな数の演算や暗号技術は、両方の半分に依存しています。

RISC-V マニュアルは mulh のほかに 2 つの変種を定義しています。mulhu は 2 つの符号なし数を掛け、mulhsu は rs1 の符号付き数に rs2 の符号なし数を掛けます。マニュアルによれば、mulhsu は多語符号付き乗算に現れ、一方の数の符号ビットを持つ最上位ワードが、もう一方の数の符号なしの下位ワードと掛け合わされます。

h は high を表します。このバージョンはオペランドを符号付きとして扱うため、負の値も取り得ます。RISC-V 仕様は符号なしの変種も定義していますが、このシミュレータは符号付きの mulh を提供します。すべての乗算・除算命令と同様に、定数形式は存在しないため、両方の入力はレジスタから来ます。

例

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