Frage ist heute ziemlich kurz. Betrachten Sie das folgende Spielzeug C-Programm shuffle.c
zum Umkehren zwei gepackte Doppel im Register xmm0
:Irgendwelche Präferenz für SHUFPD oder PSHUFD zum Umkehren von zwei gepackten Doppel in einem XMM?
#include <stdio.h>
void main() {
double x[2] = {0.0, 1.0};
asm volatile (
"movupd (%[x]), %%xmm0\n\t"
"shufpd $1, %%xmm0, %%xmm0\n\t" /* method 1 */
//"pshufd $78, %%xmm0, %%xmm0\n\t" /* method 2 */
"movupd %%xmm0, (%[x])\n\t"
:
: [x] "r" (x)
: "xmm0", "memory");
printf("x[0] = %.2f, x[1] = %.2f\n", x[0], x[1]);
}
Nach einem Testlauf: gcc -msse3 -o shuffle shuffle.c | ./test
, beide Methoden/Anleitungen kehren das richtige Ergebnis x[0] = 1.00, x[1] = 0.00
. This page besagt, dass shufpd
eine Latenzzeit von 6 Zyklen hat, während die besagt, dass pshufd
nur eine Latenz von 1 Zyklen hat. Das klingt nach großer Vorliebe für pshufd
. Diese Anweisung ist jedoch wirklich für gepackte Ganzzahlen gedacht. Wenn es für gepackte Doubles verwendet wird, gibt es eine Strafe, die mit "falschem Typ" verbunden ist?
Als eine ähnliche Frage habe ich auch gehört, dass die Anweisung movaps
ist 1 Byte kleiner als movapd
, und sie tun das gleiche durch Lesen von 128 Bit aus einer 16-Bit-Adresse ausgerichtet. Können wir also immer erstere für die Verschiebung (zwischen XMMs)/Laden (aus dem Speicher)/Speichern (in den Speicher) verwenden? Das scheint verrückt. Ich denke, dass es einen Grund geben muss, dies abzulehnen. Kann mir jemand eine Erklärung geben? Vielen Dank.
Siehe auch http://stackoverflow.com/questions/2804902/whats-the-difference-between-logical-sse-intrinsics. Ich konnte mich nicht entscheiden, ob ich dies als Duplikat abstimmen oder beantworten sollte. Ich glaube mich zu erinnern, dass ich vor kurzem auch auf eine andere Frage die gleiche Antwort gegeben habe. –