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

时间:2015-07-10 09:17:43

标签: gcc intrinsics bmi

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

是否有一种检验BMI2的自动防故障方式?

1 个答案:

答案 0 :(得分: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位。

/ A