У меня есть код C ++, который вызывает некоторые функции SSE / AVX, принимающие немедленные значения индекса (например, int _mm_extract_epi16 (__m128i a, int imm8)
). Проблема в том, что я не знаю значение индекса во время компиляции, поэтому мне нужно выполнить динамическое преобразование int
в constexpr int
:
template <int index>
auto extract(__m128i a) noexcept
{
static_assert(index < 8, "index must be less than 8");
return _mm_extract_epi16(a, index);
}
auto extract(const __m128i a, const int index) noexcept
{
switch (index) {
case 0: return extract<0>(a);
case 1: return extract<1>(a);
case 2: return extract<2>(a);
case 3: return extract<3>(a);
case 4: return extract<4>(a);
case 5: return extract<5>(a);
case 6: return extract<6>(a);
case 7: return extract<7>(a);
default: return extract<7>(a);
}
}
Я обновляю свою кодовую базу до AVX2 и AVX-512 (и, следовательно, увеличиваю количество дел до 16 и 32 соответственно), и начал задаваться вопросом, есть ли лучший способ сделать это? Или, по крайней мере, таким образом, чтобы избежать печатания?