• SSE2指令集系列之一浮点运算指令


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

     

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

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


    本小结主要描述双精度浮点运算指令


    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字节.


  • 相关阅读:
    实现LNMP
    iptabes的用法
    实现LAMP
    实现https
    硬盘信息和磁盘分区管理
    awk
    【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)
    【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
    【BZOJ 1216】 1216: [HNOI2003]操作系统 (模拟+优先队列)
    【BZOJ 1528】 1528: [POI2005]sam-Toy Cars (贪心+堆)
  • 原文地址:https://www.cnblogs.com/celerychen/p/3588205.html
Copyright © 2020-2023  润新知