アセンブラと NEON プログラミングは初めてです。私の仕事は、NEON 命令を使用してアルゴリズムの一部を C から ARM アセンブラーに変換することです。このアルゴリズムは int32 配列を取り、この配列からさまざまな値をロードし、ビットシフトと Xor を実行して、結果を別の配列に書き込みます。後で 64 ビット値の配列を使用しますが、今はコードを書き直してみるだけです。
C Pseudo code:
out_array[index] = shiftSome( in_array[index] ) ^ shiftSome( in_array[index] );
NEON命令に関する私の質問は次のとおりです。
1.) 次のようなレジスタをロードした場合:
vld1.32 d0, [r1]
メモリから 32 ビットのみをロードするのか、それとも 2x32 ビットをロードして 64 ビットのネオン D レジスタを埋めるのか?
2.) D レジスタの 2/4/8 (i32、i16、i8) 部分にアクセスするにはどうすればよいですか?
3.) オフセットを使用して配列から異なる値を読み込もうとしていますが、うまくいかないようです...何が間違っているのでしょうか...これが私のコードです:(これは整数配列なので、私は'たとえば、オフセットが 64 ビット = 8 バイトの 3 要素をロードしようとしている場合)
asm volatile(
"vld1.32 d0, [%0], #8 \n"
"vst1.32 d0, [%1]" : : "r" (a), "r" (out): "d0", "r5");
ここで、「a」は配列で、「out」は整数へのポインターです (デバッグ用)。
4.) 配列から値をロードした後、右にシフトする必要がありますが、うまくいかないようです:
vshr.u32 d0, d0, #24 // C code: x >> 24;
5.) 必要な 1 バイトだけを取得するために何かをシフト/マスクする必要がないように、Neon レジスタに 1 バイトだけをロードすることは可能ですか?
6.) インライン アセンブラを使用する必要がありますが、最後の行が何のためにあるのかわかりません。
input list : output list : what is this for?
7.) コード例を含む適切な NEON リファレンスを知っていますか?
プログラムは、違いがある場合、Samsung Galaxy S2、cortex-A9 プロセッサで実行する必要があります。助けてくれてありがとう。
- - - - - - - - 編集 - - - - - - - - - -
それが私が見つけたものです:
- 常に完全なレジスタ (64 ビット) をロードします。
- 「vmov」命令を使用して、ネオン レジスタの一部をアーム レジスタに転送できます。
- オフセットはアーム レジスタにある必要があり、メモリ アクセス後にベース アドレスに追加されます。
- それは「破壊された登録リスト」です。入力リストにも出力リストにもない、使用されているすべてのレジスタをここに書き込む必要があります。