Haswell架构提出了几条新指令。其中一个是PEXT
(parallel bits extract),其功能由此图片解释(来源here):
它需要一个值r2
和一个掩码r3
,并将提取的r2
位放入r1
。
我的问题如下:纯标准 C ++ 11中优化模板化函数的等效代码是什么,未来编译器很可能对此指令进行优化
答案 0 :(得分:2)
以下是来自Matthew Fioravante some code stdcxx-bitops GitHub repo floated to the std-proposals
的{{3}}邮件列表,作为为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;
}