أضف الجزء العلوي والسفلي 64 بت من سجل XMM 128 بت
-
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
, ، يمكنك الابتعاد مع واحد من أضيق يضيف إذا كنت تفضل.
تعديل تلخيص أربع كلمات مزدوجة 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
.