如何检查我的 ifunc 解析器中是不是有 BMI2 指令?
Posted
技术标签:
【中文标题】如何检查我的 ifunc 解析器中是不是有 BMI2 指令?【英文标题】:How can I check if BMI2 instructions are available in my ifunc resolver?如何检查我的 ifunc 解析器中是否有 BMI2 指令? 【发布时间】:2015-07-10 09:17:42 【问题描述】:我想使用 _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 客户机和它引发了SIGILL Illegal Instruction
)。
那么有没有一种安全的方法来检查BMI2
?
【问题讨论】:
上面的__builtin_cpu_is("corei7")
实际上在VirtualBox Linux Guest上返回false
。
You can answer your own question 而不是不回答这个问题。
【参考方案1】:
__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
【讨论】:
以上是关于如何检查我的 ifunc 解析器中是不是有 BMI2 指令?的主要内容,如果未能解决你的问题,请参考以下文章