“fsub infinity,infinity”在gcc优化代码中的st0中给出0

时间:2013-04-29 14:32:42

标签: gcc assembly floating-point

我有一个在-O0模式下工作正常的代码,但是在-O2时会产生错误的结果。基本上它就像

double x1 = std::numeric_limits<double>::infinity();
double x2 = std::numeric_limits<double>::infinity();
double x = x1 - x2;

但是汇编命令fsub:

会出现问题
fsub %st(1),%st

我试图在一个小的测试应用程序中重现这个,用完全相同的编译标志编译,当涉及到上面的fsub指令时,st(0)和st(1)寄存器包含相同的“inf”值,和$ fctrl寄存器是一样的 - 但不知何故在真实应用中使用-O2,fsub指令在st(0)寄存器中产生0(零),而不是-nan。

此外,如果我使用-ffloat-store编译或执行xf / x2 / x地址的printf,那么它可以正常工作。从我在-O0版本中看到的,它在fsub中有一个操作数在寄存器中,第二个在内存中。但是在小型测试应用程序中,fsub完全相同,在两个相同的寄存器上工作,但仍能产生正确的结果。

这种奇怪行为的原因是什么?

0 个答案:

没有答案