Разница между инструкциями 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. Обратите внимание, что эти задержки чаще всего связаны с перемещениями регистровых регистров вместо загрузок или хранилищ.