文档章节

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
粉丝 60
博文 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
如何选择纠删码编码引擎 | 纠删码技术详解(上)

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

七仙女很忙
2017/04/13
0
0
(学习心得):进程,线程,超线程,并发,并行 等概念

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

shayi
2012/11/26
5.5K
28
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

阿里云API网关使用教程

API 网关(API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简...

mcy0425
22分钟前
3
0
解决远程登陆误按ctrl+s锁屏假死恢复

使用putty时,偶尔发生屏幕假死,不能输入等情况。 后来发现,只要数据ctrl+s,就会假死;输入ctrl+q就可以恢复过来。 很多刚从windows转移到linux上来工作的朋友,在用vi/vim编辑文件时,常常...

HJCui
25分钟前
0
0
@Transactional

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于...

asdf08442a
30分钟前
2
0
widows下强制解除8080端口占用问题

使用win+R打开命令窗口 输入以下命令查看哪个任务占用了8080端口 netstat -ano |findstr "8080" 然后通过任务id强制关闭占用该端口的进程 tskill 10044 // 自己的试情况而定,这个ID是LISTE...

_Artisan
39分钟前
2
0
productFlavors简单实用

最近项目中,不同环境需要配置的参数越来越多,为了减少修改代码次数。研究了一下productFlavors的使用方式,总结如下 1. as3.0以上版本使用productFlavors时需要指定一个flavorDimensions,...

火云
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部