我想使用_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
的自动防故障方式?
答案 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