zoukankan      html  css  js  c++  java
  • SSE2指令集系列之一

    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结尾。

          

  • 相关阅读:
    我的WCF之旅(7):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承(转载)
    我的WCF之旅(4):WCF中的序列化(Serialization) Part I(转载)
    我的WCF之旅(1):创建一个简单的WCF程序(转载)
    我的WCF之旅(3):在WCF中实现双向通信(Bidirectional Communication)(转载)
    我的WCF之旅(2):Endpoint Overview(转载)
    C#中Attribute特性的用法(转载)
    我的WCF之旅(5):Service Contract中的重载(Overloading)(转载)
    我的WCF之旅(6):在Winform Application中调用Duplex Service出现TimeoutException的原因和解决方案(转载)
    [转] 81条经典话语~~~当裤子失去皮带,才懂得什麽叫做依赖
    HP大中华区总裁孙振耀退休十五天后九大感言,快毕业或者已经毕业的都来看看,与其浑浑噩噩一辈子,不如花这半小时看看
  • 原文地址:https://www.cnblogs.com/celerychen/p/2986264.html
Copyright © 2011-2022 走看看