[英]Behaviour of RISC-V mulh assembly instruction
RISC-V 阅读器声明 mulh rd, rs1, rs2 “将 x[rs1] 乘以 x[rs2],将值视为补码,并将乘积的上半部分写入 x[rd]”
所以我试图将两个带符号的 64 位数字相乘并得到带符号的 128 位结果:
mulh t0, a0, a1
mul t1, a0, a1
我希望 t0 保留高 64 位,t1 保留低 64 位,但是如果 a0= 0x7ffffffffffffffff(即 MAX-INT)和 a1 = 2,我得到:
t0 = 0, t1=0xfffffffffffffffe 就好像我执行了一个无符号乘法。 而不是 t0 = 1, t1= 0x7fffffffffffffff 在我看来这是二进制补码算法的正确答案。
现在 - 在写出来时,我明白为什么我得到 t1=0xffffffffffffff,但我仍然不明白为什么我得到 t0=1,这将允许我实现一些逻辑来更正 t1 中的符号位。
我在这里做错了什么? 我曾经为此使用相当复杂的逐位长乘法算法,但这看起来简单得多,但它(显然)似乎不起作用。
2 x 0x7FFFFFFFFFFFFFFFF 的 128 位答案是
0x0000000000000000FFFFFFFFFFFFFFE
|------ t0 ----||----- t1 ----|
|
|
+-- the sign bit is the uppermost bit of this hex digit
因为您要将两个正数相乘,所以无论您选择有符号乘法还是无符号乘法,答案都是相同的位模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.