使用neon内部函数实现8-way de-interleave

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]);
}


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页