SSE Shuffle and Unpack Instructions

SSE的混洗指令与解组合指令混洗shuffle或交错interleave单精度浮点操作数,并将结果保存到目标操作数。

指令

描述

SHUFPS

格式:xmm1, xmm3/m128, imm8

按照imm8的指示,从xmm1与xmm2/m128中选取单精度浮点数据元素,把选取结果保存到xmm1。源操作数与目的操作数可以是同一个寄存器。

指令操作:

  1. 定义一个选择函数Select4()

Select4(SRC, control) {
CASE (control[1:0]) OF
    0: TMP ßSRC[31:0];
    1: TMP ßSRC[63:32];
    2: TMP ßSRC[95:64];
    3: TMP ßSRC[127:96];
ESAC;
RETURN TMP
}

  1. SHFPS的操作

imm8的第0~1两个比特位决定选取源操作数的第几个数据元素并放置到目标操作数的第1个数据元素位置;第2~3两个比特位决定选取源操作数的第几个数据元素并放置到第2个数据元素位置,以此类推,一直枚举完imm8的最高第6~7比特位。参看下面的操作伪代码。这个操作相当于按imm8的指示,重新洗牌了源操作数中的数据元素顺序,结果保存在目标操作数中。

DEST[31:0] ßSelect4(SRC1[127:0], imm8[1:0]);
DEST[63:32] ßSelect4(SRC1[127:0], imm8[3:2]);
DEST[95:64] ßSelect4(SRC2[127:0], imm8[5:4]);
DEST[127:96] ßSelect4(SRC2[127:0], imm8[7:6]);

Intel C/C++ Compiler Intrinsic Equivalent
SHUFPS __m128 _mm_shuffle_ps (__m128 a, __m128 b, const int select);

UNPCKHPS

格式:UNPCKHPS xmm1, xmm2/m128

从xmm1与xmm2/m128中选取高两个单精度浮点数据元素,放置到目标寄存器xmm1中。

指令操作:

DEST[31:0] ßSRC1[95:64](xmm1第三个数据元素)
DEST[63:32] ßSRC2[95:64](xmm2第三个数据元素)
DEST[95:64] ßSRC1[127:96](xmm1第四个数据元素)
DEST[127:96] ßSRC2[127:96](xmm2第四个数据元素)

UNPCKLPS

格式:UNPCKLPS xmm1, xmm2/m128

从xmm1与xmm2/m128中选取低两个单精度浮点数据元素,放置到目标寄存器xmm1中。

指令操作:

DEST[31:0] ßSRC1[31:0] (xmm1的第一个数据元素)
DEST[63:32] ßSRC2[31:0] (xmm2的第一个数据元素)
DEST[95:64] ßSRC1[63:32] (xmm1的第二个数据元素)
DEST[127:96] ßSRC2[63:32] (xmm2的第二个数据元素)

Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(7) - 混洗指令 解组合指令相关推荐

  1. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(4) - 数据传输指令

    SSE Instruction Set SSE指令集大致可以分为4个功能组: 组合的与标量的单精度浮点指令 数据传输指令 算术指令 逻辑指令 比较指令 混洗shuffle指令 转换指令 64位SIMD ...

  2. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(12) - 预取指令与SFENCE指令

    PREFETCHn Instructions PREFETCHn指令使得程序可以提前让处理器预先即将访问的数据读入到指定的某级缓存中,这样当程序真正需要这些数据时,可以直接命中缓存.这些指令按照制定了 ...

  3. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(1) - 概述/历史/新数据类型/XMM寄存器组

    SSE Instructions SSE Overview & History Intel SSE技术的全称是Streaming SIMD Extension,中文译作流式单指令多数据指令扩展 ...

  4. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(9) - 64位整型指令(MMX指令集扩展)

    SSE 64-Bit SIMD Integer Instructions SSE扩展增加了几条64位组合的整型指令,这些指令操作MMX寄存器和64位的存储器操作数,这些指令可以看作是对MMX指令集的扩 ...

  5. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(2) - SSE程序设计环境概述

    SSE Programming Environment 下图是IA-32处理器上的SSE程序设计环境,所有的SSE指令操作XMM寄存器,MMX寄存器,和/或存储器. XMM寄存器,8个,128位宽,存 ...

  6. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(13/E) - FXSAVE/FXRSTOR指令

    FXSAVE and FXRSTOR instructions FXSAVE与FXRSTOR指令是从Pentium II处理器引入到IA-32架构上的,早于SSE指令集的引入.这两条指令的最初版本是用 ...

  7. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(6) - 逻辑指令 比较指令

    SSE Logical Instructions SSE的逻辑指令执行与,或,非,以及与非操作.操作数是组合的单精度浮点数. 指令 描述 ANDPS 格式:xmm1, xmm2/m128 对操作数执行 ...

  8. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(3) - MXCSR寄存器详解

    MXCSR Control and Status Register 32位宽的MXCSR寄存器(参看下图)包含了控制与状态标志位,适用于SSE,SSE2和SSE3 SIMD浮点操作.这些标志位包括: ...

  9. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(11) - 数据可缓存性控制指令

    Cacheability Control Instructions 下面的3条指令允许使用"非时效存储提示non-tempral hint"将MMX/XMM寄存器中的数据写入到存储 ...

最新文章

  1. 隔板都被拉去做核酸了?
  2. linux下ntp服务器搭建方法
  3. Gamma校正及其OpenCV实现
  4. PCL:描述三维离散点的ROPS特征(Code)
  5. mysql --explicit_【MySQL】 explicit_defaults_for_timestamp 参数解析
  6. [渝粤教育] 西北大学 仪器分析 参考 资料
  7. Leetcode--全排列(Java)
  8. 生成word_Word如何生成目录?3个步骤轻松掌握!
  9. go给Linux安装mysql_Linux安装MySQL-Go语言中文社区
  10. 使用python制作ArcGIS插件(1)工具介绍
  11. Android8.0 HIDL绑定式和直通式区别
  12. java lc ctype_postgresql中的 LC_CTYPE、LC_COLLATE
  13. Unity3D的音效相关介绍
  14. winrar软件如何测试
  15. 基于机器学习的回归拟合、详细总结
  16. (5)完整的Django框架学习之自定义过滤器及标签
  17. android 蓝牙sco开发
  18. 学什么技术专业最有前途?
  19. Windows 7安装ArcGIS DeskTop10:错误1935,处理办法
  20. CDMA版iPhone 4广东通话乐成 批量烧号不可行

热门文章

  1. Linux解压bz2格式文件
  2. 从零开始学Pytorch(十五)之数据增强
  3. python post与get的区别_Python Requests库 Get和Post的区别和Http常见状态码
  4. 风华高科厚膜贴片电阻规格书_1206 0.25R取样贴片电阻规格主要参数详解
  5. Spark入门实战系列--4.Spark运行架构
  6. fetch请求报错:
  7. 计算机无法启动windows无线服务,win10无线服务无法启动怎么解决
  8. 组合模式_Java设计模式-组合模式
  9. java 图片有损压缩_java - 用有损jpeg压缩多页tiff图像 - 堆栈内存溢出
  10. Lua mysql insert 并发数_高并发 Nginx+Lua OpenResty系列(6)——Lua开发库Mysql