【问题标题】:How to represent the product of multiplication instructions in RISCV?RISCV中如何表示乘法指令的乘积?
【发布时间】:2019-07-11 06:16:47
【问题描述】:

在RISCV中,我们有mul t1, s1, s2mulh t2, s1, s2指令,分别存储乘积的低32位和乘积的高32位。如果我需要使用该产品,我应该add t0, t2, t1吗?

谢谢!

【问题讨论】:

  • 你不能。如果将两个 32 位的数字相乘,则结果需要 64 位进行编码,相乘的实际值为 t1+2^32*t2。您必须使用两个 32 位寄存器来存储结果。除非你确定结果可以存储为 32 位,在这种情况下,mulh 的使用是没有用的。
  • @AlainMerigot,您的评论将是一个很好的答案。

标签: assembly riscv instruction-set


【解决方案1】:

你不能。

作为使用 4 位而不是 32 位的示例。 与有符号整数的最大可能乘法是 0111 (7) * 0111 (7),得到 110001 (49)。所以无论你如何扭曲它,你都不能只用 4 位显示结果。通常它说你需要在乘法后加倍位。这也是为什么 Risc-V 中还有两个乘法运算的原因。

所以总结一下。您必须使用两个 32 位寄存器。除非您确定结果不会溢出 32 位。然后你可以只使用 mul 操作而不使用 mulh。

【讨论】:

  • 或者,如果您想将结果截断为 32 位,例如在 C 中,对 unsigned 的操作(包括 *)会产生 unsigned 结果。然后你也只做低 32 位,而不是扩大到 64 并做扩展精度加法。
【解决方案2】:

如果同一产品的高位和低位 为必填项,则推荐码序为:MULH[[S]U] rdh, rs1, rs2; MUL 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2021-05-27
    • 2023-03-24
    相关资源
    最近更新 更多