いいえ、これに相当する整数はありません。したがって、それをエミュレートするか、チートする必要があります。
1つの方法は、とを使用すること_mm_shuffle_epi32()
です。次に、目的の用語をマスクして、またはそれらを元に戻します。A
B
それは厄介になる傾向があり、約5つの命令があります。(または、SSE4.1ブレンド手順を使用する場合は3。)
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);
これは、データ型を浮動小数点に変換して、float-shuffleを使用できるようにすることです。次に、それを元に戻します。
これらの「変換」はビット単位の変換(別名再解釈)であることに注意してください。実際には変換は行われず、命令にマップされません。アセンブリでは、整数または浮動小数点SSEレジスタの区別はありません。これらのキャスト組み込み関数は、C /C++によって課せられる型安全性を回避するためのものです。
ただし、このアプローチでは、整数と浮動小数点のSIMD実行ユニット間でデータを前後に移動するために余分な遅延が発生することに注意してください。したがって、シャッフル命令よりもコストがかかります。