如果指令fcvt.wu.d
收到负双精度浮点值作为输入,会发生什么?操作的输出是什么和/或它会引发哪个异常(它是否无效)?
答案 0 :(得分:2)
首先要注意的是:没有浮点指令在RISC-V中引发异常。浮点异常被“累积”到浮点控制&状态寄存器(fcsr)。检查fcsr并跳转到相应的异常处理例程是软件的工作。
从手册中解释:
指令
fcvt.wu.d
采用64b浮点双精度(位于寄存器rs1
的浮点寄存器文件中)并将其转换为无符号的32b整数字(放在{的整数寄存器文件中) {1}})。数字将按照指令的
rd
字段的指定进行舍入。
我写了一些代码并通过ISA模拟器“spike”运行它来检查自己的行为。我正在将“-64”加载到dp寄存器中,然后尝试将其加载回整数寄存器文件。
rm
返回:
结果:-1 18446744073709551615 fffffffffffffffff 10.
NV异常位已设置!如果我们将最后一条指令更改为 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);
,我们会得到预期的结果:
tmp:-64 18446744073709551552 fffffffffffffff0 0
摘要:NV异常位将在fscr中设置,但必须由软件手动检查才能正确处理。