最新のコンパイラ(GCC、Intel CC、VCなど)を使用して今日コンパイルされたすべてのx86(i386)バイナリは、Intel 386マシン(OS機能などの外部依存関係を考慮)で実行されることを理解しています。 20年前のコンピューターにWindows7をインストールして実行する人々のYouTubeのビデオ。
しかし、MMXやSSEなどのISA拡張機能がどのように機能するのかわかりません。プログラムのコードに拡張命令が含まれているが、その命令がプロセッサでサポートされていない場合は、プログラムがクラッシュする必要があります(おそらくプロセッサがOSに割り込む)。私が考えることができる唯一の解決策は、プログラムのバイナリが命令がサポートされているかどうかを確認し、サポートされていない場合は、すべてのプラットフォームでサポートされることが保証されている最小公分母コードを実行することですが、それは確かにバイナリを非常に作成することができます大規模で、拡張機能でしたが、浮動小数点演算のように実際には標準となった命令についてはどうでしょうか。それは、FP操作を行うすべてのi386バイナリにソフトウェアFPエミュレーションも含まれていることを意味しますか?
プログラムが命令サポートのチェックを行う場合、それはどこでそれらを行いますか?タイトなループがある場合は、ループ内でチェックを実行する必要はありません。コンパイラーは、あらゆる状況でそれを最適化する方法をまだ十分に理解しているとは思わないので、目に見えるコンパイラー・オプションの欠如は奇妙です。
命令の発行を制御するためのコンパイラまたはリンカのVCプロジェクト設定に設定またはオプションが見つかりません。最適化についてはいくつかありますが、私が期待する制御を与えるものは何もありません。
そして、AMDの「3DNow!」はどうですか?拡大?3DNowは、MMXの拡張機能であることが意図されているため、独自の命令と独自の側面がいくつかありますが、VCコンパイラまたはリンカー設定で3DNowへの参照を見つけることができないため、コードを記述している場合は、コンパイラに3DNowを使用させることはできますか?指示(MMXではなく)?
また、3DNowに関するウィキペディアの記事には、AMDがプロセッサからいくつかの3DNow命令を削除したと記載されています。これらの命令が存在すると想定するコードが存在する場合、それは機能しなくなりますか?