2013-05-16 21 views

cevap

10

Bu normal yük sonra 32 bit int unsurları ters oldukça kolay:

__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 

Sen 16 bit short elemanları aynı şeyi yapabilir, ama daha talimatları alır:

__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 

SSSE3 mevcut olup olmadığını, daha az talimatları _mm_shuffle_epi8 (PSHUFB) kullanarak bunu unutmayın:

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

Teşekkürler Paul.Your mantığınız iyi çalışıyor.Ama ikinci "0x1B" parametresinin kullanımını anlayamadım. Bir çeşit maske mi? Başka bir şüphe var ... Aynı ameliyatı şortlarla yapmak mümkün mü? – Andy

+0

Yükleme ve geri vites şortu için ikinci bir örnek ekledim. Maske Intel dokümanlarında ele alındı, ancak nasıl oluşturulduğunu göstermek için yorumlar ekledim. –

+0

P.S. [Intel Intrinsics Guide] 'ı (http://software.intel.com/en-us/articles/intel-intrinsics-guide) - WIN/Mac OS X/Linux için çok kullanışlı bir aracı indirmenizi tavsiye ederim. SSE/AVX talimatları ve intrinsikler çok erişilebilir bir şekilde. –

-2

DÜZENLEME: En yaklaşık (ve kullanışlı) içsel _mm_loadr_ps olduğunu

(aşağıdaki ihtimale buradan bırakarak tek hassasiyetli kayar nokta skalerler içindir). Adresin 16bayta hizalanmış olması gerektiğini unutmayın.

bu içsel talimat (+ karıştırma MOVAPS) daha daha çevirir rağmen.

+0

Yanıt için teşekkürler, ancak bu komut ters sırayla dört tek kesinlikli, kayan nokta değerleri yükler. Tamsayılar için aynı işlemi arıyorum ama bunun için destek yok sanırım. – Andy

+0

Evet Tam sayı değerleri hakkında konuştuğunuzu farketmediniz (başlığınızı yeniden okumuş olmalısınız). Paul R cevabı senin ihtiyacın olan şey. – Trax

+0

Evet.Sadece meraklı, aynı işlem kısa değerler ile yapılabilir mi? – Andy