我正在尝试让 gcc
生成 BMI2 的 bzhi
指令,而不使用内置函数,以创建可移植的代码。
鉴于 bzhi
的结果,我希望这个目标相对容易实现。以下 SO 回答 提供了一个简化的代码示例:
unsigned bzhi32(unsigned value, int nbBits)
{
return value & ((1u << nbBits) - 1);
}
clang
可以轻松生成bzhi
指令,而我目前还没有发现gcc
有类似的结果:https://godbolt.org/g/jYrh8F
我想知道这是否可能。
这种能力至少已被请求,但不确定是否已完成。
如果是,也许代码片段中只存在一些微妙的问题,例如类型或属性,可以修复以使gcc
成功进行此转换。
编辑:根据@chux的建议,为常量添加了u
,尽管它仍然是一个不包含bzhi
的4条指令函数。
u
来添加(1u << nbBits)-1
。请注意,以下 Stack Overflow 回答 使用了无符号 1 而不是int
类型的 1。 - chux - Reinstate Monica#ifdef
也不适用,那么在某个时候,你必须在可移植性和性能之间做出选择 - 因为它们经常是相互冲突的目标。 - Mysticial#ifdef
,尝试寻找更好的解决方案。 - Cyan