zoukankan      html  css  js  c++  java
  • 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位。


     

  • 相关阅读:
    PAT 1097. Deduplication on a Linked List (链表)
    PAT 1096. Consecutive Factors
    PAT 1095. Cars on Campus
    PAT 1094. The Largest Generation (层级遍历)
    PAT 1093. Count PAT's
    PAT 1092. To Buy or Not to Buy
    PAT 1091. Acute Stroke (bfs)
    CSS:word-wrap/overflow/transition
    node-webkit中的requirejs报错问题:path must be a string error in Require.js
    script加载之defer和async
  • 原文地址:https://www.cnblogs.com/celerychen/p/3588227.html
Copyright © 2011-2022 走看看