Как перемещать 128-битные значения между регистрами XMM?

На первый взгляд тривиальная проблема при сборке: я хочу скопировать весь регистр XMM0 в XMM3. я пробовал

movdq xmm3, xmm0

но MOVDQ нельзя использовать для перемещения значений между двумя регистрами XMM. Что мне делать вместо этого?


person lampak    schedule 29.12.2011    source источник


Ответы (1)


It's movapd, movaps, or movdqa

movaps xmm3, xmm0

Все они делают одно и то же, но есть одна загвоздка:

  • movapd и movaps работают в области с плавающей запятой.
  • movdqa работает в целочисленной области

Используйте тот, который соответствует вашему типу данных, чтобы избежать задержек при смене домена.

Кроме того, нет причин использовать movapd. Вместо этого всегда используйте movaps, потому что для кодирования movapd требуется дополнительный байт.

person Mysticial    schedule 29.12.2011
comment
movdqa - это то, что я искал :) Спасибо. Это было быстро :) PS. Чем на самом деле ходы с плавающей запятой отличаются от целочисленных? Для меня оба должны быть простым копированием ... - person lampak; 29.12.2011
comment
В процессорах Intel есть отдельные блоки FP и целочисленные. Когда вы выполняете инструкцию, которая находится в одной единице, значение перемещается в эту единицу. Но когда вы даете команду в другом домене для этого значения, она должна быть перемещена в новый блок - со штрафом в 1-2 цикла. Следовательно, лучше, если возможно, сохранить значение в домене - отсюда и mov разные инструкции. Если вы выполняете целочисленную арифметику и используете movaps, вы заплатите штраф, чтобы переместить значение в единицу FP, и еще один штраф, чтобы переместить его обратно на следующую целочисленную инструкцию, выданную ему. - person Mysticial; 29.12.2011
comment
То же самое относится к логическим операторам: таким как: por, orps и orpd - person Mysticial; 29.12.2011