【问题标题】:generate BZHI instruction with gcc使用 gcc 生成 BZHI 指令
【发布时间】:2018-07-08 17:41:06
【问题描述】:

我正在尝试让 gcc 生成 bzhi instruction,这是 BMI2 的一部分, 没有使用内在函数, 为了创建一个可移植的代码。

鉴于bzhi 的结果,我预计该目标相对容易实现。 following SO answer 提供了一个代码示例,简化如下:

unsigned bzhi32(unsigned value, int nbBits)
{
    return value & ((1u << nbBits) - 1);
}

clang 用它生成bzhi 指令没有问题,而到目前为止我还没有发现gcc 的任何类似结果: https://godbolt.org/g/jYrh8F

我想知道这是否可能。 此功能为at least requested,但不确定是否已完成。 如果是这样,那么可能只是代码 sn-p 中存在一些微妙的问题,例如类型或属性,可以通过 gcc 修复这些问题以成功进行此转换。

edit :添加u 作为常量,正如@chux 所建议的那样。它略微改变了gcc 的结果,尽管它仍然是一个没有bzhi 的4 指令函数。

【问题讨论】:

  • 注意:移动无符号值通常问题较少:添加u(1u &lt;&lt; nbBits)-1。请注意 following SO answer 使用了 unsigned 1 而不是 int 1。
  • 如果你不能让编译器做你想做的事情,并且如果 #ifdef 不合适,那么在某些时候,你将不得不在可移植性和性能之间做出选择——因为它们是经常有相互冲突的目标。
  • 我目前是#ifdef'ing,正在努力寻找更好的解决方案。
  • Gcc ifuncs 可能会很好地解决这个问题 - 它们在可移植性方面可以吗?
  • 不,不幸的是,ifuncs 太以gcc 为中心。即使#ifdef 看起来更可取。

标签: c gcc bit-manipulation


【解决方案1】:

截至 2018 年 1 月,此优化未在 gcc 中实施(有一个 feature request)。您可以使用内在函数获取指令:

#include <x86intrin.h>

unsigned bzhi32(unsigned value, int nbBits) {
   return _bzhi_u32(value, nbBits);
}

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 2020-04-13
    • 2015-06-10
    • 1970-01-01
    • 2014-03-17
    • 2017-05-15
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    相关资源
    最近更新 更多