在 risc-v 架构中,mulh[[s]u] 操作返回的位是什么样的?

In the risc-v architecture, what do the bits returned by the mulh[[s]u] operation look like?

TLDR:给定 64 位寄存器 rs1(signed) = 0xffff'ffff'ffff'fff6rs2(unsigned) = 0x10 riscv mulhsu 指令 return 0x0000'0000'0000'000f0xffff'ffff'ffff'ffff 或其他完全到 rd 的指令?

我正在努力实现 RiscV 架构的模拟版本,但在实现 RV64M mulh[[s]u] 指令时 运行 遇到了麻烦。我不确定 mulhsu return 是有符号数还是无符号数。如果它 return 有符号数,那么 mulhsu 和 mulh 有什么区别?

这里有一些伪代码演示了这个问题(s64 和 u64 分别表示有符号和无符号的 64 位寄存器)

rs1.s64 = 0xffff'ffff'ffff'fff6;   //-10
rs2.u64 = 0x10;                    // 16

execute(mulhsu(rs1, rs2));

// which of these is correct? Note: rd only returns the upper 64 bits of the product
EXPECT_EQ(0x0000'0000'0000'000f, rd);
EXPECT_EQ(0xffff'ffff'ffff'ffff, rd);
EXPECT_EQ(<some other value>, rd);

rd应该签名吗?未签名?

来自说明书:

MUL 执行 rs1 乘以 rs2 的 XLEN 位 × XLEN 位,并将较低的 XLEN 位放在 在目标寄存器中。 MULH、MULHU 和 MULHSU 执行相同的乘法,但 return 完整的 2 × XLEN 位乘积的高 XLEN 位,对于有符号 × 有符号,无符号 × 无符号, 和 signed rs1×unsigned rs2 multiplication。如果两者的高位和低位相同 产品是必需的,那么推荐的代码序列是:MULH[[S]U] rdh, rs1, rs2;多联 rdl、rs1、rs2(源寄存器说明符必须顺序相同,rdh 不能与 rs1 或 rs2).然后,微架构可以将这些融合成一个乘法运算,而不是执行 两个单独的乘法。

您问题的答案是:EXPECT_EQ(0xffff'ffff'ffff'ffff, rd);

mulhsu 将对 rs1.s64 的符号扩展和 rs2.u64 的零扩展进行乘法运算。 您可以在编译器机器描述中看到 riscv.md.

so mulhsu(64 位)将 return 等价于: ((s128) rs1.s64 * (u128) rs2.u64) >> 64。其中 s128 是一个带符号的 128 整数,u128 是一个无符号的 128 整数。

三个mul的区别是:
mulhsu 是符号扩展寄存器和零扩展寄存器之间的乘法。
mulh 是两个符号扩展寄存器的乘积。
mulhu 是两个零扩展寄存器的乘法。