SSE/AVX指令集學習筆記

​ 因爲最近在做SSE/AVX指令集優化視頻編碼的某些模塊,所以要學習SSE指令集的用法。本帖主要記錄本人用到的函數的用法。

一、SSE指令(128位寄存器)

__m128i _mm_load_si128 (__m128i *p);
MOVDQA
將p加載到128位寄存器上,比如p指針指向int類型(32位),則取出4個值加載到寄存器上。必須是16字節對齊方式。
__m128i _mm_loadu_si128 (__m128i *p);
MOVDQU
這個函數比上一個多了一個u,意思是不用必須16字對齊。
__m128i _mm_mul_epi32( 
   __m128i a,
   __m128i b 
);
a[0]*b[0]的值放在低64位,a[2]*b[2]的值放在高64位,結果值也是有符號數
32位有符號整數×32位有符號整數要用64位來保存,否則可能會溢出。
__m128i _mm_shuffle_epi32 (__m128i a, int imm);
PSHUFD
此函數可以將一個寄存器上的4個整數調換位置,位置的選取由imm來控制,imm可由下面的拖曳宏功能實現
#define _MM_SHUFFLE(fp3, fp2, fp1, fp0) (((fp3) << 6) | ((fp2) << 4) | \
                                        ((fp1) << 2) | ((fp0)))
比如初始的4個整數10203040.位置是3210。
如果_MM_SHUFFLE(2, 3, 0, 1),那麼寄存器上的4個數將會變成20104030
__m128i _mm_cvtepi16_epi32( 
   __m128i a
);16位帶符號整數轉換爲32位帶符號整數,可將short轉換爲int
__m128i _mm_set_epi32 (int i3, int i2,    int i1, int i0);
(composite)
從高位到低位加載432位有符號整數,如果想反向加可以調換參數的順序也可以在set後面加個r
__m128i _mm_add_epi32 (__m128i a, __m128i b);
PADDD
對應位的432位有符號整數相加
__m128i _mm_sub_epi32 (__m128i a, __m128i b);
PSUBD
對應位的432位有符號整數相減

二、AVX指令(256位寄存器)

__m256i _mm256_loadu_si256(__m256i *p)256位寄存器可以加載8int型的整數
__m256i _mm256_abs_epi32(__m256i a):寄存器上的每個數取絕對值
__m256i _mm256_add_epi32(__m256i a, __m256i b):寄存器對應位相加
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章