Почему в инструкциях SSE "mov" указано, что они перемещают значения с плавающей запятой?

Многие инструкции SSE "mov" указывают, что они перемещают значения с плавающей запятой. Например:

  • MOVHLPS-Move Упакованные одноточечные значения с плавающей запятой от высокой к низкой
  • MOVSD-Move Scalar Double-Precision Floating Point Point
  • MOVUPD-Move Unaligned Packed Double Precision Floating Point Point

Почему эти инструкции не говорят, что они перемещают 32-битные или 64-битные значения? Если они просто перемещают бит вокруг, почему инструкции указывают, что они предназначены для значений с плавающей запятой? Разумеется, они будут работать, интерпретируете ли эти биты как плавающие или нет?

Ответ 1

Я думаю, что нашел ответ: некоторые микроархитектуры выполняют инструкции с плавающей запятой для разных исполнительных блоков, чем целые инструкции. Вы получаете лучшую общую задержку, когда поток инструкций остается в пределах одного и того же "домена" (целая или плавающая точка). Это подробно описано в руководстве по оптимизации Agner Fog в разделе "Задержки байпаса данных": http://www.agner.org/optimize/microarchitecture.pdf

Я нашел это объяснение в этом подобном вопросе SO: Разница между инструкциями MOVDQA и MOVAPS x86?

Ответ 2

В случае, если кто-то заботится, именно поэтому в векторном классе Agner Fog у него есть отдельные векторные классы для использования с булевым float (Vec4fb) и логическим целым (Vec4i) http://www.agner.org/optimize/#vectorclass

В своем руководстве он пишет. "Причина, по которой мы определили отдельный булевский векторный класс для использование векторов с плавающей запятой заключается в том, что оно позволяет нам создавать более быстрый код. (Многие современные ЦП имеют отдельные исполнительные блоки для целых векторов и плавающие точечные векторы. Иногда возможно выполнять булевы операции в с плавающей точкой и тем самым избежать задержки с перемещением данных между двумя единицы) ".

В большинстве вопросов о SSE и AVX можно получить ответ, прочитав его руководство и, что более важно, посмотреть на код в его векторном классе.