如何获取GCC/CLANG生成BMI1指令集中BEXTR指令的编译选项
确保生成BMI1 BEXTR指令的编译选项
问题说明
你写了这个用于位提取的C++ constexpr模板函数:
template <auto uSTART, auto uLENGTH, typename Tunsigned> constexpr Tunsigned bit_extract(Tunsigned uInput) { return (uInput >> uSTART) & ~(~Tunsigned(0) << uLENGTH); } template unsigned bit_extract<2, 3>(unsigned);
用-std=c++17 -O2 -mbmi编译时,编译器不会生成BMI1指令集里的BEXTR,但换成-std=c++17 -O2 -march=native就可能生成,下面说下能确保生成BEXTR的编译选项。
可行的编译选项组合
- 核心要点:
-mbmi只是开启BMI1指令集的支持,但编译器还需要明确知道目标CPU支持该指令集,才会生成对应的机器码。单独用-mbmi时,编译器默认针对通用CPU优化,不会主动生成BEXTR这类非通用指令。 - 指定支持BMI1的具体CPU架构:
- 针对Intel Ivy Bridge及后续CPU:
-march=ivybridge - 针对AMD Bulldozer及后续CPU:
-march=bdver1 - 也可以用更具体的架构,比如Intel Haswell(
-march=haswell)、AMD Zen(-march=znver1),只要目标CPU支持BMI1就行。
- 针对Intel Ivy Bridge及后续CPU:
- 完整编译命令示例:
注:指定g++ -std=c++17 -O2 -march=ivybridge your_code.cpp-march=ivybridge这类参数时,已经包含了BMI1的支持,所以可以不用额外加-mbmi;不过显式加上也不会有问题。
额外说明
march=native是自动检测当前编译机器的CPU,开启所有该CPU支持的指令集,所以能生成BEXTR,但如果是给其他机器编译,不能用这个参数,必须指定目标机器对应的-march。- 部分编译器版本中,
-mbmi配合默认的-mtune=generic不会生成BEXTR,因为generic是为了兼容最广泛的旧CPU,不会引入可能导致旧机器无法运行的指令。
内容的提问来源于stack exchange,提问作者user3212436
相关产品推荐
相关产品推荐

