質問

私は、ARM NEON命令でvld4_f32vld4q_f32の違いを作る立場にないんだけど。

私は私のコーディングのレベルを上げ、組立説明書というよりも少ない有益な組み込み関数を見始めたとき、

は混乱が始まっています。

私が使用する必要がある理由の vld4 の私は、キャプチャしたい、ので、バリアント命令は、ここにあるの 4 float32_tのすべてのを4位からのの私大規模な配列ます。

altテキスト

vld4_f32組み込み関数とそれに対応するアセンブリ命令は次のようになり(このことから、リンクする

float32x2x4_t vld4_f32 (const float32_t *) 
Form of expected instruction(s): vld4.32 {d0, d1, d2, d3}, [r0]

このようなvld4q_f32組み込み関数とそれに対応するアセンブリ命令のルックス

float32x4x4_t vld4q_f32 (const float32_t *) 
Form of expected instruction(s): vld4.32 {d0, d1, d2, d3}, [r0]

まあ、組み込み関数レベルでの私が見違いは、の戻り値の型であるが、同じように、私はアセンブリ命令とレジスタの数を見れば、彼らは両方の外観。どのようにコンパイラやアセンブラが2つの違いを知っているのだろうか?

缶誰かがこの上で、より明確にし、また、私はを4 float32_t の4回ごとのメモリ位置でのに配置されている値の単一レジスタに?
役に立ちましたか?

解決

はい、私は違いを見つけました。私はすべてのロード命令のために実際のレジスタの内容を確認するためにCodeSourcery社を使用しました。私が投稿したリンクがvld4q_f32の完全な詳細を与えるものではありません。

さて、第vld4_f32が来るこの命令が最初にロードするように、この負荷の 4 D のレジスタ(例えば、d16-19)それぞれの D のレジスタは、64ビットの長さ以下の図に示すように8つの値は4の間隔と交互。 altテキスト

代わり4の第2のケースで

vld4q_f32、この負荷の 8 D のレジスタ(例えばd16-23)。このリンクするの読者のために、それはすべて明らかになっていません8個のレジスタがロードされます。私はvld4qf32ためDIS組み立てコードを見たとき、それは8つのDレジスタを利用した。

この命令は、実際に私はそれが以下の図に示すように4の間隔である4つのfloat32_t値をロードするために、すなわちを行うことを望んでいたものでしょう。 altテキスト

他のヒント

私は多分それは誰かに助け、2つの組み込み関数を逆アセンブルしています

// C++
uint32x4x4_t r = vld4q_u32( ( uint32_t *) output );
// assembly
VLD4.32         {D16,D18,D20,D22}, [R0]!
VLD4.32         {D17,D19,D21,D23}, [R0]

// C++
uint32x2x4_t r = vld4_u32( ( uint32_t *) output );
// assembly
VLD4.32         {D20-D23}, [R0]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top