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 将两个寄存器相乘。它读取 rs1 和 rs2,将这些值相乘,并将乘积写入 rd。下面的格式表示 rd = rs1 * rs2。

mul rd, rs1, rs2

RISC-V 按称为扩展的层次组织。乘法和除法属于名为 M 的扩展,最小的 RISC-V 核心可以省略它。此模拟器包含它,因为它的全名 RV32IM 以 M 结尾,所以 mul 和 div 可用。没有 M 的处理器必须在软件中完成这项工作。

两个 32 位数的乘积可能达到 64 位,这超出了一个寄存器所能容纳的范围。mul 保留低 32 位。对于较小的值,这就是完整的答案。高 32 位来自单独的指令 mulh。有符号和无符号输入产生相同的低 32 位,因此一条指令即可涵盖两者。

当需要乘积的两半时,RISC-V 手册建议使用固定的一对指令。mulh 指令(或其无符号变体之一)提供高半部分,而使用相同源寄存器、相同顺序的 mul 提供低半部分。高半部分的目标不能是 rs1 或 rs2。然后处理器可以将这两条指令融合为一次乘法。

乘以 2 的幂(2、4、8、16 等)可以改用左移。左移 3 位相当于乘以 8,而移位的成本低于乘法(参见 slli)。编译器会自动进行这种替换。该示例将 6 乘以 7,并在 t2 中留下 42。

示例

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