Разница между инструкциями MOVDQA и MOVAPS x86?

Я ищу таблицу Intel: Архитектуры Intel® 64 и IA-32 Руководство для разработчиков программного обеспечения, и я не могу найти разницу между

  • MOVDQA: переместить двойное двустворчатое слово.
  • MOVAPS: перемещение однопользовательской односторонней печати

В таблице данных Intel я могу найти для обеих команд:

Эта инструкция может использоваться для загрузки регистра XMM из 128-битного памяти, чтобы сохранить содержимое регистра XMM в 128-битной памяти или для перемещения данных между двумя регистрами XMM.

Единственное различие:

Чтобы переместить двойной квадрат в или из неаудированных мест памяти, используйте инструкция MOVDQU.

и

Чтобы перемещать упакованные значения с плавающей запятой с одинарной точностью в или из неявные ячейки памяти, используйте инструкцию MOVUPS.

Но я не могу найти причину, по которой две разные инструкции?

Так может кто-нибудь объяснить разницу?

Ответ 1

В функциональности они идентичны.

В некоторых (но не во всех) микроструктурах существуют временные различия из-за "штрафов за перекресток". По этой причине обычно следует использовать movdqa, когда данные используются с целыми инструкциями SSE, и movaps, когда данные используются с инструкциями с плавающей запятой. Для получения дополнительной информации по этому вопросу обратитесь к руководству по оптимизации Intel или к руководству по микроархитектуре Agner Fog. Обратите внимание, что эти задержки чаще всего связаны с перемещениями регистровых регистров вместо загрузок или хранилищ.