Можно ли смешивать устаревшие инструкции в кодировке SSE и VEX в одном и том же пути кода?
Наряду с внедрением AVX корпорация Intel представила схему кодирования VEX в архитектуре Intel 64 и IA-32. Эта схема кодирования используется в основном с инструкциями AVX. Мне было интересно, можно ли смешивать инструкции, закодированные в VEX, и теперь называемые "устаревшими инструкциями SSE".
Основной причиной, по которой я задаю этот вопрос, является размер кода. Рассмотрим эти две инструкции:
shufps xmm0, xmm0, 0
vshufps xmm0, xmm0, xmm0, 0
Я обычно использую первый, чтобы "передать" скалярное значение во все места в регистре XMM. Теперь набор команд говорит, что единственное различие между этими двумя (в данном случае) состоит в том, что кодированный VEX очищает старшие (>=128) биты регистра YMM. Предположим, что мне это не нужно, в чем преимущество использования VEX-кодированной версии в этом случае? Первая инструкция занимает 4 байта (0FC6C000
), второе - 5 (C5F8C6C000
).
Спасибо за все ответы заранее.
2 ответа
В текущих реализациях, если (по крайней мере) верхние половины были сброшены (VZEROUPPER или VZEROALL), штраф за использование устаревших инструкций SSE отсутствует.
Как подробно описано на стр. 128 в Agner Fog: оптимизация подпрограмм при сборке с использованием устаревших инструкций SSE, когда (некоторые) верхние половины используются, влечет за собой снижение производительности. Это наказание применяется один раз при входе в состояние, в котором регистры YMM разбиты посередине, и еще раз при выходе из этого состояния.
Смешивание 128-битных инструкций в кодировке VEX и унаследованных инструкций SSE не является проблемой.
Это небезопасно. Согласно руководству разработчика программного обеспечения Intel, версия VEX.128 обнуляет верхнюю половину регистра YMM, а устаревшая версия SSE - нет. Хуже всего то, что некоторые ассемблеры (например, gasm) могут конвертировать SHUFPS в VSHUFPS при создании объектного файла (когда применяется флаг -mavx). Я обнаружил точно такую же проблему при работе со сборочным файлом.