文档章节

SSE2指令集系列之一

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:45
字数 1379
阅读 107
收藏 0

SSE2与SSE1使用相同寄存器,指令描述约定:

 

MM指64位MMX寄存器
XMM指128XMM寄存器

m32 指32位内存变量
m128指128位内存变量

SSE2主要是双精度浮点运算指令

 1.  数据搬移指令

        movapd XMM,XMM/m128

        movapd XMM/m128,XMM
        

        把源存储器内容值送入目的寄存器,当有m128时,内存变量地址必须16字节对齐.
        
        
movupd XMM,XMM/m128 

        movupd XMM/m128,XMM


        
把源存储器内容值送入目的寄存器,内存变量地址不必对齐16字节.
        
两条指令同SSE1的浮点搬移指令movaps 和 movups 指令类似

        
        
movlpd XMM,m64 

        movlpd m64,XMM
    

       把源存储器64位内容送入目的寄存器低64位,高64位不变,内存变量地址不必对齐16字节.
        
        
movhpd XMM,m64 

        movhpd m64,XMM


       
 把源存储器64位内容送入目的寄存器高64位,低64位不变,内存变量地址不必对齐16字节.

 

2.    浮点常用算数运算指令

 

        addpd XMM,XMM/m128        

        addsd XMM,XMM/m128

          

        subpd XMM,XMM/m128     

        subsd XMM,XMM/m128
 

         

        mulpd XMM,XMM/m128          

        mulsd XMM,XMM/m128    

 

        divpd XMM,XMM/m128        
        divsd XMM,XMM/m128
 
        
        sqrtpd XMM,XMM/m128       
        sqrtsd XMM,XMM/m128
 
        
        maxpd XMM,XMM/m128
     
        maxsd XMM,XMM/m128
   
        
        minpd XMM,XMM/m128

        minsd XMM,XMM/m128

 小结: 

      1. 以pd结尾的指令对两个双精度浮点数执行相同的运算

      2. 以sd结尾的指令只对低64位双精度执行运算,高64位保持不变。

      3. 当有m128存储器是要求内存地址必须为16字节对齐。

 

 3. 位运算指令

   

  andpd XMM,XMM/m128
  源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界.

  andnpd XMM,XMM/m128
  目的寄存器128个二进制位先取'非',再'与'源存储器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界

  orpd XMM,XMM/m128
  源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界

  xorpd XMM,XMM/m128
  源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界

 

4. 数据类型转换指令

     4.1 32位浮点与64位浮点之间的转换

        cvtps2pd XMM,XMM/m64

        把源存储器低64位两个单精度浮点数变成两个双精度浮点数,结果送入目的寄存器.

        

        cvtss2sd XMM,XMM/m32

        把源存储器低32位1个单精度浮点数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.

        

        cvtpd2ps XMM,XMM/m128

        把源存储器两个双精度浮点数变成两个单精度浮点数,结果送入目的寄存器的低64位,高64位清零,

 

        cvtsd2ss XMM,XMM/m64

        把源存储器低64位1个双精度浮点数变成1个单精度浮点数,结果送入目的寄存器的低32位,高96位不变.

     4.2  浮点数与32位整数之间的转换

      4.2.1 双精度与整数之间转换

        cvtpd2pi MM,XMM/m128

        把源存储器两个双精度浮点数变成两个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节.

        如果结果大于所能表示的范围,那么转化为80000000h(正数也转为此值).

        当XMM1 = 0x 0dd1a5e1f35aec736   41132a4000000000,执行cvtpd2pi MM0,XMM1

        则 MM0 = 0x 80000000 0004ca90

        因为0dd1a5e1f35aec736h(双精度浮点数) = -3.14E140 超过 80000000h所以变为80000000h

        而41132a4000000000h(双精度浮点数) = 3.14E5,所以转为314000 = 0004ca90h(有符号整数)

       

    cvtpi2pd XMM,MM/m64

        把源存储器两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存器.

 

        cvtpd2dq XMM,XMM/m128

        把源存储器两个双精度浮点数变成两个双字有符号整数

        结果送入目的寄存器的低64位,高64位清零,内存变量必须对齐内存16字节.

        此运算与cvtpd2pi类似但目的寄存器变为XMM.

        

        cvtdq2pd XMM,XMM/m128

        把源存储器低64位两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节.

 

     cvtsd2si r32,XMM/m64

         把源存储器低64位1个双精度浮点数变成1个双字有符号整数,结果送入目的寄存器.

         此指令目的寄存器是32位通用寄存器

 

   cvtsi2sd XMM,r32/m32

        把源存储器1个双字有符号整数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.

 

 4.2.2 单精度浮点与整数之间转换

 

        cvtps2dq XMM,XMM/m128

        把源存储器4个单精度浮点数变成4个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节.

        

        cvtdq2ps XMM,XMM/m128

        把源存储器4个双字有符号整数变成4个单精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节.

 

 

小结:1. SSE1浮点指令一般以后缀ps,ss结尾。

         2. SSE2浮点指令一般以后缀pd,sd结尾。

      

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

共有 人打赏支持
abcijkxyz
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
私信 提问
微软提前结束部分 Windows 7 电脑的更新功能

前不久,微软悄然关掉了官方论坛Windows 7分版的支持,也就是不再有工作人员上线收集和回应坛友的反馈。在距离2020年1月结束Windows 7外延支持越来越近、Windows 10升级推广压力很大的情况下...

达尔文
2018/06/25
1K
17
cpu指令集包括哪些?

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

音乐&编程
2012/09/14
2.1K
3
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 45nm制程处理器上的SSE4指令集简介

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

日久不生情
2017/11/07
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

没有更多内容

加载失败,请刷新页面

加载更多

腾讯面试:一条SQL语句执行得很慢的原因有哪些?

说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。 之前腾讯面试的实...

java菜分享
31分钟前
9
0
Java 基本功 之 CAS

本文首发于个人公众号《andyqian》, 期待你的关注! 前言 在Java并发编程中,我们经常使用锁对竞争资源予以并发控制,以解决资源竞争的问题。但无论是使用 Lock 还是 Synchronized,随着锁机...

andyqian
35分钟前
4
0
信号量与条件变量的区别

注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注进程间通信; 而条件变量、互...

shzwork
46分钟前
1
0
在VirtualBox 6.0中安装fedora 30

操作系统安装完毕后首先进行更新。 sudo dnf update 重启虚拟机后,安装VirtualBox依赖的软件包。 sudo dnf install kernel-headers kernel-devel dkms gcc 最后,安装“增强功能”。...

gugudu
54分钟前
1
0
861. Score After Flipping Matrix

为了获得最大值,我们必须保证每一行列下标小的1尽可能的多(最高位的1尽可能多)。 首先,考虑我们可以进行的操作有 翻转列,进行列操作 翻转行,进行行操作 通过行操作 我们总是可以使得第...

reter
55分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部