У меня был C-код, написанный с некоторыми интеллектуальными процессорами. После того, как я скомпилировал его сначала с помощью avx, а затем с флагами ssse3, я получил два совершенно разных ассемблерных кода. Например:
AVX:
vpunpckhbw %xmm0, %xmm1, %xmm2
SSSE3:
movdqa %xmm0, %xmm2
punpckhbw %xmm1, %xmm2
Понятно, что vpunpckhbw
- это просто punpckhbw
, но с использованием синтаксиса ax трех операндов. Но является ли латентность и пропускная способность первой инструкции эквивалентной латентности и пропускной способности последних объединены?
Или ответ зависит от архитектуры, которую я использую? Кстати, это IntelCore i5-6500.
Я попытался найти ответ в таблицах инструкций Agner Fog, но не смог найти ответ. Спецификации Intel также не помогли (однако, вероятно, я просто пропустил тот, который мне нужен).
Всегда ли лучше использовать новый синтаксис AVX, если это возможно?