表 3–11 に、-xarch キーワード isa で受け付けられるアーキテクチャーを示します。
表 3–11 -xarch ISA キーワード
プラットフォーム |
有効な -xarch キーワード |
SPARC |
generic、generic64、native、native64、sparc、sparcvis、sparcvis2、sparcfmaf、v9、v9a、v9b |
x86 |
generic、native、386、pentium_pro、sse、sse2、amd64、pentium_proa、ssea、sse2a、amd64a、sse3 |
-xarch は単独で使用できますが、-xtarget オプションの展開の一部です。 特定の -xtarget オプションで設定されている -xarch の値を上書きするために使用することもできます。次に例を示します。
% f95 -xtarget=ultra2 -xarch=sparcfmaf ...
-xtarget=ultra2 で設定した -xarch が無効になります。
このオプションは、指定の命令セットだけを許すことによって、コンパイラが指定の命令セットアーキテクチャーの命令に対応するコードしか生成できないようにします。なお、ターゲット固有の命令が使用されるとは限りません。
このオプションを最適化で使用する場合は、適切なアーキテクチャーを選択すると、そのアーキテクチャー上での実行パフォーマンスを向上させることができます。不適切な選択を行うと、意図したターゲットプラットフォームでは実行できないバイナリプログラムが生成されます。
次の点に注意してください。
従来の 32 ビット SPARC 命令セットアーキテクチャーの V7 および V8 では、暗黙に —m32 を設定します。—m64 とともに使用することはできません。
sparc および sparcvis を指定してコンパイルしたオブジェクトバイナリファイル (.o) は、 リンクし、まとめて実行できますが、実行は sparcvis 互換プラットフォーム上だけに限られます。
sparc、sparcvis、および sparcvis2 を指定してコンパイルしたオブジェクトバイナリファイル (.o) は、リンクし、まとめて実行できますが、実行は sparcvis2 互換プラットフォーム上だけに限られます。
オプションの選択によっては、生成された実行可能プログラムのパフォーマンスが、初期のアーキテクチャーよりかなり劣ることがあります。また、4 倍精度 (REAL*16 および long double) の浮動小数点命令は、これらの命令セットアーキテクチャーの多くで使用できますが、コンパイラは、それらの命令を生成したコードでは、それらの命令を使用しません。
SPARC プラットフォームで -xarch が指定されなかった場合のデフォルトは、SPARC プラットフォームでは sparc、x86 プラットフォームでは 386 です。
表 3–12 に、SPARC プラットフォーム上で使用する各 -xarch キーワードについて詳細に説明します。
表 3–12 SPARC プラットフォーム上の -xarch の値
-xarch= |
意味 (SPARC) |
---|---|
generic |
たいていのプロセッサに共通の命令セットを使用したコンパイルを行います。 |
generic64 |
たいていの 64 ビットプラットフォーム用のコンパイルを行います。 (Solaris のみ) このオプションは -m64 -xarch=generic と同等で、旧バージョンとの互換を提供します。64 ビットコンパイルを指定する場合は、-xarch=generic64 ではなく -m64 を使用します。 |
native |
このシステムで良好なパフォーマンスを得るためのコンパイルを行います。 コンパイラは、コンパイルが実行されている現在のシステムプロセッサに適した設定を選択します。これは、-fast オプションのデフォルトです。 |
native64 |
このシステムの 64 ビットモードで良好なパフォーマンスを得るためのコンパイルを行います。 (Solaris のみ) このオプションは -m64 -xarch=native と同等で、旧バージョンとの互換を提供します。 |
sparc |
SPARC V9-ISA 用のコンパイルを行います。 V9 ISA 用のコンパイルですが、Visual Instruction Set (VIS) や、その他の実装固有の ISA 拡張機能は含まれません。このオプションを使用して、コンパイラは、V9 ISA で良好なパフォーマンスが得られるようにコードを生成できます。 |
sparcvis |
UltraSPARC 拡張機能付きの SPARC-V9 ISA 用のコンパイルを行います。 Visual Instruction Set (VIS) version 1.0 および UltraSPARC 拡張機能付きの SPARC-V9 用のコンパイルを行います。このオプションを使用して、コンパイラは、UltraSPARC アーキテクチャーで良好なパフォーマンスが得られるようにコードを生成できます。 |
sparcvis2 |
UltraSPARC-III 拡張機能付きの SPARC-V9 ISA 用のコンパイルを行います。 コンパイラは、UltraSPARC アーキテクチャー + Visual Instruction Set (VIS) version 2.0 + UltraSPARC-III 拡張機能用のオブジェクトコードを生成できます。 |
sparcfmaf |
SPARC-V9 ISA の sparcfmaf バージョン用のコンパイルを行います。 コンパイラは、SPARC-V9 命令セット + UltraSPARC 拡張機能 + Visual Instruction Set (VIS) version 1.0 + UltraSPARC-III 拡張機能 + Visual Instruction Set (VIS) version 2.0 + 浮動小数点積和演算用の SPARC64 VI 拡張機能の命令を使用できます。 コンパイラが自動的に積和演算命令を使用する機会を見つけられるようにするには、-xarch=sparcfmaf および -fma=fused と最適化レベルを組み合わせて使用する必要があります。 |
v9 |
-m64 -xarch=sparc と同義です。64 ビットのメモリーモデルを得るために -xarch=v9 を使用する従来のメイクファイルおよびスクリプトは、-m64 を使用するだけで済みます。 |
v9a |
-m64 -xarch=sparcvis と同義です。旧バージョンとの互換を提供します。 |
v9b |
-m64 -xarch=sparcvis2 と同義です。旧バージョンとの互換を提供します。 |
表 3–13 に、x86 プラットフォーム上で使用する各 -xarch キーワードについて詳細に説明します。x86 で -xarch が指定されなかった場合のデフォルトは、generic です。
表 3–13 x86 プラットフォーム上の -xarch の値
-xarch= |
意味 (x86) |
---|---|
generic |
たいていの 32 ビット x86 プラットフォームで良好なパフォーマンスを得るために、コンパイルを行います。これはデフォルトで、-xarch=386 と同義です。 |
generic64 |
たいていの 64 ビット x86 プラットフォームで良好なパフォーマンスを得るために、コンパイルを行います。現在は、amd64 と解釈されます。 |
native |
x86 アーキテクチャーで良好なパフォーマンスを得るために、コンパイルを行います。たいていの x86 プロセッサで良好なパフォーマンスを得るために、最良の命令セットを使用します。「最良な」命令セットの内容は、必要に応じて新しいリリースごとに調整される可能性があります。 |
native64 |
64 ビット x86 アーキテクチャーで良好なパフォーマンスを得るために、コンパイルを行います。 |
386 |
命令セットを Intel 386/486 アーキテクチャーに限定します。 |
pentium_pro |
命令セットを Pentium Pro アーキテクチャーに制限します。 |
pentium_proa |
AMD 拡張機能 (3DNow!、3DNow! 拡張機能、および MMX 拡張機能) を 32 ビット Pentium Pro アーキテクチャーに追加します。 |
sse |
pentium_pro に SSE 命令セットを追加します (次を参照)。 |
ssea |
AMD 拡張機能 (3DNow!、3DNow! 拡張機能、および MMX 拡張機能) を 32 ビット SSE アーキテクチャーに追加します。 |
sse2 |
pentium_pro に SSE2 命令セットを追加します (次を参照)。 |
sse2a |
AMD 拡張機能 (3DNow!、3DNow! 拡張機能、および MMX 拡張機能) を 32 ビット SSE2 アーキテクチャーに追加します。 |
sse3 |
SSE2 命令セットに SSE3 命令セットを追加します。 |
amd64 |
-m64 -xarch=sse2 と同義です (Solaris のみ) 。64 ビットのメモリーモデルを得るために -xarch=amd64 を使用する従来のメイクファイルおよびスクリプトは 、-m64 を使用するだけで済みます。 |
amd64a |
—m64 —xarch=sse2a と同義です (Solaris のみ)。 |
x86 Solaris プラットフォームでコンパイルを行う場合は、次の点が重要です。
-xarch を sse、sse2、sse2a、または sse3 に設定してコンパイルしたプログラムは、これらの機能および拡張機能をサポートするプラットフォームで実行する必要があります。
Pentium 4 互換プラットフォームの場合、Solaris 9 4/04 以降のリリースは SSE/SSE2 に対応しています。これより前のバージョンの Solaris は SSE/SSE2 に対応していません。
コンパイルとリンクを別々に行う場合は、必ずコンパイラを使ってリンクし、同じ -xarch 設定で正しい起動ルーチンがリンクされるようにしてください。
x86 の 80 バイト浮動小数点レジスタが原因で、x86 での演算結果が SPARC の結果と異なる場合があります。こうした違いが出ないようにするために、-fstore オプションを使用してください。あるいは、ハードウェアが SSE2 をサポートしている場合は、-xarch=sse2 を付けてコンパイルしてください。
Sun Studio 11 と Solaris 10 OS から、これらの特殊化された -xarch ハードウェアフラグを使用してコンパイルし、構築されたプログラムバイナリは、適切なプラットフォームで実行されることが確認されます。
Solaris 10 以前のシステムでは確認が行われないため、これらのフラグを使用して構築したオブジェクトが適切なハードウェアに配備されることをユーザーが確認する必要があります。
これらの -xarch オプションでコンパイルしたプログラムを、適切な機能または命令セット拡張に対応していないプラットフォームで実行すると、セグメント例外や明示的な警告メッセージなしの不正な結果が発生することがあります。
このことは、.il インラインアセンブリ言語関数を使用しているプログラムや、SSE、SSE2、SSE2a、SSE3 の命令、および拡張機能を利用している __asm() アセンブラコードにも当てはまります。