嗨我在优化方面遇到了一些问题 我尝试用内置函数编译一个gcc测试:
#include <stdio.h>
#ifdef HAVE_C99_RUNTIME
double test1 (double x)
{
return __builtin_pow (x, 1/3);
}
double test2 (double x)
{
return __builtin_pow (x, 4./3.);
}
double test3a (double x)
{
return __builtin_pow (x, 5./3.);
}
double test3b (double x)
{
return __builtin_pow (x, -5./3.);
}
double test4 (double x)
{
return __builtin_pow (x, 7./3.);
}
#endif
我尝试用接下来的两种方式编译它:
1路:
gcc -mglibc -O -ffast-math -std=c99 -fno-ident -S -o builtins-58.s
在输出汇编程序文件中,所有call pow
都更改为call cbrt
- 预期
2路:
gcc -mbionic -O -ffast-math -std=c99 -fno-ident -S -o builtins-58.s
使用-mbionic
代替-mglibc
后,我获得了call pow
是否有人知道optmimization
builtin
函数Bionic
的工作原理{{1}}
答案 0 :(得分:2)
这是因为在gcc 4.7中我们有特殊检查(检查TARGET_C99_FUNCTIONS
)
在builins.def
文件中,其中定义了所有内置函数。
在另一个文件中,我们有:
define TARGET_C99_FUNCTIONS (OPTION_GLIBC)
这些检查检查库,如果没有glibc
,那么我们没有cbrt
功能。
所以我们无法将pow
转换为cbrt
,这是根本原因。