用于检测 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 和更低版本中测试没有)。
我在网上搜索以找到合适的解决方案,但没有成功。 所以我希望你们中的一个人对此有所了解:有什么方法可以检测“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 和更低版本中测试没有)。