原帖看这边http://www.cnblogs.com/zyl910/archive/2012/07/19/intrin01_mmx.html
但自己做了个总结,方便自己看。
函数说明里的_mm省了
1、清理状态
_mm_empty void _mm_empty (void);
EMMS函数后不加会有warning,寄存器特性决定MMX状态置空
2、32->64 64->32
cvt si32 _si64 __m64 _mm_cvtsi32_si64 (int i );
32->64 m64[31:0] = i m64[63:32]=0; si64 _si32 int _mm_cvtsi64_si32 ( __m64 m );
64->32 i = m64[31:0]
饱和的概念:简短的说就是封顶。对有符号数,例如八位有符号值,(80h-7fh)即-128-127 超过这个值就封顶为这个值。16位32位的类推。
3、打包
packs _pi16 _pi32 _pu16 __m64 _mm_packs_pi16 (__m64 m1, __m64 m2);
饱和打包DEST[7:0] <-DEST[15..0]; ····· DEST[31:24]<-[63:48]; DEST[39:32] <-SRC[15:0] ·····DEST[63:56] <-SRC[63:48];
4、解包
unpack hi (lo) _pi8 _pi16 _pi32 __m64 _mm_unpackhi(lo)_pi8 (__m64 m1 , __m64 m2);
高位(低位)解包 目的数在低位,和源操作数交叉放置
5、加法
add_pi8 _pi16 _pi32 __m64 _mm_add_pi8 (__m64 m1 , __m64 m2);
环绕加法 环绕加法:例如uchar+uchar 和为300时,实际为300-256=44
adds_pi8 _pi16 _pi32 __m64 _mm_adds_pi8 (__m64 m1 , __m64 m2);
饱和加法 饱和定义见上
6、减法
sub_pi8 _pi16 _pi32 __m64 _mm_sub_pi8 (__m64 m1 , __m64 m2);环绕减法
subs_pi8 _pi16 _pi32 __m64 _mm_subs_pi8 (__m64 m1 , __m64 m2);饱和减法
7、乘后二加
madd_pi16 __m64 _mm_madd_pi16 (__m64 m1 , __m64 m2);
乘后二加
m64[31:0]=m1[15:0]*m2[15:0]+m1[31:16]*m2[31:16]
m64[63:32]=m1[47:32]*m2[47:32]+m1[63:48]*m2[63:48]
8、乘法
mulhi(lo)_pi16 __m64 _mm_mulhi_pi16 (__m64 m1 , __m64 m2);
乘法高(低)位 两个16位数相乘为32位,高位乘法保存高16位
9、左移
sll(i)_pi16 _pi32 _si64 __m64 _mm_sll(i)_pi16 (__m64 m , __m64 count);
逻辑左移 实际左移位数为count*8 ,带i,count为立即数,否则为寄存器
10、逻辑右移
srl(i)_pi16 _pi32 _si64 __m64 _mm_srl(i)_pi16 (__m64 m , __m64 count);
同逻辑左移
11、算数右移
sra(i)_pi16 _pi32 __m64 _mm_sra(i)_pi16 (__m64 m , __m64 count);
同逻辑右移算数右移是带符号位右移
12、位运算
__m64 _mm_and_si64 (__m64 m1 , __m64 m2); 逻辑与
__m64 _mm_andnot_si64 (__m64 m1 , __m64 m2); 逻辑与非
__m64 _mm_or_si64 (__m64 m1 , __m64 m2); 逻辑或
__m64 _mm_xor_si64 (__m64 m1 , __m64 m2);逻辑异或
13、比较
cmpeq_pi8 _pi16 _pi32 __m64 _mm_cmpeq_pi8 (__m64 m1 , __m64 m2);
比较相等 8位 16位 32位比较。相等
cmpgt_pi8 _pi16 _pi32__m64 _mm_cmpgt_pi8 (__m64 m1 , __m64 m2);
比较大于
14、赋值
_mm_setzero_si64 ();置位
set_pi32 _pi16 _pi8__m64 _mm_set_pi32 (int i1, int i0)
赋值从右往左赋值
setr_pi32 _pi16 _pi8 __m64 _mm_setr_pi32 (int i0, int i1)
赋值 从左往右赋值
set1_pi32 _pi16 _pi8__m64 _mm_set1_pi32 (int i)
赋值赋单值