Добавьте верхние и нижние 64 бита 128-битного регистра xmm.

StackOverflow https://stackoverflow.com/questions/1890867

Вопрос

У меня есть два упакованных целых числа из четырех слов в xmm0 и мне нужно сложить их вместе и сохранить результат в памяти.Я могу гарантировать, что значение каждого целого числа меньше, чем 2^15.Прямо сейчас я делаю следующее:

int temp;
....   

   movdq2q mm0, xmm0
   psrldq xmm0, 8
   movdq2q mm1, xmm0
   paddq mm0,mm1
   movd temp, mm0

Есть лучший способ сделать это?

Это было полезно?

Решение

Во-первых, почему вы используете четверные слова для представления значений, которые умещаются в 16-битном формате?Оставляя это в стороне, есть пара решений:

pshufd xmm1, xmm0, EEh
paddq  xmm0, xmm1
movd   temp, xmm0

или

movdqa xmm1, xmm0
psrldq xmm1, 8
paddq  xmm0, xmm1
movd   temp, xmm0

или

movhlps xmm1, xmm0
paddq   xmm0, xmm1
movd    temp, xmm0

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

редактировать суммирование четырех двойных четверных слов — то, что у вас есть, вполне нормально.Учитывая, что вы знаете, что все данные в них помещаются в младшее двойное слово каждого слота, вы можете попробовать что-то вроде:

shufps  xmm0, xmm2, 88h
shufps  xmm4, xmm6, 88h
paddd   xmm0, xmm4
psrlq   xmm1, xmm0, 32
paddd   xmm0, xmm1
movhlps xmm1, xmm0
paddd   xmm0, xmm0
movd    temp, xmm0

который может оказаться или не оказаться быстрее.

Что касается EMMS, то это очередная инструкция.После любого кода, который касается регистров MMX, перед любым кодом, использующим инструкции x87 с плавающей запятой, вам необходимо иметь emms.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top