Gcc 如何检查ifunc解析器中是否有BMI2指令?

Gcc 如何检查ifunc解析器中是否有BMI2指令?,gcc,intrinsics,bmi,Gcc,Intrinsics,Bmi,我想使用\u bzhi\u u32内在函数,但如果运行可执行文件的处理器不支持BMI2指令集,我想恢复到常规的C实现 我使用的是GCC4.8.3,我有以下内容 static inline uint32_t myfunc_bmi(uint32_t in) { return _bzhi_u32(in, 3); /* as an example */ } static void * resolve_myfunc(void) { __builtin_cpu_init();. if (

我想使用
\u bzhi\u u32
内在函数,但如果运行可执行文件的处理器不支持
BMI2
指令集,我想恢复到常规的C实现

我使用的是GCC4.8.3,我有以下内容

static inline uint32_t myfunc_bmi(uint32_t in) {
     return _bzhi_u32(in, 3); /* as an example */ 
}
static void * resolve_myfunc(void) {
  __builtin_cpu_init();.
  if (__builtin_cpu_is("corei7") return myfunc_bmi2;
  return myfunc_default;
}
static inline uint32_t myfunc(uint32_t in) __attribute__ ((ifunc "resolve_myfunc")));
我最初想使用
\uuuuuu内置cpu\u支持()
来明确检查
BMI2
,但似乎无法使用
\uuuuuu内置cpu\u支持()
来检查。我目前对
corei7
的检查似乎也不完美,因为据我所知,Haswell的一些移动版本没有
BMI2
(我在i7上运行Windows 7的VirtualBox Linux guest上进行了尝试)-3520@2.9GHZ并且它会引发一个
SIGILL非法指令


那么,是否有一种故障安全的方法来检查
BMI2

内置cpu支持对我有效(GCC 5.1)。。GCC 4.9及更低版本不支持BMI2检测

试试这个->

__builtin_cpu_init ();
if (__builtin_cpu_supports("bmi2")) {
    printf("BMI2 supported \n");
}
要解决您的问题,您应该更新您的GCC版本

或者,如果不想更新GCC,请使用CPUID并提取BMI2位


/上面的
\uu内置cpu\u是(“corei7”)
在VirtualBox Linux客户机上实际返回
false
。而不是不回答这个问题。