2012-01-27 7 views
1

私はNEONレジスタにchar値の配列をロードし、16ビットまたは32ビットの整数値として扱おうとしています。だからこのようなもの...NEON/ARMを使用して8ビット値をロードする

void SubVector(short* c, const unsigned char* a, const unsigned char* b, int n) 
{ 
    for(int i = 0; i < n; i++) 
    { 
     c[i] = (short)a[i] - (short)b[i]; 
    } 
} 

データをロードする方法がわかりません。 8ビットデータをレーンにロードしてから、レジスタを短絡として再解析する必要がありますか?またはロードして変換しますか?最速の方法は何でしょうか?

NEON組み込み関数でどのようにこれを行うかについての例がありますか?

ありがとうございます!

答えて

6

NEONには、8-> 16,16-> 32または32-> 64ビットの値を拡大できる加算および減算命令があります。あなたはこのように一度に8回行うことができます:

uint8x8_t u88_a, u88_b; 
uint16x8_t u168_diff; 

u88_a = vld1_u8(a); // load 8 unsigned chars from a[] 
u88_b = vld1_u8(b); // load 8 unsigned chars from b[] 
u168_diff = vsubl_u8(u88_a, u88_b); // calculate the difference and widen to 16-bits 
+0

優れた答えです。 –

+0

ありがとうございます。完璧。 – paul

+0

私は同じことをやろうとしています。しかし、2つのuint8の差を計算すると、結果はuint16ではなくint16でなければなりません...この組み込み関数の使用は何ですか?私は私の否定的な結果を得るために再解釈する必要があります。 –

関連する問題