标准C++ 11代码等同于PEXT Haswell指令(可能由编译器优化)

Vin*_*ent 7 c++ bit-manipulation instruction-set compiler-optimization c++11

Haswell架构提出了几条新指令.其中一个是PEXT(并行位提取),其功能由此图像解释(源于此处):

PEXT

它需要一个值r2和一个掩码r3,并将提取的位r2放入r1.

我的问题如下:纯标准 C++ 11中优化模板化函数的等效代码是什么,将来可能会被编译器优化为该指令.

Tem*_*Rex 5

以下是Matthew Fioravante 的stdcxx-bitops GitHub 存储库中的一些代码,该代码已作为添加C++ 位运算库的初步提案发布到邮件列表中。std-proposalsconstexpr

#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;
}
Run Code Online (Sandbox Code Playgroud)