2016-07-13 15 views
1

ネオンの組み込み関数には、1ウェイから4ウェイのデインタリーブを実行する4つの組み込み関数(vld1 vld2 vld3 vld4)があります。しかし、8ウェイデインターリーブ?ネオンで8ウェイデインターリーブを実行する方法

例えば、データは次のとおり

uint8_t src[64] = {0,1,2,3,4,5,6,7,```63}; 

ロードネオンレジスタにデータ、および8ウェイデインターリーブを行った後、私はこのような可能性がsrc_reg1とsrc_reg2の値を期待:

uint8x8x4_t src_reg1; 
uint8x8x4_t src_reg2; 
src_reg1.val[0] = {0,8, 16,24,32,40,48,56} 
src_reg1.val[1] = {1,9, 17,25,```} 
src_reg1.val[2] = {2,10,18,26,```} 
src_reg1.val[3] = {3,11,19,27,```} 
src_reg2.val[0] = {4,12,20,28,```} 
src_reg2.val[1] = {5,13,21,29,```} 
src_reg2.val[2] = {6,14,22,30,```} 
src_reg2.val[3] = {7,15,23,31,39,47,55,63} 

これを達成する方法を知っている人はいますか?ありがとうございます。

答えて

4

それは:例えば、その後、さらにレジスタインターリーブ動作のうちの1つを介して相互にそれらのセットをデインタリーブ、4ウェイ2組のデータをデインタリーブ取得する

uint8x8x4_t src_reg1 = vld4_u8(src); 
uint8x8x4_t src_reg2 = vld4_u8(src + 32); 
for (int i = 0; i < 4; i++) { 
    // This a bit of a faff thanks to the intrinsic datatypes, but 
    // compiling at -O3 tidies it all up into sensible code 
    uint8x8x2_t tmp = vuzp_u8(src_reg1.val[i], src_reg2.val[i]); 
    src_reg1.val[i] = tmp.val[0]; 
    src_reg2.val[i] = tmp.val[1]; 
} 
を2つの4要素の負荷を行うのと同じくらい簡単です
関連する問題