SSE指令集學習
一、SSE簡介
SSE指令,被包含在標頭檔案:“emmintrin.h”(SSE2)中,且大多數SSE操作需要所給的資料是16-bytes對齊;
SSE(Streaming SIMD Extensions),是一種SIMD(單指令,多資料)指令集,即利用一個指令同時對多個資料進行相同的動作.SSE指令主要包含了四個部分:單精度浮點數運算指令,整數運算指令,快取控制指令和狀態控制指令。
SSE指令新增8個128位的暫存器(XMM0到XMM7),可以用來計算任何基本資料型別的資料,使用之前,需要將資料從記憶體載入到這些暫存器中,且載入的資料高位在前,低位在後。
二,部分指令介紹
下面是一些具體的指令介紹,來自百度文件:
(1)_mm_setzero_si128():將128位值都賦值為0;
(2)_mm_load_si128(_m128i * p):返回一個_m128i的暫存器,將p指向的資料讀到暫存器中,p一般是通過型別轉換得到的;
(3)_mm_unpacklo_epi8(_m128i S0,_m128i S1):將S0和S1的低64位數以8位為單位進行交錯;
例如:
S0:A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
S1:B15 B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0
_mm_unpacklo_epi8(S0,S1):B7 A7 B6 A6 B5 A5 B4 A4 B3 A3 B2 A2 B1 A1 B0 A0
(4)_mm_unpackhi_epi8():返回一個_m128i的暫存器,將S0和S1的高64位的數以8位為單位進行交錯;
與(3)類似,只不過是高位交錯;
(5)_mm_sub_epi16(_m128i S0,_m128i S1):將S0和S1中對應位置的16bit整數分別相減;
例如:
S0:A7 A6 A5 A4 A3 A2 A1 A0
S1:B7 B6 B5 B4 B3 B2 B1 B0
_mm_sub_epi16(S0,S1):( A7-B7)(A6-B6)(A5-B5)(A4-B4)(A3-B3)(A2-B2)(A1-B1)(A0-B0)
(6)_mm_mullo_epi16(_m128i S0,_m128i S1):返回一個_m128i的暫存器,它含有8個16位的整數,分別為S0和S1對應位置的16位的整數相乘結果的低16位資料;
(7)_mm_srai_epi16(_m128i S0,int count):返回一個_m128i的暫存器,將暫存器S0中的8個16位整數按照計數進行算術右移;
(8)_mm_packs_epi16(_m128i S0,_m128i S1):將S0和S1中共16個16位數,放入存8位數的數組裡,並進行飽和處理;
(9)_mm_add_epi8(_m128i S0,_m128i S1):返回一個_m128i的暫存器,將S0和S1中對應位置的8bit整數分別相加;
(10)_mm_stream_si128(_m128i * p,_m128i S0):將儲存在快取器S0中的資料存在指標p指向的地址;
(11)_mm_set1_epi32(int32_t i):將_m128i看做4個32位,則每個部分都被賦為i;