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

          

  • 相关阅读:
    接口测试总结
    在 github 上获取源码
    推荐一个css帮助手册的版本 同时提供chm和在线
    由csdn开源项目评选中闹出刷票问题想到投票程序的设计
    由一个园友因为上传漏洞导致网站被攻破而得到的教训
    让 SVN (TortoiseSVN)提交时忽略bin和obj目录
    未能进入中断模式,原因如下:源文件“XXXXXX”不属于正在调试的项目。
    未能加载文件或程序集“XXXXX”或它的某一个依赖项。试图加载格式不正确的程序。
    .Net AppDomain.CurrentDomain.AppendPrivatePath(@"Libs");
    C# Remoting的一个简单例子
  • 原文地址:https://www.cnblogs.com/celerychen/p/2986264.html
Copyright © 2020-2023  润新知