Fügen den oberen und unteren 64-Bits eines 128-Bit-Register xmm
-
19-09-2019 - |
Frage
Ich habe zwei gepackte Quadwort ganze Zahlen in xmm0
und ich brauche sie zusammen zu addieren und das Ergebnis in einem Speicherplatz zu speichern. Ich kann garantieren, dass der Wert der jede ganze Zahl kleiner als 2 ^ 15 . Gerade jetzt, ich tue das folgende:
int temp;
....
movdq2q mm0, xmm0
psrldq xmm0, 8
movdq2q mm1, xmm0
paddq mm0,mm1
movd temp, mm0
Gibt es einen besseren Weg, dies zu tun?
Lösung
Zunächst einmal, warum sind Sie Quad-Wörter verwenden Werte darzustellen, die in einem 16-Bit-Format passen würde? Weggehen, dass abgesehen, ein paar Lösungen:
pshufd xmm1, xmm0, EEh
paddq xmm0, xmm1
movd temp, xmm0
oder
movdqa xmm1, xmm0
psrldq xmm1, 8
paddq xmm0, xmm1
movd temp, xmm0
oder
movhlps xmm1, xmm0
paddq xmm0, xmm1
movd temp, xmm0
Beachten Sie, dass Sie eigentlich gar nicht verwenden paddq
benötigen, können Sie mit einem der weg schmäler fügt hinzu, wenn Sie es vorziehen.
Bearbeiten vier Doppel Quad-Wörter Summieren - was Sie haben, ist ziemlich gut. Vorausgesetzt, dass Sie wissen, dass alle Daten in ihnen passen in das niedrige Doppelwort jeden Schlitzes, Sie könnten versuchen, so etwas wie:
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
, die unter Beweis stellen kann oder auch nicht schneller sein.
Wie bei EMMS, es ist nur eine andere Anweisung. Nach jedem Code, der die MMX-Register, vor jedem Code berührt, die die x87-Befehle Sie haben emms
müssen Gleitkommazahlen verwendet.