Стандартный код C ++ 11 эквивалентен инструкции PEXT Haswell (и, вероятно, будет оптимизирован компилятором)

Архитектура Haswell предлагает несколько новых инструкций. Один из них является PEXT (извлечение параллельных битов) чья функциональность объясняется этим изображением (источник Вот):

Pext

Это принимает значение r2 и маска r3 и кладет извлеченные биты r2 в r1,

Мой вопрос заключается в следующем: что будет эквивалентным кодом оптимизированной шаблонной функции в чистый стандарт C ++ 11, который, вероятно, будет оптимизирован для этой инструкции компиляторами в будущем.

7

Решение

Вот некоторый код от Мэтью Фиораванте 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;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]