assembly - RISC-V SiFive HiFive Unleashed FMADD(32) 下溢标志未在次正常结果上设置

标签 assembly floating-point cpu-architecture ieee-754 riscv

所以我的问题要么是我对 fpu 机制的理解,要么是我使用的实现有问题。

问题:当使用源操作数值执行融合乘加指令时,rs1 = 0xBF800000, rs2 = 0x80542353, rs3 = 0x80800000 结果是 rd = 0x802BDCAD 这很好,但因为它是低于正常(微小)值我很确定应该设置 fpu 标志 U(下溢)。出于某种原因,事实并非如此。
RISC-V 文档指出,次正态值处理符合 ieee754-2008 在四舍五入后验证微小度的规定,其中指出如果结果小于(但不是 0)小于最小正态值(在这种情况下为 2^-126),将发出下溢信号,这个结果显然是。

我是否遗漏了一些东西并且标志是不必要的,或者可能存在实现问题?

最佳答案

IEEE-754 没有说,在舍入后使用微小检测,如果结果小于最小正常值但不为零,则始终会发出下溢信号。尽管 IEEE-754 2008 7.5 在第一句中以此开头,但其最后一段说:“此外,在下溢的默认异常处理下,如果舍入结果不准确……将引发下溢标志和不准确(见 7.6)异常将被提高。如果四舍五入的结果是准确的,则不会引发任何标志,也不会发出不准确的异常信号......”

因此,如果没有为下溢异常启用陷阱(下溢异常将以默认方式处理,提供通常的结果而不中断程序执行),那么,只要结果准确,就不会因为结果很小,并且不会引发下溢标志。

关于assembly - RISC-V SiFive HiFive Unleashed FMADD(32) 下溢标志未在次正常结果上设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58200992/

相关文章:

opengl - GLSL 中统一和常量之间不同的浮点行为

C float 初始化结果意外

c++ - printf 的浮点格式标志 (%f) 仅适用于英文数字格式

c++ - 需要帮助弄清楚为什么我会遇到这个段错误

assembly - 程序集如何访问 CPU 之外的东西,例如 HDD 或 RAM?

嵌入式系统中的 C 内存管理

ubuntu - assembly 模数

assembly - 如果使用同一个寄存器分别作为输入和输出,两条指令能否在同一个周期内执行?

c - 最快计算总和 x^5 + x^4 + x^3...+x^0 (按位可能?) x=16

assembly - MASM32中令人困惑的括号