Haswell 架构提供了几个新的指令。其中之一是 PEXT
( parallel bits extract ),这张图片解释了它的功能(来源 here ):
它接受一个值 r2
和一个掩码 r3
并将提取的 r2
位放入 r1
中。
我的问题如下:纯标准 C++11 中优化模板函数的等效代码是什么,将来编译器可能会针对该指令进行优化.
最佳答案
这里是 some code来自 Matthew Fioravante 的 stdcxx-bitops GitHub repo那是floated to the std-proposals
邮件列表作为为 C++ 添加 constexpr
位运算库的初步建议。
#ifndef HAS_CXX14_CONSTEXPR
#define HAS_CXX14_CONSTEXPR 0
#endif
#if HAS_CXX14_CONSTEXPR
#define constexpr14 constexpr
#else
#define constexpr14
#endif
//Parallel Bits Extract
//x HGFEDCBA
//mask 01100100
//res 00000GFC
//x86_64 BMI2: PEXT
template <typename Integral>
constexpr14 Integral extract_bits(Integral x, Integral mask) {
Integral res = 0;
for(Integral bb = 1; mask != 0; bb += bb) {
if(x & mask & -mask) {
res |= bb;
}
mask &= (mask - 1);
}
return res;
}
关于c++ - 等同于 PEXT Haswell 指令的标准 C++11 代码(并且可能会被编译器优化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21144237/