5

を使用してソースから gcc 4.x をコンパイルしようとしましたが--with-fpmath=387、このエラーが発生しています: "Invalid --with-fpmath=387". 構成を調べたところ、このオプションがサポートされていないことがわかりました(ドキュメントではまだ可能なオプションとして言及されていますが):

case ${with_fpmath} in
  avx)
    tm_file="${tm_file} i386/avxmath.h"
    ;;
  sse)
    tm_file="${tm_file} i386/ssemath.h"
    ;;
  *)
    echo "Invalid --with-fpmath=$with_fpmath" 1>&2
    exit 1

基本的に、古いターゲットプラットフォーム用の実行可能ファイルを提供する必要があるため、このすべてを開始しました(実際、古いCeleronですが、DEFAULTによって libstdc++ によって明らかに使用されているSSE2命令はありません)。実行可能ファイルは、libstdc++ のルーチンのコピーから来る最初の命令 (movq XMM0,...) でクラッシュし、「不正な命令」メッセージが表示されます。これを解決する方法はありますか?既存のコード ベースを移植できるようにするには、かなり最近の g++ を使用する必要があります。

古いビルドからこれらのヘッダー/ソースを提供して、通常の x87 命令のサポートを有効にして、SSE 命令が参照されないようにすることは可能でしょうか?

更新: オブジェクト コードに SSE2 命令を含むコンパイル済みの libstdc++ について話していることに注意してください。したがって、問題は gcc コマンド ライン引数に関するものではありません。コードをコンパイルするときに gcc に何を提供していても、SSE2 命令が組み込まれている libstdc++ とリンクします。

本当の答えは、GCC をコンパイルするときに --with-fpmath スイッチを使用しないことです。configure スクリプトの switch ステートメントが sse または avx のみをサポートしていると考えて混乱しましたが、実際にはデフォルト値 (このスイッチには記載されていません) は「387」です。そのため、configure の実行時に --with-fpmath を使用しないようにしてください。それなしでGCCを再コンパイルしたところ、正常に動作するようになりました。

ありがとう。

4

2 に答える 2

5

特定のターゲット用のコードを生成するように gcc に指示する引数は-march= CPUです。ここで、CPUは必要な特定の CPU です。古いセレロンの場合、おそらく-march=pentium2または-march=pentium3

fp codegen を個別に制御するには、gcc の新しいバージョンを使用-mfpmath=します-mfpmath=387

これらすべておよびその他の多くの機能は、gcc のドキュメントでカバーされています。

編集

後でプログラムにリンクするライブラリ (libstdc++ など) をビルドするためにこれらのフラグを使用するには、適切なフラグを使用するようにライブラリのビルドを構成する必要があります。libstdc++ は g++ ビルドの一部としてビルドされるため、カスタム ビルドを行う必要があります。これを使用して、ビルドconfigure CXXFLAGS=-mfpmath=387中に使用する追加のフラグを設定できます。

于 2014-01-12T02:32:52.223 に答える
0

質問は、オブジェクト コードに SSE2 命令を含むコンパイル済み libstdc++ に関するものであったため、gcc コマンド ライン引数に関する質問ではないことに注意してください。コードをコンパイルするときに gcc に何を提供していても、SSE2 命令が組み込まれている libstdc++ とリンクします。

本当の答えは、GCC をコンパイルするときに --with-fpmath スイッチを使用しないことです。configure スクリプトのswitchステートメントが sse または avx のみをサポートしていると考えて混乱しましたが、実際にはデフォルト値 (このスイッチでは言及されていません) は「387」です。そのため、configure の実行時に--with-fpmathを使用しないようにしてください。それなしでGCCを再コンパイルしたところ、正常に動作するようになりました。

于 2014-03-10T14:05:59.353 に答える