سؤال

لدي اثنين من الأعداد الصحيحة الروائية معبأة في 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, ، يمكنك الابتعاد مع واحد من أضيق يضيف إذا كنت تفضل.

تعديل تلخيص أربع كلمات مزدوجة Quadwords - ما لديك بشكل جيد إلى حد كبير. بالنظر إلى أنك تعرف أن جميع البيانات الموجودة فيها تناسبها في كلامة منخفضة في كل فتحة، يمكنك تجربة شيء مثل:

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