在没有-ffast-math

时间:2017-11-06 14:14:19

标签: c++ gcc optimization x86 clang

我在stackoverflow上偶然发现了这个问题:如果没有使用-ffast-math进行编译,sqrt - 函数没有内联,因此在链接时需要libm。< / p>

但是,我不明白是什么阻止了编译器(clang以及gcc)在没有sqrt的情况下内联-ffast-math - 函数。

编译

#include <cmath>
double my_sqrt(double val){
  return sqrt(val);
}

使用clang和-02 yields(与gcc类似,即使gcc的结果对我来说并不合适):<​​/ p>

my_sqrt(double):                            # @my_sqrt(double)
        sqrtsd  %xmm0, %xmm1
        ucomisd %xmm1, %xmm1
        jp      .LBB0_2
        movapd  %xmm1, %xmm0
        retq
.LBB0_2:
        jmp     sqrt                    # TAILCALL

据我了解,调用了内置sqrt - 函数/ CPU指令(sqrtsd),如果结果为NaN(为{{设置了PF-flag) 3}})使用了库版本。

也许我错了,但如果参数是否定的话,NaN就是结果,那么库 - sqrt - 函数可以更好地返回NaN?为什么要打电话呢?

0 个答案:

没有答案