Разница между 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 и это коренная причина.

Другие вопросы по тегам