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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章