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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top