Question

J'ai un certain code qui utilise intrinsics gcc. Je voudrais inclure le code dans le cas où la valeur intrinsèque est manquante. Comment puis-je faire?

#ifdef __builtin_ctzll

ne fonctionne pas.

Était-ce utile?

La solution

Avec les versions récentes de clang il est maintenant possible de vérifier si builtin intrinsics en utilisant la __has_builtin() existent macro par exemple.

int popcount(int x)
{
#if __has_builtin(__builtin_popcount)
  return __builtin_popcount(x);
#else
  int count = 0;
  for (; x != 0; x &= x - 1)
    count++;
  return count;
#endif
}

Le GCC espoir Let soutiendra également __has_builtin() à l'avenir.

Autres conseils

La seule chose qui devrait fonctionner hors de la boîte est de tester la version gcc et en espérant que cela se fait régulièrement sur toutes les architectures.

Ce n'est pas garanti, cependant, j'ai eu récemment un problème similaire pas avec des fonctions mais avec builtin __thread pour le fil de stockage local. Ceci est mis en œuvre sur certaines architectures (Linux), mais non pas sur d'autres (OS X, bsd?) Et il n'y avait aucun moyen de trouver cela avec une macro.

Si vous avez gnu vous pouvez faire faire quelque chose semblable à détecter l'existence d'une fonction particulière dans votre Makefile:

__THREAD := $(shell echo '__thread int i;' | ${CC} ${CFLAGS} -xc -c -o /dev/null - 2> /dev/null || echo "NO")
ifeq (${__THREAD},NO)
${warning thread local storage (TLS) with '__thread' is not supported, switching to pthread_getkey}
CFLAGS += -D__GNUC_NO_TLS__
endif

On évite ainsi d'utiliser les utilitaires de configuration plus complexes.

Les contrôles de la directive de #ifdef si __builtin_ctzll est défini comme macro nom, il ne sera pas vous aider à déterminer si un __builtin_ctzll Fonction existe.

Je ne suis pas assez familier avec builtins gcc pour vous aider plus que cela: comment le intrinsèque être manquant

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top