select 組み込み関数は、select
パラメーターの値に応じて、レーンの最初のセットまたは 2 番目のセットを選択します。select
のレーンに対応するビットが 0 の場合、レーンの最初のセットの値が返されます。対応するビットが 1 の場合、レーンの 2 番目のセットの値が返されます。たとえば、select16
組み込み関数には次の関数プロトタイプがあります。
v16int32 select16 ( unsigned int select,
v16int32 xbuff,
int xstart,
unsigned int xoffsets,
unsigned int xoffsets_hi,
v16int32 ybuff,
int ystart,
unsigned int yoffsets,
unsigned int yoffsets_hi
)
select
の各ビット (下位から上位) に対して、レーンが xbuff
(select
パラメーター ビットが 0 の場合) または ybuff
(select
パラメーター ビットが 1 の場合) から選択されます。選択された xbuff
または ybuff
レーン上のデータの並べ替えは、shuffle
で xoffsets
または yoffsets
の対応するビットを使用して達成されます。次に、select
の疑似 C スタイルのコードを示します。
for (int i = 0; i < 16; i++){
idx = f( xstart, xoffsets[i]); //i'th 4 bits of offsets
idy = f( ystart, yoffsets[i]);
o[i] = select[i] ? y[idy]:x[idx];
}
上記のコードで f
がどのように機能するかに関する情報は、このセクションの最初に示されている通常のレーン選択方法の式を参照してください。
int16 型を使用する場合、select
組み込み関数に追加の xsquare
パラメーターを使用すると、主なの並べ替えの後にさらに 16 ビット粒度の並べ替えを実行できます。たとえば、select32
組み込み関数には次の関数プロトタイプがあります。
v32int16 select32 (unsigned int select,
v64int16 xbuff,
int xstart,
unsigned int xoffsets,
unsigned int xoffsets_hi,
unsigned int xsquare,
int ystart,
unsigned int yoffsets,
unsigned int yoffsets_hi,
unsigned int ysquare
)
次に、select
の疑似 C スタイルのコードを示します。
for (int i = 0; i < 32; i++){
idx = f( xstart, xoffsets[i], xsquare);
idy = f( ystart, yoffsets[i], ysquare);
o[i] = select[i] ? y[idy]:x[idx];
}
次の例では、select32
を使用して、A
と B
の最初の 16 要素をインターリーブしています (A が先)。
int16 A[32]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
int16 B[32]={32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
v32int16 *pA=(v32int16*)A;
v32int16 *pB=(v32int16*)B;
v32int16 C = select32(0xAAAAAAAA, concat(*pA,*pB),
0, 0x03020100, 0x07060504, 0x1100,
32, 0x03020100, 0x07060504, 0x1100);
上記のコードの出力 C は、次のとおりです。
{0,32,1,33,2,34,3,35,4,36,5,37,6,38,7,39,8,40,9,41,10,42,11,43,12,44,13,45,14,46,15,47
}
これは、shuffle32
組み込み関数を使用しても達成できます。
v32int16 C = shuffle32(concat(*pA,*pB),
0, 0xF3F2F1F0, 0xF7F6F5F4, 0x3120);
次の図に、上記の select32
組み込み関数がどのように機能するかを示します。