这是一个简单的 C 代码:
#include <math.h>
float f( float x ) { return sqrtf( x ); }
GCC 7.3 和 8.2(amd64,ubuntu 18.04)生成非常奇怪的代码:
f:
pxor xmm2,xmm2
sqrtss xmm1,xmm0
ucomiss xmm2,xmm0
ja .L8 ; 0 < x? then, jump to .L8.
movaps xmm0,xmm1
ret
.L8:
sub rsp,24
movss [rsp+12],xmm1 ; save sqrtss result.
call sqrtf
movss xmm1,[rsp+12] ; restore sqrtss result.
add rsp,24
movaps xmm0,xmm1
ret
我在 ubuntu-18.04 存储库中的 GCC 7.3 和 8.2 以及 MinGW-w64 上也看到了这种行为。我在 GCC Bugzilla 上找不到这个错误(而且我无法报告它)。
有什么想法吗?
答案1
海湾合作委员会是否使用你编译的代码生成严格兼容的浮点数学计算(我怀疑-氧气或者-O3)。我猜你希望它编译成类似下面的内容(在气体格式汇编程序):
f:
.LFB9:
.cfi_startproc
sqrtss %xmm0, %xmm0
ret
.cfi_endproc
.LFE9:
您需要通过使用禁用严格的数学一致性规则-ffast-math
来生成更快的“优化”代码。请注意,此选项启用
-fno-math-errno
-funsafe-math-optimizations
-ffinite-math-only
-fno-rounding-math
-fno-signaling-nans
-fcx-limited-range
-fexcess-precision=fast
海湾合作委员会选项,所以要注意精度损失和数学错误损失。