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;

 

猜你喜欢

转载自blog.csdn.net/sinat_41612591/article/details/84869971
今日推荐