gpt4 book ai didi

gcc - 如何在不让 gcc 到处插入其他 BMI2 指令的情况下使用 __bzhi_uxx 内在函数?

转载 作者:行者123 更新时间:2023-12-03 18:09:54 25 4
gpt4 key购买 nike

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

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

问题在于_bzhi_u32内在不会在 x86intrin.h 中定义除非 -mbmi2指定(gcc 将 SHLX 洒在所有地方的不良影响)。

最佳答案

有两种可能的替代方法可以避免指定 -mbmi2全局

  • 如果使用 GCC 4.9 或更高版本,您可以只包含 x86intrin.h并声明函数 use _bzhi_u32__attribute__((target ("bmi2"))) .这样 gcc 将在该函数上生成 BMI2 指令。 这不适用于 4.8 及更低版本 (除非 _bzhi_u32 被设置,否则 __BMI2__ 不被定义,即使它是链接器也会提示 undefined reference to '_bzhi_u32' )。
  • 把函数的定义放在自己的.c里文件并放置 #pragma GCC target "bmi2"在顶部。这定义了 __BMI2__并仅为此翻译单元启用 BMI2 指令生成。
  • 将函数放在自己的文件中,如选项 2 并使用 -mbmi2 编译只是那个文件(相当于 #pragma GCC target 选项。
  • 使用内联汇编代替内部函数,如其他 answer 中所述.

  • 选项 2 和 3 限制您的 inlinestatic选项。如果您使用 GCC 4.9 或更高版本,则选项 1 是可行的方法。

    关于gcc - 如何在不让 gcc 到处插入其他 BMI2 指令的情况下使用 __bzhi_uxx 内在函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32235583/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com