2013-05-16 8 views

risposta

10

E 'abbastanza facile per invertire a 32 bit int elementi dopo un carico normale:

__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 

È possibile fare la stessa cosa per 16 bit short elementi, ma ci vuole più istruzioni:

__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 

Nota che puoi farlo con meno istruzioni usando _mm_shuffle_epi8 (PSHUFB), se SSSE3 è disponibile:

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

Grazie Paul. La tua logica sta funzionando bene. Ma non riesco a capire l'uso del secondo parametro "0x1B". È una specie di maschera? Un altro dubbio è ... È possibile fare la stessa operazione su pantaloncini? – Andy

+0

Ho aggiunto un secondo esempio per il caricamento e l'inversione dei cortocircuiti. La maschera è trattata nei documenti Intel, ma ho aggiunto dei commenti per mostrare come è costruita. –

+0

P.S. Consiglio vivamente di scaricare la [Intel Intrinsics Guide] (http://software.intel.com/en-us/articles/intel-intrinsics-guide) - uno strumento molto utile per WIN/Mac OS X/Linux che documenta tutti i Istruzioni SSE/AVX e elementi intrinseci in un modo molto accessibile. –

-2

EDIT: (I seguenti sono per scalari punto singolo precisione galleggiamento, lasciando qui nel caso)

Il più approssimativa (e pratico) è _mm_loadr_ps intrinseca. Essere consapevoli che l'indirizzo deve essere allineato a 16 byte.

Sebbene questo intrinseco traduce in più di istruzione (MOVAPS + shuffling).

+0

Grazie per la risposta, ma questa istruzione carica quattro valori di virgola mobile a precisione singola in ordine inverso. Sto cercando la stessa operazione per i numeri interi ma suppongo che non ci sia supporto per quello. – Andy

+0

Sì, non ho notato che stavi parlando di valori interi (dovresti rileggere il tuo titolo). La risposta di Paul R è ciò di cui hai bisogno. – Trax

+0

Sì. Con curiosità, la stessa operazione può essere eseguita con valori brevi? – Andy