了解GCC中的std::pow实现

yc0p9oo0  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(384)

我试图理解std::pow函数在GCC中是如何工作的。我在www.example.com查看了cmath库的源代码https://code.woboq.org/gcc/libstdc++-v3/include/c_global/cmath.html#_ZSt3powff。
在该文件第388行,它们给予了浮点类型作为参数传递时的pow定义,如下所示

#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
  inline _GLIBCXX_CONSTEXPR float
  pow(float __x, float __y)
  { return __builtin_powf(__x, __y); }

此pow函数调用另一个函数**__builtin_powf**。
我想知道的是,__builtin_powf是在哪里定义的?我读到它是一个内置函数,但这仍然不能帮助我理解它的实现在哪里。我似乎在GCC源代码的其他地方找不到**__builtin_powf**。还有,它是如何翻译成汇编的?

gfttwv5a

gfttwv5a1#

__builtin_powf在哪里定义?
它是在C标准库实现中定义的。gcc中没有powf的实现。
__builtin_powf的存在是为了让gcc能够检测pow的使用情况,并在编译时计算结果。(但实际上仅作为函数参数存在),并且内置函数似乎在gcc/builtins.c#L2100中处理,但最后pow由C标准库处理,当fold-const-call.c#L1393中的fold_const_call_sss()返回成功时,这意味着pow不断地被折叠。调用可以在tree-vect-patterns.c中被矢量化/替换。但是最后的“实现”在你的C标准库中。

相关问题