Как повернуть вектор SSE/AVX

Мне нужно выполнить операцию вращения с как можно меньшим количеством тактов. В первом случае примем __m128iкак источник и тип назначения :

source: || A0 || A1 || A2 || A3 ||
  dest: || A1 || A2 || A3 || A0 ||
dest = (__m128i)_mm_shuffle_epi32((__m128i)source, _MM_SHUFFLE(0,3,2,1));

. Теперь я хочу сделать то же самое с встроенными функциями AVX. Итак, давайте предположим, что это время __m256iв качестве исходного и целевого типов :

source: || A0 || A1 || A2 || A3 || A4 || A5 || A6 || A7 ||
  dest: || A1 || A2 || A3 || A4 || A5 || A6 || A7 || A0 ||

. Во встроенных функциях AVX отсутствует большинство соответствующих целочисленных операций SSE. Возможно, есть какой-то способ получить желаемый результат, работающий с версией с плавающей запятой.

Я пробовал с:

dest = (__m256i)_mm256_shuffle_ps((__m256)source, (__m256)source, _MM_SHUFFLE(0,3,2,1));

но то, что я получаю:

|| A0 || A2 || A3 || A4 || A5 || A6 || A7 || A1 ||

Любая идея о том, как решить эту проблему эффективным способом? (без смешивания операций SSE и AVX и без инвертирования «вручную» A0иA1

Заранее спасибо!

17
задан Benedikt Waldvogel 6 December 2012 в 13:13
поделиться