mmintrin.h与MMX指令集 Intrinsics函数
来源:互联网 发布:淘宝直邮是真的吗 编辑:程序博客网 时间:2024/05/17 00:54
原帖看这边http://www.cnblogs.com/zyl910/archive/2012/07/19/intrin01_mmx.html
但自己做了个总结,方便自己看。
函数说明里的_mm省了
1、清理状态
_mm_emptyvoid _mm_empty (void);
EMMS函数后不加会有warning,寄存器特性决定MMX状态置空
2、32->64 64->32
cvt si32 _si64__m64 _mm_cvtsi32_si64 (int i );
32->64m64[31:0] = i m64[63:32]=0; si64 _si32 int _mm_cvtsi64_si32 ( __m64 m );
64->32i = 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)
赋值赋单值
- mmintrin.h与MMX指令集 Intrinsics函数
- MMX(AVX)Intrinsics头文件与SIMD指令集、Visual Studio版本对应表
- MMX Intrinsics各函数介绍
- MMX Intrinsics各函数介绍
- MMX指令集
- MMX指令集
- MMX指令集
- MMX的数据结构 & MMX指令集
- MMX指令集(详解)
- 【转】MMX指令集简介
- MMX指令集(备忘)
- MMX指令集(详解)
- MMX 指令
- MMX指令
- MMX指令
- MMX指令
- 汇编指令与Intrinsics指令的对应关系汇总
- Intrinsics头文件与SIMD指令集、Visual Studio版本对应表
- Quartz 2D编程指南(1) - 概览
- Quartz 2D编程指南(2) - 图形上下文(Graphics Contexts)
- linux--命令执行的判断依据: ; , &&, ||
- Quartz 2D编程指南(3) - 路径(Paths)【上
- NSString NSNull
- mmintrin.h与MMX指令集 Intrinsics函数
- pthread_create函数编译时报错:undefined reference to 'pthread_create'
- Quartz 2D编程指南(3) - 路径(Paths)【下】
- 矩阵经典题目八:hdu 2175 How many ways??
- Quartz 2D编程指南(4) - 颜色和颜色空间
- NSString 使用方法
- C语言一个语句完成浮点数四舍五入
- 给定一个图片文件名,判断字符串中是否以“png”结尾,如果是就替换成“jpg”,如果不是,就拼接”.jpg”。
- Quartz 2D编程指南(5) - 变换