ARM NEON:vld4_f32とvld4q_f32の違いは何ですか?
-
26-09-2019 - |
質問
私は、ARM NEON命令でvld4_f32
とvld4q_f32
の違いを作る立場にないんだけど。
は混乱が始まっています。
私が使用する必要がある理由の vld4 の私は、キャプチャしたい、ので、バリアント命令は、ここにあるの 4 のfloat32_t
のすべてのを4位からのの私大規模な配列ます。
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の間隔と交互。
vld4q_f32
、この負荷の 8 D のレジスタ(例えばd16-23)。このリンクするの読者のために、それはすべて明らかになっていません8個のレジスタがロードされます。私はvld4qf32
ためDIS組み立てコードを見たとき、それは8つのDレジスタを利用した。
この命令は、実際に私はそれが以下の図に示すように4の間隔である4つのfloat32_t
値をロードするために、すなわちを行うことを望んでいたものでしょう。
他のヒント
私は多分それは誰かに助け、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]