因为最近在做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个整数10,20,30,40.位置是3,2,1,0。
如果_MM_SHUFFLE(2, 3, 0, 1),那么寄存器上的4个数将会变成20,10,40,30
__m128i _mm_cvtepi16_epi32(
__m128i a
);
将16位带符号整数转换为32位带符号整数,可将short转换为int
__m128i _mm_set_epi32 (int i3, int i2, int i1, int i0);
(composite)
从高位到低位加载4个32位有符号整数,如果想反向加可以调换参数的顺序也可以在set后面加个r
__m128i _mm_add_epi32 (__m128i a, __m128i b);
PADDD
对应位的4个32位有符号整数相加
__m128i _mm_sub_epi32 (__m128i a, __m128i b);
PSUBD
对应位的4个32位有符号整数相减
二、AVX指令(256位寄存器)
__m256i _mm256_loadu_si256(__m256i *p):256位寄存器可以加载8个int型的整数
__m256i _mm256_abs_epi32(__m256i a):寄存器上的每个数取绝对值
__m256i _mm256_add_epi32(__m256i a, __m256i b):寄存器对应位相加