Разница между glibC и bioniC
Привет у меня есть некоторые проблемы с оптимизацией.
Я попытался скомпилировать один из тестов 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
Я попытался скомпилировать его следующими 2 способами:
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 ответ
Это происходит из-за того, что в gcc 4.7 у нас есть специальная проверка (проверьте для TARGET_C99_FUNCTIONS
) в builins.def
файл, в котором определяется вся встроенная функция.
И в другом файле мы имеем:define TARGET_C99_FUNCTIONS (OPTION_GLIBC)
Эти проверки проверяет библиотеку, а если нет glibc
тогда у нас нет cbrt
функция. Таким образом, мы не можем преобразовать pow
в cbrt
и это коренная причина.