如何检查我的 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 指令?的主要内容,如果未能解决你的问题,请参考以下文章

谁能帮我检查一下我的BMI计算器? (C#)

如何在python中忽略BeautifulSoup解析器中的换行符

如何在 ui-router 解析器中重定向?

C 或 C++ 链接器中是不是有任何类型检查?

如何使用 jquery 检查变量选择器中的属性?

如何在 vtl appsync 解析器中重用/导入代码?