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):寄存器对应位相加
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章