Архитектура Haswell предлагает несколько новых инструкций. Один из них является PEXT
(извлечение параллельных битов) чья функциональность объясняется этим изображением (источник Вот):
Это принимает значение r2
и маска r3
и кладет извлеченные биты r2
в r1
,
Мой вопрос заключается в следующем: что будет эквивалентным кодом оптимизированной шаблонной функции в чистый стандарт C ++ 11, который, вероятно, будет оптимизирован для этой инструкции компиляторами в будущем.
Вот некоторый код от Мэтью Фиораванте stdcxx-bitops GitHub репо это было плыл к std-proposals
список рассылки в качестве предварительного предложения о добавлении constexpr
библиотека побитовых операций для C ++.
#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;
}
Других решений пока нет …