文档章节

SSE特殊指令集系列之一

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:46
字数 1078
阅读 9
收藏 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
粉丝 64
博文 6196
码字总数 1876
作品 0
深圳
项目经理
AMD发布Stream SDK v2.0 Beta开发工具

AMD最近发布了ATI Stream SDK v2.0开发工具包的最新Beta版本Stream SDK v2.0 Beta,这个版本将全面兼容OpenCL1.0编程接口界面,更令人欣喜的是,需要的用户可以自由免费地下载该开发工具包,...

红薯
2009/10/14
2.4K
0
Intel 45nm制程处理器上的SSE4指令集简介

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

日久不生情
2017/11/07
0
0
Flat Assembler 1.70 发布,汇编工具

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

红薯
2012/04/19
1K
10
(学习心得):进程,线程,超线程,并发,并行 等概念

前言: 此陋文来自最近对阅读《深入理解计算机系统》与《微型计算机体系结构:Intel Core Duo / i 系列微处理器技术应用》两本书的学习体会, 前者从 程序员的视角来探讨计算机系统中各部件的...

shayi
2012/11/26
5.5K
28
cpu指令集包括哪些?

如题!我知道有mmx,sse等等.可是mmx指令集是在96年才有的, 而之前386,486,586等那些呢,包含哪些指令,相关资料在哪下载? 是不是sse1包含mmx,,,,,,,sse2包含sse1,,,,,,,sse3包含sse2 我知道去英...

音乐&编程
2012/09/14
2.1K
3

没有更多内容

加载失败,请刷新页面

加载更多

arcgis jsapi接口入门系列:总览

开发环境: arcgis jsapi版本4.9 由于我们这套代码是基于vue,webpack开发的,会有少数vue代码,但总体不影响 里面还有些我们公司的js库和html css,给出的代码不能百分百直接运行,主要还是...

canneljls
17分钟前
1
0
月薪80k阿里架构师漫谈他是如何从一名小码农走到架构师的

01 刚当程序员时,我是属于那种勤勤恳恳类型的员工,工作态度用认真来形容不为过,每天我几乎是团队里最早到公司,又最晚下班的一个。而组员张工一般情况下都是准时上下班的,即使项目进度比...

Java填坑之路
19分钟前
1
0
oracle的resetlogs机制浅析

oracle的resetlogs机制浅析 alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用? 它的原理机制是什么?他都起哪些作用? 我...

突突突酱
20分钟前
1
0
JAVA 获取两个日期间的所有日期

public static List<String> getDates(String startDate, String endDate){ List<String> dates = new ArrayList<>(); try { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Dat......

尘叙缘
27分钟前
2
0
Innodb中的事务隔离级别和锁的关系

#一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。...

Skqing
41分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部