select 内部函数用于根据 select
参数的值来选择第一组通道或第二组通道。如果 select
中的通道对应位为 0,那么它会返回第一组通道中的值。如果该位为 1,那么它会返回第二组通道中的值。例如,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
(首先是 A)的前 16 个元素进行交织。
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
内部函数的工作方式。
图 1. int16 类型的数据选择