Предположим, у меня есть четыре __m128i
переменных, которые содержат данные, полученные в результате некоторых вычислений. Например, скажем:
__m128i a = _mm_set_epi64x(1, 11);
__m128i b = _mm_set_epi64x(2, 22);
__m128i c = _mm_set_epi64x(3, 33);
__m128i d = _mm_set_epi64x(4, 44);
Я хочу инициализировать две __m256i
переменные, где первая содержит все старшие 64 бита четырех переменных, а вторая содержит младшие 64 бита каждой. Итак, я хочу иметь:
__m256i x = ...; // x = { 4, 3, 2, 1 };
__m256i y = ...; // y = { 44, 33, 22, 11 };
Очевидный способ сделать это - использовать _mm256_set_epi64x
и _mm_extract_epi64
. Однако, вероятно, это не особенно быстро. Есть ли более быстрый способ сделать это? В частности, для доступа к 64 старшим битам я не вижу подходящей нагрузки (есть загрузка для младших 64 бит в SSE2) или инструкции перемешивания (похоже, нет «64-битного перемешивания»).