【发布时间】: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 << nbBits)-1。请注意 following SO answer 使用了 unsigned 1 而不是int1。 -
如果你不能让编译器做你想做的事情,并且如果
#ifdef不合适,那么在某些时候,你将不得不在可移植性和性能之间做出选择——因为它们是经常有相互冲突的目标。 -
我目前是
#ifdef'ing,正在努力寻找更好的解决方案。 -
Gcc ifuncs 可能会很好地解决这个问题 - 它们在可移植性方面可以吗?
-
不,不幸的是,ifuncs 太以
gcc为中心。即使#ifdef看起来更可取。
标签: c gcc bit-manipulation