SSE指令集學習

一、SSE簡介

SSE指令,被包含在頭文件:“emmintrin.h”(SSE2)中;

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):返回一個_m128i的寄存器,將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):使用1個我來設置_m128i,將_m128i看做4個32位,則每個部分都被賦爲i;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章