我想使用_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
?