1

r1r3およびr4タイプがNEONuint32x4_tレジスタにロードされているので、次のコードがあります。

r3 = veorq_u32(r0,r3);   
r4 = r1;    
r1 = vandq_u32(r1,r3);   
r4 = veorq_u32(r4,r2);   
r1 = veorq_u32(r1,r0);

そして、GCCが実際に命令に変換r4 = r1されるかどうか疑問に思っていました。vmov分解されたコードを見て、私はそれがそうではなかったことに驚かなかった。(さらに、生成されたアセンブリコードが実際に何をするのか理解できません)

ARMのNEON組み込み関数のリファレンスをざっと見てみると、単純なベクトル->ベクトル代入の組み込み関数が見つかりませんでした。

これを達成するための最も簡単な方法は何ですか?r1どのレジスタがでr4割り当てられているかわからないため、インライン化されたアセンブリコードがどのように表示されるかわかりませんvld1q_u32。実際のスワップは必要ありません。割り当てだけです。

4

1 に答える 1

4

Cには抽象マシンの概念があります。割り当てやその他の操作は、この抽象マシンの観点から説明されています。割り当ては、抽象マシンでr4 = r1;r4にr1の値を割り当てることを示しています。

コンパイラがプログラムの命令を生成するとき、それは通常、抽象マシンで発生するすべてを正確に模倣するわけではありません。抽象マシンで発生する操作を、同じ結果を得るプロセッサ命令に変換します。コンパイラーは、移動命令がなくても同じ結果が得られることがわかった場合、移動命令などをスキップします。

r1特に、コンパイラは毎回同じ場所にとどまるとは限りません。初めて必要になったときに、メモリからレジスタR7にロードする場合があります。r1 = vandq_u32(r1,r3);ただし、R7の元の値を維持しながら、結果をR8に配置することで、ステートメントを実装する場合がありますr1。その後、を持っているr4 = veorq_u32(r4,r2);場合、コンパイラはR7の値を使用できます。これは、抽象マシンで(ステートメントr4から)持つ値がまだ含まれているためです。r4 = r1;

組み込み関数を明示的にvmov記述した場合でも、最終的に同じ結果が得られる命令を発行する限り、コンパイラーはその命令を発行しない可能性があります。

于 2013-03-13T14:04:38.247 に答える