0、变量类型
01. __m128i(以下内容来源于 此处)
// data_types__m128i.cpp
#include <emmintrin.h>
int main() {
__m128i x;
}
SSE2中的指令集指令,定义在 emmintrin.h 中。__m128i 类型变量映射到XMM[0-7]寄存器,它的地址会自动对齐到16字节的边界, 即__m128i类型的变量的起始地址总是16的整数倍。
1、函数接口
01. _mm_load_si128
__m128i _mm_load_si128 (__m128i *p);
加载128位值。返回加载在代表寄存器的变量中的值,地址p必须为16字节对齐。
02. _mm_loadu_si128
__m128i _mm_loadu_si128 (__m128i *p);
加载128位值。返回值代表寄存器的变量中的相同值,地址p不需要16字节对齐。
03. _mm_set_epi8
__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个带符号的8位整数值。
03. _mm_setr_epi8
__m128i _mm_setr_epi8 (char b0, char b1, char b2, char b3, char b4, char b5, char b6, char b7, char b8, char b9, char b10, char b11, char b12, char b13, char b14, char b15);
以相反的顺序设置16个带符号的8位整数值。
04. _mm_shuffle_epi8
__m128i __mm_shuffle_epi8(
__m128i a,
__m128i mask
);
该指令将128位参数中的16字节参数改写。
头文件:tmmintrin.h
示例:
#include <stdio.h>
#include <tmmintrin.h>
int main ()
{
__m128i a = _mm_setr_epi8(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
__m128i mask =
_mm_set_epi8(5, -1, -1, 4, -1, -1, 3, -1, -1, 2, -1, -1, 1, -1, -1, 0);
__m128i p = _mm_shuffle_epi8(a, mask);
int8_t *res = (int8_t *) &p;
printf("Result res:\t%2d\t%2d\t%2d\t%2d\n\t\t\t%2d\t%2d\t%2d\t%2d\n",
res[0], res[1], res[2],
res[3], res[4], res[5],
res[6], res[7]);
printf("\t\t\t%2d\t%2d\t%2d\t%2d\n\t\t\t%2d\t%2d\t%2d\t%2d\n",
res[8], res[9], res[10],
res[11], res[12], res[13],
res[14], res[15]);
return 0;
}
打印结果:
Result res: 10 0 0 11
0 0 12 0
0 13 0 0
14 0 0 15
05. _mm_or_si128
__m128i _mm_and_si128 ( __m128i a, __m128i b);
将a中128 bits数值与b中的128bits数值对应位按位做"或(OR)"运算。
06. _mm_storeu_si128
void _mm_storeu_si128 (__m128i *p, __m128i a);
地址p不需要16字节对齐。
头文件: emmintrin.h