2

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

我正在使用 GCC 4.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")));

我最初想用来__builtin_cpu_support()明确检查,BMI2但似乎你不能用__builtin_cpu_support(). 我目前的检查corei7似乎也不完美,因为据我了解 i7 Haswell 的某些移动版本没有BMI2(我尝试在 i7-3520@2.9GHZ 上的 Windows 7 上运行的 VirtualBox Linux 客户机上,它引发了 a SIGILL Illegal Instruction)。

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

4

1 回答 1

2

__builtin_cpu_supports对我有用(GCC 5.1)。GCC 4.9 及更低版本不支持 BMI2 检测。

试试这个->

__builtin_cpu_init ();
if (__builtin_cpu_supports("bmi2")) {
    printf("BMI2 supported \n");
}

要解决您的问题,您应该更新您的 GCC 版本。

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

/一个

于 2017-05-07T19:57:42.900 回答