在RISCV中,我们有mul t1, s1, s2
和mulh t2, s1, s2
指令,它们分别存储乘积的低32位和乘积的高32位。如果我需要使用该产品,我应该add t0, t2, t1
吗?
谢谢!
答案 0 :(得分:1)
你不能。
仅作为使用 4 位而不是 32 位的示例。 与有符号整数的最高可能乘法是 0111 (7) * 0111 (7),结果为 110001 (49)。因此,无论您如何扭曲它,都无法仅以 4 位显示结果。通常它说乘法后你需要双倍的位。这也是为什么 Risc-V 中也有两个乘法运算的原因。
总结一下。您必须使用两个 32 位寄存器。除非您确定结果不会溢出 32 位。那么你就可以直接使用mul操作而不使用mulh了。
答案 1 :(得分:-1)
如果同一产品的高位和低位 是必需的,那么推荐的代码序列是:MULH[[S]U] rdh, rs1, rs2;多 rdl, rs1, rs2(源寄存器说明必须按相同顺序排列,并且 rdh 不能与 rs1 或 rs2 相同)。 然后微架构可以将这些融合为一个乘法运算,而不是执行两个 分开的乘法。 MULW 仅对 RV64 有效,并乘以源寄存器的低 32 位,放置 结果的低 32 位符号扩展到目标寄存器。 MUL 可用于 获得 64 位乘积的高 32 位,但有符号参数必须是正确的 32 位有符号 值,而无符号参数必须清除其高 32 位。
RiscV Istruction Set Manual 的第 35/36 页在此链接: https://riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf