2016-07-27 25 views
0

Iは、以前ネオンフラグでコンパイルアームバイナリを分解:vdiv命令がネオンフラグで生成されるのはなぜですか?

-mcpu =皮質-A9 -mfpu =ネオン-mfloat-ABI = softfp -ftree-ベクトル化

ダンプが発生vdiv.f64命令を示しますコンパイラによって。 armv7(cortex-a9)のアームマニュアルによれば、ネオンは、vdiv命令をサポートしていませんが、浮動小数点(vfp)エンジンはサポートしています。この命令はなぜ生成されますか?それはvfpによって実行される浮動小数点命令ですか?ネオンとVFPはどちらも浮動小数点の加算と乗算をサポートしていますので、どうすれば他のものと区別することができますか?

+0

はい、これはVFP命令です。 AArch32ネオンは64ビット浮動小数点ではまったく動作しないので、簡単に見ることができます。 – EOF

+0

答えていただきありがとうございますが、コンパイラによって生成された "vadd"が表示されたら、両方のエンジンがこの命令を実装しているので、それがNEONかVFP命令かどうかをどのように知ることができますか?私は、腕のcortex-a9プロセッサとarm-none-linux-gnueabi * toolchainを使って作業しています。 –

+2

ネオンは、レジスタ名 'D [n]'と 'Q [n]'と命令ポストフィックス 'F32'(整数命令の場合は' I [n] ')を使用しますが、VFPでは' S [n] 'と' n] 'と命令ポストフィックス' F64'または 'F32'を使用します。その組み合わせはあいまいではないことが分かります。 – EOF

答えて

1

Cortex-A9の場合、the NEON FPU option also implements VFP。これは、カットダウンされた16レジスタのVFP専用FPUオプションのスーパーセットです。

さらに一般的に、アーキテクチャでは、単精度のVFPを少なくとも実装せずに浮動小数点アドバンストSIMDを実装できないため、GCCの-mfpu=neonもVFPv3を意味します。 で、浮動小数点機能を全く持たない整数のみのアドバンストSIMDを実装することはできますが、GCCがこれをサポートできるかどうかは不明です。

実際のVFPおよび高度なSIMD命令の構文は、構文から明白です。アドバンストSIMDは倍精度をサポートしていないため、倍精度データ(つまり、<op>.F64)で動作するものは明らかにVFPです。 32ビットのsレジスタで動作する単精度演算(すなわち、<op>.F32)はスカラーなので、VFPです。より大きな64ビットのdまたは128ビットのqレジスタで動作している場合、それらは同時に複数の32ビット値を処理しているため、ベクトル化された高度なSIMD命令です。

+0

あなたの説明は非常に明確で、私の質問を解決します。この質問にお答えいただきありがとうございます。 –

関連する問題