2013-05-16 21 views

Antwort

10

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 
+0

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

+0

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. –

+0

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. –

-2

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).

+0

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

+0

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

+0

Ja. Nur neugierig, kann die gleiche Operation mit kurzen Werten durchgeführt werden? – Andy