如何检查我的 ifunc 解析器中是否有 BMI2 指令?
How can I check if BMI2 instructions are available in my ifunc resolver?
我想使用 _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
(我在 VirtualBox Linux guest 运行 在 i7-3520@2.9GHZ 上的 Windows 7 上,它引发了 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 版本。
如果您不想更新 GCC,也可以使用 CPUID 并提取 BMI2 位。
/A
我想使用 _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
(我在 VirtualBox Linux guest 运行 在 i7-3520@2.9GHZ 上的 Windows 7 上,它引发了 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 版本。
如果您不想更新 GCC,也可以使用 CPUID 并提取 BMI2 位。
/A