2013-05-16 83 views

回答

10

這是很容易在正常負荷後逆轉32個int元素:

__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 

你可以做同樣的事情爲16個short元素,但它需要更多的指令:

__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可用,則可以使用_mm_shuffle_epi8 (PSHUFB)更少的指令執行此操作:

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

感謝Paul.Your邏輯工作正常。但我不明白第二個參數「0x1B」的用法。這是一種面具嗎?另一個疑問是......短褲可以做同樣的手術嗎? – Andy

+0

我已經添加了第二個加載和倒轉短褲的例子。英特爾文檔涵蓋了該面罩,但我已添加註釋以說明其構造方式。 –

+0

P.S.我強烈建議下載[Intel Intrinsics Guide](英特爾內部指南)(http://software.intel.com/zh-cn/articles/intel-intrinsics-guide) - 一個非常有用的WIN/Mac OS X/Linux工具,它記錄所有SSE/AVX指令和內部函數非常容易訪問。 –

-2

編輯:(以下是單精度浮點標量,離開這裏以防萬一)

最相近的(和方便)爲_mm_loadr_ps內在。請注意地址必須是16byte對齊。

雖然這種內在轉化爲多於指令MOVAPS +洗牌)。

+0

感謝您的回覆,但此指令以相反順序加載四個單精度浮點值。我正在尋找整數的相同操作,但我想沒有支持。 – Andy

+0

是的,我沒有注意到你正在談論整數值(應該重新閱讀你的標題)。保羅R答案是你所需要的。 – Trax

+0

是的。只是好奇,同樣的操作可以用短值完成嗎? – Andy