2015-07-10 419 views
2

我想使用_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://stackoverflow.com/questions/32214843/compiler-macro-to-detect-bmi2-instruction-set),而不是留下這個問題沒有答案。 –

回答

0

__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