首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不让gcc在任何地方插入其他__bzhi_uxx指令的情况下使用BMI2内嵌?

如何在不让gcc在任何地方插入其他__bzhi_uxx指令的情况下使用BMI2内嵌?
EN

Stack Overflow用户
提问于 2015-08-26 19:56:30
回答 3查看 732关注 0票数 4

我想使用_bzhi_u32内部,但我不想使用-mbmi2标志,因为这使得gcc使用其他BMI2指令(特别是在许多<<移位中的SHLX ),如果运行可执行文件的主机不支持BMI2,则会产生SIGILL (非法指令)。

我只在一个函数中使用_bzhi_u32,并通过在运行时检查运行时保护它的使用,如果不支持的话,_builtin_cpu_is("corei7")默认支持另一个实现。但是我不能保护gcc在使用BMI2时插入的另一个-mbmi2指令。

问题是,除非指定了_bzhi_u32,否则x86intrin.h内部不会定义-mbmi2 ( gcc将SHLX洒到各处的效果并不理想)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-26 19:56:30

有两种可能的选择可以避免全局指定-mbmi2

  1. 如果使用GCC 4.9或更高版本,则只需包含x86intrin.h并声明函数使用_bzhi_u32__attribute__((target ("bmi2")))。这样,gcc将生成关于该函数的BMI2指令。不适用于4.8和更低的 (_bzhi_u32是不定义的,除非设置了__BMI2__,即使是,链接器也会向undefined reference to '_bzhi_u32'抱怨)。
  2. 将函数的定义放在自己的.c文件中,并将#pragma GCC target "bmi2"放在顶部。这定义了__BMI2__,并且只为这个翻译单元启用了BMI2指令生成。
  3. 将函数放入自己的文件中,如选项2,并使用-mbmi2编译该文件(相当于#pragma GCC target选项)。
  4. 使用内联程序集而不是本质,正如在另一个回答中所解释的那样。

选项2和3限制了您的inlinestatic选项。如果您使用GCC 4.9或更高,则选择1种方法。

票数 3
EN

Stack Overflow用户

发布于 2015-08-27 16:29:06

来自gcc 4.9发行说明的报价

现在可以从带有相应目标属性标记的文件中的select函数调用x86本质,而不必使用-mxxx选项编译整个文件。这提高了x86本质的可用性,在进行功能多版本控制时尤其有用。

票数 2
EN

Stack Overflow用户

发布于 2015-08-27 21:16:59

与其使用内部代码,不如更容易嵌入汇编程序代码.

代码语言:javascript
运行
复制
uint32_t val, i;

asm ("bzhi %0,%1,%2" : "=r"(val) : "r"(val), "r"(i) : );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32235583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档