mulh
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 位。两个 32 位数相乘的结果可能宽达 64 位,而一个寄存器只能容纳 32 位。mul 指令保留低 32 位并丢弃其余部分。mulh(multiply high)保留高 32 位。
对相同的输入运行这两条指令,就能得到完整的乘积。mulh 把高半部分写入一个寄存器,mul 把低半部分写入另一个寄存器,这一对寄存器就保存了完整的 64 位结果。
高半部分表示溢出,也就是乘积太大,超出了 32 位。高半部分出现有意义的值,意味着乘积无法放入一个寄存器。超大数的运算和密码学都依赖这两个半部分。
RISC-V 手册在 mulh 之外还定义了另外两个变体。mulhu 将两个无符号数相乘,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)
