SSE2指令--使用SSE2的整型內存操作和初始化:設置(Set)

       SSE2指令使用下面三種數據類型: __m128, __m128i, 和 __m128d ,但是安騰處理器家族( Itanium Processor Family,IPF)處理器並不支持這三種數據類型;

      x64的處理器不支持任何使用 __m64 數據類型的SSE2指令。

     所有的SSE2指令的聲明都在emmintrin.h頭文件中可以找得到。

    1.__m128i _mm_set_epi64 ( __m64 q1, __m64 q0);

     指令名: __m128i _mm_set_epi64 (__m64 q1, __m64 q0);

         說明:使用兩個__m64(64bits)變量來設置__m128i變量

     返回值:如果返回值__m128i,分爲r0,r1,返回值規則如下:                   

              r0 := q0
          r1 := q1
 2. __m128i _mm_set_epi32(int i3, int i2,int i1, int i0);

     指令名:__m128i _mm_set_epi32(int i3, int i2,int i1, int i0);

      說明:使用4個int(32bits)變量來設置__m128i變量

     返回值:如果返回值__m128i,分爲r0,r1,r2,r3返回值規則如下:                   

              r0 := i0         
          r1 := i1
          r2 := i2
          r3 := i3
 3.__m128i _mm_set_epi16(short w7,short w6,short w5,short w4,short w3,
                         short w2,short w1, short w0);
     指令名: __m128i _mm_set_epi16(short w7,short w6,short w5,short w4,
                         short w3,short w2,short w1, short w0);         
       說明:使用8個short(16bits)變量來設置__m128i變量
     返回值:如果返回值__m128i,分爲r0,r1,....,r7返回值規則如下:                   
                  r0 := w0         
           r1 := w1
             ....
           r7 := w7
 4. __m128i _mm_set_epi8(char b15,char b14,char b13,char b12,char b11,char b10,
                         char b9,char b8, char b7,char b6,char b5,char b4,
                         char b3,char b2,char b1,char b0);
     指令名:__m128i _mm_set_epi8(char b15,char b14,char b13,char b12,char b11,
                                char b10,char b9,char b8,char b7,char b6,
                                char b5,char b4,char b3,char b2,char b1,char b0);
         
      說明:使用16個char(8bits)變量來設置__m128i變量
     返回值:如果返回值__m128i,分爲r0,r1,....,r15返回值規則如下:                   
                  r0 := b0         
            r1 := b1
              ....
            r7 := b15
 5. __m128i _mm_set1_epi64 ( __m64 q1, __m64 q);
     指令名: __m128i _mm_set1_epi64 ( __m64 q);
       說明:使用1個__m64(64bits)變量來設置__m128i變量的高低62位值
     返回值:如果返回值__m128i,分爲r0,r1,返回值規則如下:                   
                  r0 := q
            r1 := q
 6. __m128i _mm_set1_epi32(int i);
     與上面5類似,這個指令是使用1個i,來設置__m128i,將__m128i看做4個32位的部分,則每個部分都被賦爲i;
 7. __m128i _mm_set1_epi16(short w);
     與上面5類似,這個指令是使用1個w,來設置__m128i,將__m128i看做8個16位的部分,則每個部分都被賦爲w
 8. __m128i _mm_set1_epi8(char b);
     與上面5類似,這個指令是使用1個b,來設置__m128i,將__m128i看做16個8位的部分,則每個部分都被賦爲b;
 9. __m128i _mm_setr_epi64 ( __m64 q1, __m64 q0);
     指令名: __m128i _mm_setr_epi64 ( __m64 q0, __m64 q1);
      說明:使用兩個__m64(64bits)變量來反序設置__m128i變量
     返回值:如果返回值__m128i,分爲r0,r1,返回值規則如下:                   
              r0 := q0
          r1 := q1
     大家要注意這個和1的差別,在參數中,指令9和1的參數順序正好相反;
10. __m128i _mm_setr_epi32(int i0, int i1,int i2, int i3);
     這個同2相比,也是反序來設置__m128i數值;
11. __m128i _mm_setr_epi16(short w7,short w6,short w5,short w4,short w3,
                           short w2,short w1, short w0);
      這個同3相比,也是反序來設置__m128i數值;
12. __m128i _mm_setr_epi8(char b15,char b14,char b13,char b12,char b11,
                          char b10,char b9,char b8, char b7,char b6,char b5,
                          char b4,char b3,char b2,char b1,char b0);
    這個同4相比,也是反序來設置__m128i數值;
13. __m128i _mm_setzero_si128 ();
    指令名:__m128i _mm_setzero_si128 ();
      說明:__m128i 型數值設置爲0
    返回值:如果__m128i 型看做一個整體的話,則有
           r0=0x0;
    源碼爲:
         __declspec(align(16)) __m128i xx1=_mm_set_epi32(0x01020304,0x05060708,0x090a0b0c,0x0d0e0f00);
        __declspec(align(16)) __m128i xx2=_mm_setr_epi32(0x01020304,0x05060708,0x090a0b0c,0x0d0e0f00);

      圖一:_mm_set_epi32,可以觀察返回值的內部結構(圖中標號1處)和在內存中的排列結構(圖中標號2處)

              

圖一:_mm_setr_epi32,可以觀察返回值的內部結構(圖中標號1處)和在內存中的排列結構(圖中標號2處)

      通過上面兩張圖的對比,我們就可以瞭解這對應的兩個Set的區別了;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章