如何检查我的ifunc解析器中是否有BMI2指令?
问题描述:
我想使用_bzhi_u32
内部函数,但如果运行可执行文件的处理器不支持BMI2
指令集,我想恢复为常规的C实现。如何检查我的ifunc解析器中是否有BMI2指令?
我使用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客户端,[email protected],并且它提高了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版本。
或者使用CPUID并提取BMI2位,如果你不想更新你的GCC。
/A
上面'__builtin_cpu_is( “corei7”)'实际上返回'FALSE'上VirtualBox的Linux客户。 – ecerulm
[你可以回答你自己的问题](http://stackoverflow.com/questions/32214843/compiler-macro-to-detect-bmi2-instruction-set),而不是留下这个问题没有答案。 –