在 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'fff6
和 rs2(unsigned) = 0x10
riscv mulhsu 指令 return 0x0000'0000'0000'000f
或 0xffff'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 是两个零扩展寄存器的乘法。
TLDR:给定 64 位寄存器 rs1(signed) = 0xffff'ffff'ffff'fff6
和 rs2(unsigned) = 0x10
riscv mulhsu 指令 return 0x0000'0000'0000'000f
或 0xffff'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 是两个零扩展寄存器的乘法。