Gibt es eine SSE2-Anweisung zum Laden eines 128-Bit-Vektorregisters int
von einem int
-Puffer in umgekehrter Reihenfolge?SSE2-Anweisung zum Laden von ganzen Zahlen in umgekehrter Reihenfolge
Antwort
Es ist ganz einfach 32 Bit int
Elemente nach einer normalen Last zu umkehren:
__m128i v = _mm_load_si128(buff); // MOVDQA
v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3)); // PSHUFD - mask = 00 01 10 11 = 0x1b
Sie können für 16-Bit-short
Elemente das gleiche tun, aber es braucht mehr Anweisungen:
__m128i v = _mm_load_si128(buff); // MOVDQA
v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3)); // PSHUFD - mask = 00 01 10 11 = 0x1b
v = _mm_shufflelo_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFLW - mask = 10 11 00 01 = 0xb1
v = _mm_shufflehi_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFHW - mask = 10 11 00 01 = 0xb1
Beachten Sie, dass Sie dies mit weniger Anweisungen unter Verwendung von _mm_shuffle_epi8
(PSHUFB
) tun können, wenn SSSE3 verfügbar ist:
const __m128i vm = _mm_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);
// initialise vector mask for use with PSHUFB
// NB: do this once, outside any processing loop
...
__m128i v = _mm_load_si128(buff); // MOVDQA
v = _mm_shuffle_epi8(v, vm); // PSHUFB
EDIT: (Hier finden Sie für single precision floating point Skalare, es hier nur für den Fall zu verlassen)
Die ungefähre (und praktisch) ist _mm_loadr_ps
intrinsische. Beachten Sie, dass die Adresse 16 Byte ausgerichtet sein muss.
Obwohl dies intrinsisch übersetzt mehr als Anweisung (MOVAPS
+ shuffling).
Danke für die Antwort, aber diese Anweisung lädt vier Gleitkommawerte mit einfacher Genauigkeit in umgekehrter Reihenfolge. Ich suche nach der gleichen Operation für Ganzzahlen, aber ich denke, es gibt keine Unterstützung dafür. – Andy
Ja, ich habe nicht bemerkt, dass Sie über ganzzahlige Werte sprechen (sollte Ihren Titel erneut gelesen haben). Paul R Antwort ist was du brauchst. – Trax
Ja. Nur neugierig, kann die gleiche Operation mit kurzen Werten durchgeführt werden? – Andy
Danke Paul.Ihre Logik funktioniert gut. Aber ich konnte die Verwendung des zweiten Parameters "0x1B" nicht verstehen. Ist es eine Art Maske? Ein weiterer Zweifel ist ... Ist es möglich, die gleiche Operation auf Shorts zu tun? – Andy
Ich habe ein zweites Beispiel zum Laden und Umkehren von Shorts hinzugefügt. Die Maske ist in den Intel-Dokumenten enthalten, aber ich habe Kommentare hinzugefügt, um zu zeigen, wie sie aufgebaut sind. –
P. S. Ich empfehle dringend den [Intel Intrinsics Guide] (http://software.intel.com/en-us/articles/intel-intrinsics-guide) - ein sehr nützliches Tool für WIN/Mac OS X/Linux, das alle diese Dokumente dokumentiert SSE/AVX Anweisungen und intrinsics in einer sehr zugänglichen Weise. –