首页 > 解决方案 > 为什么 riscv32 中的 mulh 指令给出 0?

问题描述

Multiplier = 0xffffffff
Multiplicand = 0xffffffff
Result = 0xFFFFFFFE 00000001 (multiplier * multiplicand)

mulh指令应根据 RISC-Vs pec 给出结果的高 XLEN 位。但是当我mulh t0, a0, a1;使用 multiplier ina0和 multiplicand in运行时a1,结果t0为 0。有人可以解释为什么吗?我在 RV32IMAC(FE310 内核)中运行它。

汇编和 C 代码如下:

mulh_asm:
    mulh t0, a0, a1;
    addi a0, x0, 0; // **Break point here to watch t0 value**
ret;

mrest[0] = mulh_asm(0xffffffff,  0xffffffff);

标签: assemblyriscvriscv32

解决方案


t0 中的结果为 0。有人可以解释为什么吗?

mulh是签名×签名,所以你在做-1×-1!结果是 +1,在 64 位中,即 63 位的 0 后跟 1 位 — 所以自然而然,高 32 位(64 位 +1)的正确答案是全零。

[所需] 结果 = 0xFFFFFFFE 00000001(乘数 * 被乘数)

Try mulhu,它代表无符号 × 无符号,这将为您提供您期望的结果。


推荐阅读