理解GCC中的std::pow实现

Understanding std::pow Implementation in GCC

本文关键字:pow 实现 std GCC 中的 理解      更新时间:2023-10-16

我正在努力理解std::pow函数在GCC中是如何工作的。我在这里查看cmath库的源代码https://code.woboq.org/gcc/libstdc++-v3/include/c_global/cmath.html#_ZSt3powff.

在该文件的第388行,当float类型作为参数传递时,它们给出了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。此外,它是如何翻译成汇编的?

__builtin_powf在哪里定义?

它是在C标准库实现中定义的。在gcc中没有实现powf

__builtin_powf的存在使得gcc可以检测pow的使用,并在编译时计算结果(如果可以的话(。字符串"__builtin_powf"是";定义的";在gcc/builtins.def#L541中(但实际上只作为函数参数存在(,内建函数似乎在gcc/builtins.c#L2100中处理,但最终pow由c标准库处理。当foldconstcall.c#L1393中的fold_const_call_sss()返回成功时,意味着pow一直处于折叠状态。该调用可以在tree-vect-patterns.c中进行向量化/替换。但最终;实现";在您的C标准库中。