如果指令fcvt.wu.d
接收到负的双精度浮点值作为其输入会发生什么?操作的输出是什么和/或它会引发哪个异常(它是否无效)?
问问题
180 次
1 回答
2
首先要注意:在 RISC-V 中没有浮点指令会引发异常。 浮点异常“累积”到浮点控制和状态寄存器 (fcsr)。检查 fcsr 并跳转到适当的异常处理例程是软件的工作。
从手册中,解释为:
该指令
fcvt.wu.d
采用 64b 浮点双精度(位于寄存器 的浮点寄存器文件中rs1
)并将其转换为无符号 32b 整数字(放置在整数寄存器文件中rd
)。
rm
数字将按照指令字段的规定进行四舍五入。
我编写了一些代码并通过 ISA 模拟器“spike”运行它来检查自己的行为。我正在将“-64”加载到 dp 寄存器中,然后尝试将其加载回整数寄存器文件中。
register long test, fcsr;
asm volatile(" li %0, 64\n\tsub %0, x0, %0\n\tfcvt.d.w f1, %0\n\tfcvt.wu.d %0,f1" : "=r"(test));
asm volatile(" frcsr %0" : "=r"(fcsr));
printf("result: %d %lu %lx %x\n", test, test, fcsr);
这将返回:
结果:-1 18446744073709551615 ffffffffffffffff 10。
NV 异常位已设置!如果我们将最后一条指令更改为 a fcvt.w.d
,我们会得到预期的结果:
温度:-64 18446744073709551552 ffffffffffffffc0 0
摘要: NV 异常位将在 fscr 中设置,但必须由软件手动检查才能正确处理。
于 2014-10-22T21:22:02.050 回答