用于检测 BMI2 指令集的编译器宏

Compiler macro to detect BMI2 instruction set

我在网上搜索以找到合适的解决方案,但没有成功。 所以我希望你们中的一个人对此有所了解:有什么方法可以检测“Intel Bit Manipulation Instruction Sets 2”(BMI2)编译时间吗?我想根据它的可用性做一些有条件的事情。

运行 EAX=7, ECX=0 的 CPUID 内部函数,然后检查返回的 EBX 寄存器的位 3(BMI1 标志)。 EBX 位 8 是 BMI2 标志。请查阅编译器的文档,了解如何调用 CPUID 并从中获取数据。

使用 GCC,您可以检查 __BMI2__ 宏。如果目标支持 BMI2(例如 -mbmi2-march=haswell),将定义此宏。这是 instrinsic 的 headers (x86intrin.h, bmi2intrin.h) 用于在编译时检查 BMI2 的宏。

对于运行时检查,__builtin_cpu_init()__builtin_cpu_supports("bmi2") 可以在现代 GCC 中使用(在 GCC 5.1、4.9 和更低版本中测试没有)。