GCC 7.3 和 8.2(ubuntu18.04)sqrt() 调用问题

GCC 7.3 和 8.2(ubuntu18.04)sqrt() 调用问题

这是一个简单的 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

海湾合作委员会选项,所以要注意精度损失和数学错误损失。

相关内容