所述_mm_shuffle_ps()
固有允许一个交织浮子投入低2个浮纱和高2个漂浮的输出。
例如:
R = _mm_shuffle_ps(L1, H1, _MM_SHUFFLE(3,2,3,2))
将导致:
R[0] = L1[2];
R[1] = L1[3];
R[2] = H1[2];
R[3] = H1[3]
我想知道是否有类似的特性可用于整数数据类型? 东西花了两个__m128i
变量和交错口罩?
所述_mm_shuffle_epi32()
本征的,只需要一个128位的向量,而不是两个。
不,没有整数等效于此。 所以,你必须要么效仿,或欺骗。
一种方法是使用_mm_shuffle_epi32()
上A
和B
。 然后屏蔽掉所需项,或者他们重新走到一起。
这往往是凌乱而有大约5条指令。 (或3,如果您使用SSE4.1指令混合)。
这里有3个指令SSE4.1的解决方案:
__m128i A = _mm_set_epi32(13,12,11,10);
__m128i B = _mm_set_epi32(23,22,21,20);
A = _mm_shuffle_epi32(A,2*1 + 3*4 + 2*16 + 3*64);
B = _mm_shuffle_epi32(B,2*1 + 3*4 + 2*16 + 3*64);
__m128i C = _mm_blend_epi16(A,B,0xf0);
我更喜欢的方法是实际欺骗 - 和浮点洗牌是这样的:
__m128i Ai,Bi,Ci;
__m128 Af,Bf,Cf;
Af = _mm_castsi128_ps(Ai);
Bf = _mm_castsi128_ps(Bi);
Cf = _mm_shuffle_ps(Af,Bf,_MM_SHUFFLE(3,2,3,2));
Ci = _mm_castps_si128(Cf);
这样做是对数据类型转换为浮点,以便它可以使用浮动洗牌。 然后将其转换回来。
需要注意的是,这些“转化”是按位转换(又名再解释)。 没有转换实际上是做了,他们不映射到任何指令。 在装配时,存在一个整数或浮点寄存器SSE之间没有区别。 这些铸件内在函数只是为了让周围的C / C ++所规定的类型安全。
但是,要知道,这种做法招致了移动数据备份和提出的整数和浮点SIMD执行单元之间的额外延迟。 因此,这将不仅仅是重排指令更加昂贵。