• SSE2指令集系列之二整数运算相关指令


    本小节描述的是SSE2整数运算指令。

    5. 数据搬移指令

      movdqa XMM,XMM/m128

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

      movdqu XMM,XMM/m128

            movdqu XMM/m128,XMM
      把源存储器内容值送入目的寄存器,内存地址不必16字节对齐.

      

      movq2dq XMM,MM
      把源寄存器内容送入目的寄存器的低64位,高64位清零.

      movdq2q MM,XMM
      把源寄存器低64位内容送入目的寄存器.

    6. 算数运算指令

                  


         要点:

         1. SSE2的算数运算指令和MMX指令在指令助记符上完全相同。

         2. SSE2的算数运算指令操作的是128位的XMM寄存器,而MMX指令操作的是64位的MM寄存器。

         3. SSE2指令中如涉及存储器变量,需要变量地址按照16字节对齐。

      

    7.  数据打包与数据重排指令


    7.1  packuswb XMM,XMM/m128 

         此指令与前面的MMX指令packuswb MM,MM/m64操作相同,只是变成了128位。
         把目的寄存器按字有符号数压缩为字节无符号数放入目的寄存器低64位
         把源寄存器按字有符号数压缩为字节无符号数放入目的寄存器高64位
         压缩时负数变为00h,大于255的正数变为0ffh,内存变量必须对齐内存16字节.
                                             高64位          |           低64位
            目的寄存器:            a0  |   a1  |  a2  |  a3  |  a4  |  a5  |  a6  |  a7
            源寄存器:              b0  |   b1  |  b2  |  b3  |  b4  |  b5  |  b6  |  b7
            目的寄存器压缩结果:   b0|b1| b2| b3| b4|b5| b6|b7| a0|a1| a2|a3| a4|a5| a6| a7

    7.2   packsswb XMM,XMM/m128

        此指令与前面的MMX指令packsswb MM,MM/m64操作相同,只是变成了128位
        把目的寄存器按字有符号数压缩为字节有符号数放入目的寄存器低64位
        把源寄存器按字有符号数压缩为字节有符号数放入目的寄存器高64位
        压缩时小于-128负数变为80h,大于127的正数变为7fh,内存变量必须对齐内存16字节.
                                             高64位          |           低64位
            目的寄存器:            a0  |   a1  |  a2  |  a3  |  a4  |  a5  |  a6  |  a7
            源寄存器:              b0  |   b1  |  b2  |  b3  |  b4  |  b5  |  b6  |  b7
            目的寄存器压缩结果:   b0|b1| b2| b3| b4|b5| b6|b7| a0|a1| a2|a3| a4|a5| a6| a7


    7.3 packssdw XMM,XMM/m128

        此指令与前面的MMX指令packsswb MM,MM/m64操作相同,只是变成了128位
        把目的寄存器按双字有符号数压缩为字有符号数放入目的寄存器低64位
        把源寄存器按双字有符号数压缩为字有符号数放入目的寄存器高64位
        压缩时小于-32768负数变为8000h,大于32767的正数变为7fffh,内存变量必须对齐内存16字节.

                                         高64位          |           低64位
            目的寄存器:                a0      |      a1     |      a2     |      a3
            源寄存器:                  b0      |      b1     |      b2     |      b3
            目的寄存器压缩结果:    b0  |   b1  |  b2  |  b3  |  a0  |  a1  |  a2  |  a3


    7.4  punpckldq XMM,XMM/m128

          此指令与前面的MMX指令punpckldq MM,MM/m64操作相同,只是变成了128位
            把源存储器与目的寄存器低64位按双字交错排列,内存变量必须对齐内存16字节.
                                             高64位          |           低64位
            目的寄存器:                a0      |      a1     |      a2     |      a3
            源寄存器:                  b0      |      b1     |      b2     |      b3
            目的寄存器排列结果:        b2      |      a2     |      b3     |      a3


    7.5  punpckhdq XMM,XMM/m128

           此指令与前面的MMX指令punpckhdq MM,MM/m64操作相同,只是变成了128位
            把源存储器与目的寄存器高64位按双字交错排列,内存变量必须对齐内存16字节.
                                             高64位          |           低64位
            目的寄存器:                a0      |      a1     |      a2     |      a3
            源寄存器:                  b0      |      b1     |      b2     |      b3
            目的寄存器排列结果:        b0      |      a0     |      b1     |      a1

    7.6   punpcklwd XMM,XMM/m128

                  此指令与前面的MMX指令punpcklwd MM,MM/m64操作相同,只是变成了128位
           把源存储器与目的寄存器低64位按字交错排列,内存变量必须对齐内存16字节.
                                             高64位          |           低64位
            目的寄存器:            a0  |   a1  |  a2  |  a3  |  a4  |  a5  |  a6  |  a7
            源寄存器:              b0  |   b1  |  b2  |  b3  |  b4  |  b5  |  b6  |  b7
            目的寄存器排列结果:    b4  |   a4  |  b5  |  a5  |  b6  |  a6  |  b7  |  a7


    7.7  punpckhwd XMM,XMM/m128

                  此指令与前面的MMX指令punpckhwd MM,MM/m64操作相同,只是变成了128位
           把源存储器与目的寄存器高64位按字交错排列,内存变量必须对齐内存16字节.
                                             高64位          |           低64位
            目的寄存器:            a0  |   a1  |  a2  |  a3  |  a4  |  a5  |  a6  |  a7
            源寄存器:              b0  |   b1  |  b2  |  b3  |  b4  |  b5  |  b6  |  b7
            目的寄存器排列结果:    b0  |   a0  |  b1  |  a1  |  b2  |  a2  |  b3  |  a3


    7.8 punpcklbw XMM,XMM/m128

           此指令与前面的MMX指令punpcklbw MM,MM/m64操作相同,只是变成了128位
            把源存储器与目的寄存器低64位按字节交错排列,内存变量必须对齐内存16字节.
                                             高64位          |           低64位
            目的寄存器:           a0|a1| a2| a3| a4|a5| a6|a7| a8|a9| aA|aB| aC|aD| aE| aF
            源寄存器:             b0|b1| b2| b3| b4|b5| b6|b7| b8|b9| bA|bB| bC|bD| bE| bF
            目的寄存器排列结果:   b8|a8| b9| a9| bA|aA| bB|aB| bC|aC| bD|aD| bE|aE| bF| aF


    7.9 punpckhbw XMM,XMM/m128

           此指令与前面的MMX指令punpckhbw MM,MM/m64操作相同,只是变成了128位
            把源存储器与目的寄存器高64位按字节交错排列,内存变量必须对齐内存16字节.
                                             高64位          |           低64位
            目的寄存器:           a0|a1| a2| a3| a4|a5| a6|a7| a8|a9| aA|aB| aC|aD| aE| aF
            源寄存器:             b0|b1| b2| b3| b4|b5| b6|b7| b8|b9| bA|bB| bC|bD| bE| bF
            目的寄存器排列结果:   b0|a0| b1| a1| b2|a2| b3|a3| b4|a4| b5|a5| b6|a6| b7| a7
            


      要点:

         1. SSE2的数据打包、重排指令和MMX数据打包、重排指令在指令助记符上完全相同。

         2. SSE2的算数运算指令操作的是128位的XMM寄存器,而MMX指令操作的是64位的MM寄存器。

         3. SSE2指令中如涉及存储器变量,需要变量地址按照16字节对齐。

        4. SSE2指令一般如果操作低64位,而MMX指令就会操作低32位。


     

  • 相关阅读:
    博客园cnblogs for win8 托管到GitHub开源
    html5 canvas 画图表
    回文数
    SpringBoot+logback实现按业务输出日志到不同的文件
    Class.forName() 与 ClassLoader.loadClass()的区别
    Easypoi实现单模板生成多页word文档
    普通Java项目中使用Sl4j+Log4j2打印日志
    SpringBoot集成JWT
    Java8_Lambda表达式
    SpringBoot自定义Condition注解
  • 原文地址:https://www.cnblogs.com/celerychen/p/3588227.html
Copyright © 2020-2023  润新知