文档章节

SSE特殊指令集系列之一

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:46
字数 1078
阅读 10
收藏 0

实际上,搞汇编优化的很多时间是在处理如何有效的组织数据,以适应并行计算指令的数据结构。

本小结描述的是数据混洗指令,这类指令使用起来相当的灵活。具体如下:

 

   1.  shufps  XMM,XMM/m128,imm8(0~255)

       描述:

           从指令后缀来看,这是一条SSE1指令。

           该指令把源存储器与目的寄存器按双字32位划分, 由立即数imm8八个二进制位(00~11,00^11,00~11,00~11)指定排列,

           目的寄存器高64位放源存储器被指定数,目的寄存器低64位放目的寄存器被指定数。内存变量地址必须对齐16字节

           imm8的高4位选的是源存储器,低4位选的是目的寄存器。

                      高64位 | 低64位

        目的寄存器:         a(11) | a(10) | a(01) | a(00)
        源寄存器:          b(11) | b(10) | b(01) | b(00)
        目的寄存器排列结果:       b(00~11) | b(00~11) | a(00~11) | a(00~11)
        目的寄存器压缩结果中的值由imm8对应的两位二进制位指定.

      例:
         ( 11 ) ( 10 ) ( 01 ) ( 00 ) ( 11 ) ( 10 ) ( 01 ) ( 00 )
      当    XMM0 = 0x 090a0b0c 0d0e0f11 01020304 05060708,

                        XMM1 = 0x 0aabbccdd eeff1234 22334455 66778899,

              mm8  ══> (XMM1 10) (XMM1 01) (XMM0 11) (XMM0 00)

         执行shufps XMM0,XMM1,10 01 11 00 b(二进制),

                         则XMM0 = 0x 0eeff1234 22334455 090a0b0c 05060708

                  

         假如,shufps XMM0,XMM1,10 10 10 10 b,那么结果为:    XMM0 = 0x 0eeff1234 eeff1234 0d0e0f11 0d0e0f11

 

                      该指令一个常用用法如下:

                      float f = 0.5f;

        __asm

        {

                      movss   xmm2, f                         // xmm2[0] = 2.8
                      shufps  xmm2, xmm2, 0                   // xmm2[1, 2, 3] = xmm2[0]

        .....

        }

                       

 2.   shufpd XMM,XMM/m128,imm8(0~255) 

        描述:

         从指令后缀来看,这是一条SSE2指令。

         imm8(操作值) = imm8(输入值) mod 4

   把源存储器与目的寄存器按四字64位划分,由imm8(立即数)4个二进制位(0~1,0~1,0~1,0~1)指定排列,
   内存变量地址必须对齐16字节.目的寄存器高64位放源存储器被指定数,目的寄存器低64位放目的寄存器被指定数.
                    高64位 | 低64位
       目的寄存器:          a(1) | a(0)
       源寄存器:           b(1) | b(0)
       目的寄存器排列结果:      b(0~1) | a(0~1)
    例:
      当    XMM0 = 0x 1111111122222222 3333333344444444
         XMM1 = 0x 5555555566666666 aaaaaaaacccccccc,

                   执行 shufpd XMM0,XMM1,101001 1 0 b

        因为 101001 1 0 b mod 4 (101001 1 0 b & 11b), 得到操作值为1 0b,  

        高位 1 选择源寄存器 XMM1 的第1位  5555555566666666,

                   低位 0 选择目的寄存器XMM0的第0位   3333333344444444.


         则 XMM0 = 5555555566666666 3333333344444444 h
      

 3.  pshuflw XMM,XMM/m128,imm8(0~255)

      描述:  

  先把源存储器的高64位内容送入目的寄存器的高64位,然后用imm8将源存储器的低64位4个字选入
  目的寄存器的低64位,内存变量必须对齐内存16字节.

                            低64位
      源寄存器低64位:          b(11) | b(10) | b(01) | b(00)
      目的寄存器低64位排列结果:   b(00~11) | b(00~11) | b(00~11) | b(00~11)

  例:
  当 XMM0 = 0x 1111111122222222 3333 4444 5555 6666
    XMM1 = 0x 5555555566666666 7777 8888 9999 cccc ,

    执行 pshuflw XMM0,XMM1,10 10 01 10 b
  则  XMM0 = 0x 5555555566666666 8888 8888 9999 8888

 

4.  pshufhw XMM,XMM/m128,imm8(0~255)

  描述:

      先把源存储器的低64位内容送入目的寄存器的低64位,然后用imm8将源存储器的高64位4个字选入
  目的寄存器的高64位,内存变量必须对齐内存16字节.
                      高64位
  源寄存器高64位:           b(11) | b(10) | b(01) | b(00)
  目的寄存器高64位排列结果:  b(00~11) | b(00~11) | b(00~11) | b(00~11)
  例:
  当 XMM0 = 0x 3333 4444 5555 6666 1111111122222222
      XMM1 = 0x 7777 8888 9999 cccc 5555555566666666,

     执行 pshufhw XMM0,XMM1,10 10 01 10 b
  则  XMM0 = 0x 8888 8888 9999 8888 5555555566666666

5.  pshufd XMM,XMM/m128,imm8(0~255)

  描述:

  将源存储器的4个双字由imm8指定选入目的寄存器,内存变量必须对齐内存16字节.
                高64位 | 低64位
  源寄存器:          (11) | b(10) | b(01) | b(00)
  目的寄存器排列结果: b(00~11) | b(00~11) | b(00~11) | b(00~11)
  例:
  当 XMM1 = 0x 11111111 22222222 33333333 44444444,

     执行 pshufd XMM0,XMM1,11 01 01 10b
  则 XMM0 = 0x 11111111 33333333 33333333 22222222

 

 小结:

    1. SHUFPS和SHUFPD指令运算的结果与源寄存器和目的寄存器有关

      2.  pshuflw、pshufhw、pshufd这3条指令运算的结果与目的寄存器没有关系。

 

 

 

 

本文转载自:http://www.cnblogs.com/celerychen/archive/2013/03/28/2987188.html

共有 人打赏支持
abcijkxyz
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
私信 提问
Intel 45nm制程处理器上的SSE4指令集简介

Intel 45nm制程处理器上的SSE4指令集简介 Intel的SSE(Streaming SIMD Extensions, 流式单指令多数据扩展)技术有效增强了CPU的向量运算能力。支持该指令集的处理器有8个128位xmm寄存器,每一...

日久不生情
2017/11/07
0
0
如何选择纠删码编码引擎 | 纠删码技术详解(上)

作者介绍: 徐祥曦,七牛云工程师,独立开发了多套高性能纠删码/再生码编码引擎。 柳青,华中科技大学博士,研究方向为基于纠删码的分布式存储系统。 前言: 随着数据的存储呈现出集中化(以...

七仙女很忙
2017/04/13
0
0
Flat Assembler

Flat Assembler 是一个快速高效的80x86的汇编工具,支持DOS、Windows、Linux操作系统,支持包括 8086-80486/Pentium instructions with MMX, SSE, SSE2, SSE3, and 3DNow! extensions and x......

匿名
2008/11/16
2.8K
0
/proc/cpuinfo文件分析(查看CPU信息)

  在Linux系统中,提供了proc文件系统显示系统的软硬件信息。如果想了解系统中CPU的提供商和相关配置信息,则可以通过/proc/cpuinfo文件得到。本文章针对该文件进行简单的总结。   基于不...

zhiqiangw
2016/11/18
33
0
Intel Software Development Emulator

Intel Software Development Emulator 是一款模拟Intel未来扩展指令集功能的仿真器。仿真器是基于Pin动态二进制仪器系统(和XED)。 它可以模拟在SSE4, AES,PCLMULQDQ中新的指令集功能和RTM...

叶秀兰
2013/12/08
209
0

没有更多内容

加载失败,请刷新页面

加载更多

postgres预写式日志的内核实现详解-heap2类型

导读: postgres预写式日志的内核实现详解-概述 postgres预写式日志的内核实现详解-wal记录结构 postgres预写式日志的内核实现详解-wal记录写入 postgres预写式日志的内核实现详解-wal记录读...

movead
23分钟前
0
0
ToolBar控件在C#开发APP中的使用方式【附案例源码】——Smobiler移动开发平台

控件说明 底部工具栏控件。 效果演示 其他效果 该界面为仿淘宝UI制作的一个简单的UI模板,源码获取方式请拉至文章末尾。 特色属性 属性 属性说明 Direction(相对布局) 容器主轴方向。 Flex...

amanda112
34分钟前
1
0
模块

AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等...

gtandsn
40分钟前
1
0
代码之外的生存指南,这6本书助你提升软实力

上期盟主向大家推荐了6本技术类书籍,引起了热烈反响。那么,工作之余,还有哪些好书能够为你打开更多的精彩世界呢?本期,多位知名企业的技术大咖将继续为您带来好书推荐,在新的一年里,为...

安卓绿色联盟
43分钟前
4
0
5分钟用Jitpack发布开源库

作者: 菜刀文 Demo:https://github.com/helen-x/JitPackReleaseDemo 项目开发中会用到很多开源库, 他们一般通过Maven/Gradle依赖进来的. 演而优则唱,开发越来越溜以后, 你是否也蠢蠢欲动,想发...

SuShine
49分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部