如何检查我的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

+0

上面'__builtin_cpu_is( “corei7”)'实际上返回'FALSE'上VirtualBox的Linux客户。 – ecerulm

+0

[你可以回答你自己的问题](http://*.com/questions/32214843/compiler-macro-to-detect-bmi2-instruction-set),而不是留下这个问题没有答案。 –

__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