neon内部函数只提供实现4-way de-interleave的指令,要实现8-way de-interleave可通过两个4-way de-interleave来实现。
uint8_t src[64] = {0};
uint8_t dst[64] = {0};
for (int i = 0; i < 64; i++)
{
src[i] = i;
}
//读取2组4-way数据
uint8x8x4_t src_reg1 = vld4_u8(src);
uint8x8x4_t src_reg2 = vld4_u8(src + 32);
for (int j = 0; j < 4; j++) //将2组4-way数据经反交叉后生成1组8-way数据
{
uint8x8x2_t temp = vuzp_u8(src_reg1.val[j], src_reg2.val[j]);
src_reg1.val[j] = temp.val[0];
src_reg2.val[j] = temp.val[1];
}
for (int j = 0; j < 4; j++) //将1组8-way数据经交叉后生成2组4-way数据
{
uint8x8x2_t temp = vzip_u8(src_reg1.val[j], src_reg2.val[j]);
src_reg1.val[j] = temp.val[0];
src_reg2.val[j] = temp.val[1];
}
//将2组4-way数据存放如内存
vst4_u8(dst, src_reg1);
vst4_u8(dst+32, src_reg2);
//经过这样处理后,可发现dst的值与src的值是一样
for (int i = 0; i < 64; i++)
{
printf("dst[%d] = %d ", i, dst[i]);
}