mul

mul

RISC-V アセンブリ 参考

lyszt.netはmulおよびその他の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

説明

mul は 2 つのレジスタを乗算します。rs1 と rs2 を読み取り、それらの値を乗算し、積を rd に書き込みます。以下の形式は rd = rs1 * rs2 を意味します。

mul rd, rs1, rs2

RISC-V は拡張機能と呼ばれる層で構成されています。乗算と除算は M という名前の拡張機能に属し、最小の RISC-V コアでは省略できます。このシミュレータはそれを含んでいます。その完全な名前 RV32IM が M で終わるため、mul と div が利用可能です。M を持たないプロセッサはソフトウェアでこの処理を行う必要があります。

2 つの 32 ビット数の積は 64 ビットに達することがあり、これは 1 つのレジスタが保持できる範囲を超えます。mul は下位 32 ビットを保持します。小さな値ではそれが答えの全体です。上位 32 ビットは別の命令 mulh から得られます。符号付きと符号なしの入力は同じ下位 32 ビットを生成するため、1 つの命令で両方をカバーします。

積の両方の半分が必要な場合、RISC-V マニュアルは固定された命令のペアを推奨しています。mulh 命令(またはその符号なし変種の 1 つ)が上位半分を提供し、同じソースレジスタを同じ順序で指定した mul が下位半分を提供します。上位半分の宛先は rs1 または rs2 にすることはできません。プロセッサはその後、2 つの命令を 1 つの乗算に融合できます。

2 のべき乗(2、4、8、16 など)を掛ける場合は、代わりに左シフトを使用できます。3 桁左にシフトすると 8 を掛けることになり、シフトは乗算よりもコストが低くなります(slli を参照)。コンパイラはこの置き換えを自動的に行います。例では 6 に 7 を掛け、t2 に 42 を残します。

例

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