SSE2指令使用下面三种数据类型: __m128, __m128i, 和 __m128d ,但是安腾处理器家族( Itanium Processor Family,IPF)处理器并不支持这三种数据类型;
x64的处理器不支持任何使用 __m64 数据类型的SSE2指令。
所有的SSE2指令的声明都在emmintrin.h头文件中可以找得到。
1.__m128i _mm_set_epi64 ( __m64 q1, __m64 q0);
指令名: __m128i _mm_set_epi64 (__m64 q1, __m64 q0);
说明:使用两个__m64(64bits)变量来设置__m128i变量;
返回值:如果返回值__m128i,分为r0,r1,返回值规则如下:
r0 := q0
r1 := q1
2. __m128i _mm_set_epi32(int i3, int i2,int i1, int i0);指令名:__m128i _mm_set_epi32(int i3, int i2,int i1, int i0);
说明:使用4个int(32bits)变量来设置__m128i变量;
返回值:如果返回值__m128i,分为r0,r1,r2,r3返回值规则如下:
r0 := i0r1 := i1r2 := i2r3 := i33.__m128i _mm_set_epi16(short w7,short w6,short w5,short w4,short w3,short w2,short w1, short w0);指令名: __m128i _mm_set_epi16(short w7,short w6,short w5,short w4,short w3,short w2,short w1, short w0);说明:使用8个short(16bits)变量来设置__m128i变量;返回值:如果返回值__m128i,分为r0,r1,....,r7返回值规则如下:r0 := w0r1 := w1....r7 := w74. __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);指令名:__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个char(8bits)变量来设置__m128i变量;返回值:如果返回值__m128i,分为r0,r1,....,r15返回值规则如下:r0 := b0r1 := b1....r7 := b155. __m128i _mm_set1_epi64 ( __m64 q1, __m64 q);指令名: __m128i _mm_set1_epi64 ( __m64 q);说明:使用1个__m64(64bits)变量来设置__m128i变量的高低62位值;返回值:如果返回值__m128i,分为r0,r1,返回值规则如下:r0 := q r1 := q6. __m128i _mm_set1_epi32(int i);与上面5类似,这个指令是使用1个i,来设置__m128i,将__m128i看做4个32位的部分,则每个部分都被赋为i;7. __m128i _mm_set1_epi16(short w);与上面5类似,这个指令是使用1个w,来设置__m128i,将__m128i看做8个16位的部分,则每个部分都被赋为w8. __m128i _mm_set1_epi8(char b);与上面5类似,这个指令是使用1个b,来设置__m128i,将__m128i看做16个8位的部分,则每个部分都被赋为b;9. __m128i _mm_setr_epi64 ( __m64 q1, __m64 q0);指令名: __m128i _mm_setr_epi64 ( __m64 q0, __m64 q1);说明:使用两个__m64(64bits)变量来反序设置__m128i变量;返回值:如果返回值__m128i,分为r0,r1,返回值规则如下:r0 := q0 r1 := q1大家要注意这个和1的差别,在参数中,指令9和1的参数顺序正好相反;10. __m128i _mm_setr_epi32(int i0, int i1,int i2, int i3);这个同2相比,也是反序来设置__m128i数值;11. __m128i _mm_setr_epi16(short w7,short w6,short w5,short w4,short w3,short w2,short w1, short w0);这个同3相比,也是反序来设置__m128i数值;12. __m128i _mm_setr_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);这个同4相比,也是反序来设置__m128i数值;13. __m128i _mm_setzero_si128 ();指令名:__m128i _mm_setzero_si128 ();说明:将__m128i 型数值设置为0返回值:如果__m128i 型看做一个整体的话,则有r0=0x0;下面是我使用_mm_set_epi32和_mm_setr_epi32来做设置时的比较:源码为:__declspec(align(16)) __m128i xx1=_mm_set_epi32(0x01020304,0x05060708,0x090a0b0c,0x0d0e0f00); __declspec(align(16)) __m128i xx2=_mm_setr_epi32(0x01020304,0x05060708,0x090a0b0c,0x0d0e0f00);
图一:_mm_set_epi32,可以观察返回值的内部结构(图中标号1处)和在内存中的排列结构(图中标号2处)
图一:_mm_setr_epi32,可以观察返回值的内部结构(图中标号1处)和在内存中的排列结构(图中标号2处)
本文详细介绍了SSE2指令集中的关键指令,如_mm_set_epi32与_mm_setr_epi32等,这些指令用于设置不同长度的数据到__m128i变量,并通过实例对比了正序与反序设置的区别。
2859

被折叠的 条评论
为什么被折叠?



