繁体   English   中英

RISC-V mulh 汇编指令的行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM