RV32IMAC架构下mulh指令计算两0xffffffff相乘结果为0的原因
问题原因解释
首先明确RISC-V三类乘法高位指令的定义差异:
mulh rs1, rs2:将两个32位有符号整数做乘法运算,返回64位结果的高32位mulhu rs1, rs2:将两个32位无符号整数做乘法运算,返回64位结果的高32位mulhsu rs1, rs2:将第一个操作数作为有符号整数、第二个作为无符号整数做乘法运算,返回64位结果的高32位
场景运算逻辑说明
你传入的0xffffffff在32位有符号整数编码规则下对应的数值是-1,因此mulh指令实际执行的运算逻辑为:
(-1) * (-1) = 1
数值1的64位有符号表示为0x00000000 00000001,因此高32位的返回结果就是0,该结果完全符合RISC-V规范要求,不属于硬件异常。
预期偏差的原因
你之前计算的0xffffffff * 0xffffffff = 0xFFFFFFFE 00000001是无符号整数乘法的结果,如果要得到该结果的高32位,应该使用mulhu指令而非mulh指令,替换指令后即可观测到t0返回0xFFFFFFFE的预期结果。
验证用修正代码示例
mulh_asm: mulhu t0, a0, a1; addi a0, x0, 0; // 断点处可观测到t0为0xfffffffe ret; mrest[0] = mulh_asm(0xffffffff, 0xffffffff);
内容的提问来源于stack exchange,提问作者RRON
相关产品推荐
相关产品推荐

