Как переставлять значения в YMM-регистрах

Как переставлять значения в YMM-регистрах? В XMM-регистрах есть команды PERMILPS/SHUFPS, где с помощью маски я могу переставить, например, первое и последнее значения: SHUFPS XMM0, XMM0, 00100111. Есть ли что-то такое для YMM? Я пытался использовать VPERMILPS, но он тоже меняет только значения в XMM.

А, и я бы хотел еще узнать как значение из XMM занести в YMM


Ответы (2 шт):

Автор решения: WhileTrueDoEnd

Нашел ответ: с помощью команды VPERM2F128 ymm0, ymm0, ymm0, 01b можно поменять местами значения xmm и ymm. Так, можно сначала занести значения старшей части в младшую(xmm), сделать необходимые преобразования командами для xmm(в моем случае перестановки с помощью команды SHUFPS), а затем занести значения обратно в старшую часть с помощью той же команды VPERM2F128.

Это всё работает для чисел с плавающей точкой. Для целых чисел нужно использовать VPERM2I128

→ Ссылка
Автор решения: Илья К

Ответ на твой вопрос сильно зависит от того какой сет команд тебе доступен. на сегодняшний момент существуют следующие сеты: SSE / SSE2 / SSE3 / SSSE3 / SSE4.1 / SSE4.2 / AVX / AVX2 / AVX512 / FMA

YMM регистры доступны начиная с AVX сета, на AVX можно использовать VPERM2F128, на AVX2 можно использовать VPERMQ, дальше выбор еще больше и зависит от того чего ты хочешь добиться.

Есть такое неписанное правило, если тебе надо поменять верхнюю и нижнюю часть регистра значит ты чтото делаешь не правильно.

→ Ссылка