说明】:本系列笔记主要转载自网上的资源,版权归网上的各路牛人,本人只是在牛人的基础上结合自己的实践对一些笔记进行整理,添加自己的心得和一些代码。感谢网上未曾谋面的大牛们!
【转载】:SIMD函数整理:00 索引贴 (作者:zyl910)
关于SIMD(MMX、SSE、AVX)编程的资料一直很零散,于是我试图进行收集整理,便于随时翻阅学习。而且很多代码是直接用汇编写的,易读性差、难以重用,于是我决定将其统一改写为Intrinsics函数版。
一、Instructions函数对照表
在使用Instructions函数时,很多时候会发现 MSDN 说的不详细,这时只有去翻阅Intel、AMD文档了。但Intel、AMD文档都是按照汇编指令名排序的,查起来不太方便。而且 SIMD 指令大多很复杂,文字描述难以详细的解释其功能,唯有伪代码才能精确的解释其功能。但Intel、AMD文档上的伪代码大多很长,不适合随时翻阅。
于是我希望能有一份这样的表格 :
1) 按照 Intrinsics 头文件中的顺序排序;
2)有函数名、汇编指令、功能描述、伪代码 这四列,便于对照。
3)伪代码只有一行,并尽可能简短,便于表格化。
为简化伪代码,我借用C语言语法,可以写循环和大括号语句块,将 mm / xmm / ymm 寄存器看做联合体、转型等。
【例如】 PADDSB(饱和加法.无8位)指令的伪代码为 —— for (i=0; i<8; ++i) { r.uB[i] = SU(m1.uB[i] + m1.uB[i]); }
【解释】 r : 返回值。 r.uB[i]表示,将r这个64位寄存器 看做 “无符号8位整数”的数组。
m1、m2:输入参数1与输入参数2。 同理 "uB[i]" 也是指将其看做 “无符号8位整数”的数组。
SU:无符号饱和处理。当运算超过上界或下界时数值会饱和到边界,而不发生环绕。这对图像处理等领域非常有用。
uB等类型缩写见《SIMD(MMX/SSE/AVX)变量命名规范心得 》
SU等函数的说明 ——
SIMD Instructions函数对照表1 : mmintrin.h与MMX指令集
SIMD Instructions函数对照表2 : xmmintrin.h与SSE指令集
SIMD Instructions函数对照表3 : pmmintrin.h和tmmintrin.h与SSE3和SSSE3指令集 或 SSE3和SSSE3 Intrinsics各函数介绍
二、SSE命令示例代码
为了更好的理解SSE的各种命令代码,编写了一些示例代码,参见:
1. SSE命令示例代码(算术、逻辑、比较)
2. SSE命令示例代码(转换、加载、置位、存储)
3. SSE命令示例代码(整型、读写控制寄存器、混杂、矩阵变换)