1. 程式人生 > >SSE指令集學習

SSE指令集學習

一、SSE簡介

SSE指令,被包含在標頭檔案:“emmintrin.h”(SSE2)中,且大多數SSE操作需要所給的資料是16-bytes對齊;

SSE(Streaming SIMD Extensions),是一種SIMD(單指令,多資料)指令集,即利用一個指令同時對多個資料進行相同的動作.SSE指令主要包含了四個部分:單精度浮點數運算指令,整數運算指令,快取控制指令和狀態控制指令。

SSE指令新增8個128位的暫存器(XMM0到XMM7),可以用來計算任何基本資料型別的資料,使用之前,需要將資料從記憶體載入到這些暫存器中,且載入的資料高位在前,低位在後。

二,部分指令介紹

下面是一些具體的指令介紹,來自百度文件:

https://wenku.baidu.com/view/33776d1c59eef8c75fbfb310.html。

(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;