Добавьте верхние и нижние 64 бита 128-битного регистра xmm.
-
19-09-2019 - |
Вопрос
У меня есть два упакованных целых числа из четырех слов в 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
.