我想使用_bzhi_u32
内部,但我不想使用-mbmi2
标志,因为这使得gcc
使用其他BMI2指令(特别是在许多<<
移位中的SHLX
),如果运行可执行文件的主机不支持BMI2,则会产生SIGILL
(非法指令)。
我只在一个函数中使用_bzhi_u32
,并通过在运行时检查运行时保护它的使用,如果不支持的话,_builtin_cpu_is("corei7")
默认支持另一个实现。但是我不能保护gcc在使用BMI2时插入的另一个-mbmi2
指令。
问题是,除非指定了_bzhi_u32
,否则x86intrin.h
内部不会定义-mbmi2
( gcc将SHLX
洒到各处的效果并不理想)。
发布于 2015-08-26 19:56:30
有两种可能的选择可以避免全局指定-mbmi2
x86intrin.h
并声明函数使用_bzhi_u32
和__attribute__((target ("bmi2")))
。这样,gcc将生成关于该函数的BMI2指令。不适用于4.8和更低的 (_bzhi_u32
是不定义的,除非设置了__BMI2__
,即使是,链接器也会向undefined reference to '_bzhi_u32'
抱怨)。.c
文件中,并将#pragma GCC target "bmi2"
放在顶部。这定义了__BMI2__
,并且只为这个翻译单元启用了BMI2指令生成。-mbmi2
编译该文件(相当于#pragma GCC target
选项)。选项2和3限制了您的inline
和static
选项。如果您使用GCC 4.9或更高,则选择1种方法。
发布于 2015-08-27 16:29:06
来自gcc 4.9发行说明的报价
现在可以从带有相应目标属性标记的文件中的select函数调用x86本质,而不必使用-mxxx选项编译整个文件。这提高了x86本质的可用性,在进行功能多版本控制时尤其有用。
发布于 2015-08-27 21:16:59
与其使用内部代码,不如更容易嵌入汇编程序代码.
uint32_t val, i;
asm ("bzhi %0,%1,%2" : "=r"(val) : "r"(val), "r"(i) : );
https://stackoverflow.com/questions/32235583
复制相似问题