我的代码在 -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 编译或执行 x1/x2/x 地址的 printf,那么它工作正常。从我在 -O0 版本中看到的情况来看,它 fsub 在寄存器中使用一个操作数,在内存中使用第二个操作数。但在小型测试应用程序中,fsub 完全相同,在两个相同的寄存器上工作,仍然产生正确的结果。
这种奇怪行为的原因是什么?