说明】:本系列笔记主要转载自网上的资源,版权归网上的各路牛人,本人只是在牛人的基础上结合自己的实践对一些笔记进行整理,添加自己的心得和一些代码。感谢网上未曾谋面的大牛们!
【转载】:SIMD函数整理:00 索引贴 (作者:zyl910


关于SIMD(MMX、SSE、AVX)编程的资料一直很零散,于是我试图进行收集整理,便于随时翻阅学习。而且很多代码是直接用汇编写的,易读性差、难以重用,于是我决定将其统一改写为Intrinsics函数版。


一、Instructions函数对照表

  在使用Instructions函数时,很多时候会发现 MSDN 说的不详细,这时只有去翻阅IntelAMD文档了。但IntelAMD文档都是按照汇编指令名排序的,查起来不太方便。而且 SIMD 指令大多很复杂,文字描述难以详细的解释其功能,唯有伪代码才能精确的解释其功能。但IntelAMD文档上的伪代码大多很长,不适合随时翻阅。

  于是我希望能有一份这样的表格 

      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.uB[i]表示,将r这个64位寄存器 看做 “无符号8位整数的数组。

    m1m2:输入参数1与输入参数2。 同理 "uB[i]" 也是指将其看做 “无符号8位整数的数组。

    SU:无符号饱和处理。当运算超过上界或下界时数值会饱和到边界,而不发生环绕。这对图像处理等领域非常有用。



 
uB等类型缩写见《SIMD(MMX/SSE/AVX)变量命名规范心得 

 SU等函数的说明 ——

SIMD学习笔记整理(索引贴)-编程知识网

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命令示例代码(整型、读写控制寄存器、混杂、矩阵变换)