不,没有与此等效的整数。所以你要么模仿它,要么作弊。
一种方法是使用_mm_shuffle_epi32()
on A
and B
。然后屏蔽掉所需的术语并将它们重新组合在一起。
这往往很混乱并且有大约 5 条指令。 (如果您使用 SSE4.1 混合指令,则为 3。)
这是 SSE4.1 解决方案,有 3 条指令:
__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);
其作用是将数据类型转换为浮点,以便可以使用 float-shuffle。然后将其转换回来。
请注意,这些“转换”是按位转换(也称为重新解释)。实际上没有完成任何转换,并且它们不映射到任何指令。在汇编中,整数或浮点SSE寄存器之间没有区别。这些强制转换内在函数只是为了绕过 C/C++ 强加的类型安全。
但是,请注意,这种方法会因在整数和浮点 SIMD 执行单元之间来回移动数据而产生额外的延迟。所以它会比单纯的 shuffle 指令更昂贵。