将为FCVT.WU.D浮点指令引发哪些异常

时间:2014-10-21 04:30:22

标签: compilation microcontroller ieee-754 microprocessors riscv

如果指令fcvt.wu.d收到负双精度浮点值作为输入,会发生什么?操作的输出是什么和/或它会引发哪个异常(它是否无效)?

1 个答案:

答案 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中设置,但必须由软件手动检查才能正确处理。