mmintrin.h与MMX指令集 Intrinsics函数

原帖看这边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) 

赋值赋单值

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值