アセンブラとNEONプログラミングを初めて使用しています。 私の仕事は、アルゴリズムの一部をNEON命令を使ってCからARMアセンブラに変換することです。 アルゴリズムはint32配列をとり、この配列から異なる値をロードし、ビットシフトとXorを実行して結果を別の配列に書き込みます。 後で私は64ビット値の配列を使いますが、今はコードを書き直そうとしています。私はこのようなレジスタをロードする場合ARM NEONアセンブラ - 使用方法と理解
1):
vld1.32 d0, [r1]
はそれを埋めるためにメモリまたは2x32Bitからのみ32ビットをロードしますので、ここで
C Pseudo code:
out_array[index] = shiftSome(in_array[index])^shiftSome(in_array[index]);
は、NEON命令に関する私の質問です64Bit Neon D-Register?
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");
をロードしようと「アウト」へのポインタであります整数(デバッグ用)。
4)私は右にシフトする必要がありますが、動作するようには思えない配列から値をロードした後:
vshr.u32 d0, d0, #24 // C code: x >> 24;
5.)のみ負荷1バイトのことが可能ですネオンレジスタに入れて、シフト/マスクするだけで1つのバイトだけを取得する必要はありません。
6)私は、インラインアセンブラを使用する必要があるが、私は最後の行が何のためにあるのかわからない:あなたはコード例と何かいいNEON参照を知っています
input list : output list : what is this for?
7)?
プログラムはSamsung Galaxy S2、cortex-A9プロセッサーで実行する必要があります。助けてくれてありがとう。
----------------何で編集-------------------
見つけた:それは常にあなたがネオンの一部は、アームレジスタへ転送する「VMOV」命令を使用することができます
- 。
- オフセットはアームレジスタ内にあり、のメモリアクセスの後に ベースアドレスに追加されます。
- 「clobbered reg list」です。使用されているすべてのレジスタと入力リストまたは出力リストのいずれにも は記載されていません。
2.コンテンツをSIMDレジスタからARMレジスタに移動するとパイプラインが完全にフラッシュされ、約14サイクルのコストがかかります。避けてください。 –