x87 FPU指令是否确定?

时间:2013-09-18 12:18:24

标签: floating-point cpu x87

我们正在编写一个模拟器,并想知道对于给定的FPU状态,是运行FPU指令后FPU确定性的状态,例如。 FDIV?

有许多与英特尔兼容的CPU架构,它们实现了x87指令集。在测试FPU仿真的正确性时,我们应该依赖于生成的CPU状态吗?

不同的实现是否以不同方式进行计算?

3 个答案:

答案 0 :(得分:5)

是的,x87 FPU对于基本操作+-*/sqrt具有确定性。例如,在其默认状态(全宽有效数和舍入到最近偶数模式)中,x + y的结果恰好是与数学和的结果最接近的可表示的80位浮点值。 xy

兼容芯片的制造商已经为上述操作实现了完全相同的定义。

纯粹的CISC传统中的x87指令集还包含用于计算数学函数的高级指令,例如,正弦的近似值(FSIN)。这些说明的结果因品牌和型号的处理器而异。在您的模拟器中,您可能只需要提供与one of the worst implementations of these instructions一样好的东西。如果您使用宿主语言数学库中sinl()函数的结果,通常优于FSIN(由于使用显式argument reduction实现,则不应该抱怨和polynomial approximation,而非拨打FSIN)。

答案 1 :(得分:2)

如果您坚持使用基本的FPU指令,并且如果您希望它们产生一致的结果,则应该使用相同的编译器来生成FPU算法。这还不包括正确初始化FPU库所需的事实。

如果您有兴趣,请阅读以下有关该主题的一些好读物:https://randomascii.wordpress.com/2013/07/16/floating-point-determinism

本文中其他文章的链接特别有用。

答案 2 :(得分:1)

正如其他人所说,基本的五个操作将在所有x87 FPU上提供相同的结果。然而...

x87 FPU很奇特。它的80位寄存器意味着它可能获得与任何其他FPU不同的结果(例如在具有64位浮点寄存器的PowerPC或ARM上)。这些结果可能更好或更糟。即使将x87舍入模式设置为32位或64位也不会使其与PowerPC / ARM相同,因为指数仍然是无限制的。

对于编写仿真器,这应该无关紧要,除了它意味着您不一定使用主机FPU来模拟x87 FPU。我在这两篇文章中讨论了很多这些问题:

http://randomascii.wordpress.com/2013/07/16/floating-point-determinism http://randomascii.wordpress.com/2012/03/21/intermediate-floating-point-precision/