Сохранение двух 32-битных регистров x86 в 128-битный регистр xmm - PullRequest
9 голосов
/ 09 февраля 2010

Есть ли более быстрый способ хранения двух 32-битных регистров x86 в одном 128-битном регистре xmm?

  movd  xmm0, edx
  movd  xmm1, eax
  pshufd xmm0, xmm0, $1
  por   xmm0, xmm1 

То есть, если EAX равен 0x12345678, а EDX равен 0x87654321, результат в xmm0 должен быть 0x8765432112345678.

Спасибо

Ответы [ 2 ]

15 голосов
/ 09 февраля 2010

С SSE 4.1 вы можете использовать movd xmm0, eax / pinsrd xmm0, edx, 1 и делать это в 2 инструкциях.

Для более старых процессоров вы можете использовать 2 x movd, а затем punpckldq, всего 3инструкция:

movd xmm0, edx
movd xmm1, eax
punpckldq xmm0, xmm1
1 голос
/ 09 февраля 2010

Я не знаю много о MMX, но, возможно, вам нужна инструкция PACKSSDW.

Инструкция PACKSSDW принимает два двойные слова в исходном операнде и два двойных слова в целевой операнд и преобразует эти до четырех подписанных слов через насыщение. Инструкция упаковывает эти четыре слова вместе и сохраняет результат в регистр MMX назначения.

(из http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.html)

Редактировать: Я только что понял, что это регистры SSE. Ну хорошо.

Редактировать: я сейчас заткнусь.

...