我正在测试LLVM vs gcc生成的代码的质量

我有一个像这样的小程序

#include<math.h>
double mysqrt(double a){
    return sqrt(a);
}

int main()
{
    mysqrt(0.1);
    return 1;
}

lang发出
mysqrt:                                 # @mysqrt
# BB#0:                                 # %entry
jmp sqrt                    # TAILCALL

这意味着它正在调用sqrt函数

海湾合作委员会正在发射
mysqrt:
.LFB25:
.cfi_startproc
subl    $28, %esp
.cfi_def_cfa_offset 32
fldl    32(%esp)
fld %st(0)
fsqrt
fucomi  %st(0), %st

这意味着它正在使用直接机器指令fsqrt(我想它比调用函数要快得多)。这是针对具有O3优化级别的X86机器完成的。有人知道为什么LLVM调用函数而不使用机器指令吗?

最佳答案

gcc的行为不是标准的C,因为该内联调用缺少错误检查。要使gcc具有符合标准的行为,请使用-std=c99选项或类似选项进行编译。迫使clang忘记其标准合规性,例如-ffast-math可能会有所帮助。

关于c - LLVM不使用机器指令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20518480/

10-11 21:55