使用gcc生成BZHI指令

时间:2018-01-29 22:41:39

标签: c gcc bit-manipulation

我试图让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,但不确定是否已完成。 如果是,可能代码片段中只有一些微妙的问题,例如类型或属性,可以修复这些问题以使用gcc成功完成此转换。

编辑:根据@chux的建议添加u为常量。它略微改变了gcc的结果,尽管它仍然是没有bzhi的4指令函数。

1 个答案:

答案 0 :(得分:2)

自2018年1月起,gcc中未实现此优化(有feature request)。您可以使用内在函数来获取指令:

#include <x86intrin.h>

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