c++ - 等同于 PEXT Haswell 指令的标准 C++11 代码(并且可能会被编译器优化)

标签 c++ x86 bit-manipulation compiler-optimization bmi

Haswell 架构提供了几个新的指令。其中之一是 PEXT ( parallel bits extract ),这张图片解释了它的功能(来源 here ):

pext

它接受一个值 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/

相关文章:

c++ - 从 C++.net 中的串口快速读取常量数据流

使用命令行参数执行另一个程序的 C++ 程序

linux - NASM 获取参数并调用 sys_execve

javascript - Javascript中按位运算结果的区别

c++ - 内联函数中 __LINE__ 的行为

performance - rdpmc 的 CR4.PCE 已清除

linux - 获取关于段错误或崩溃的指令指针(针对 x86 JIT 编译器项目)?

c# - Java 中的移位比乘法和除法更快吗? 。网?

algorithm - 如何计算32位整数中的设置位数?

c++ - 当 operator<<() 失败时回退到 to_string()