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

How can I check if BMI2 instructions are available in my ifunc resolver?

我想使用 _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(我在 VirtualBox Linux guest 运行 在 i7-3520@2.9GHZ 上的 Windows 7 上,它引发了 SIGILL Illegal Instruction).

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

__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 位。

/A