B.2.135 -xregs=r[, r…]
生成コード用のレジスタの使用法を指定します。
r には、次の 1 つまたは複数の項目をコンマで区切って指定します。[no%]appl,[no%]float,[no%]frameptr.
例: -xregs=appl,no%float
表 B–36
-xregs のフラグ
値
|
意味
|
[no%]appl
|
(SPARC) コンパイラがアプリケーションレジスタをスクラッチレジスタとして使用して、コードを生成することを許可します [しません]。アプリケーションレジスタは次のとおりです。
g2、g3、g4 (32 ビットプラットフォームの場合)
g2、g3 (64 ビットプラットフォームの場合)
すべてのシステムソフトウェアおよびライブラリは、-xregs=no%appl を指定してコンパイルすることをお勧めします。システムソフトウェア
(共有ライブラリを含む) は、アプリケーション用のレジスタの値を保持する必要があります。これらの値は、コンパイルシステムによって制御されるもので、アプリケーション全体で整合性が確保されている必要があります。
SPARC ABI では、これらのレジスタはアプリケーションレジスタと記述されています。これらのレジスタを使用すると必要なロードおよびストア命令が少なくてすむため、パフォーマンスが向上します。ただし、アセンブリコードで記述された古いライブラリプログラムとの間で衝突が起きることがあります。
|
[no%]float
|
(SPARC) コンパイラが浮動小数点レジスタを整数値用のスクラッチレジスタとして使用して、コードを生成することを許可します [しません]。浮動小数点値を使用する場合は、このオプションとは関係なくこれらのレジスタを使用します。浮動小数点レジスタに対するすべての参照をコードから排除する場合は、-xregs=no%float を使用するとともに、決して浮動小数点型をコードで使わないようにする必要があります。
|
[no%]frameptr
|
(x86) フレームポインタレジスタ (IA32 の場合 %ebp 、AMD64 の場合 %rbp)
を未割り当ての呼び出し先保存レジスタとして使用することを許可 [禁止] します。
未割り当ての呼び出し先保存レジスタとしてフレームポインタレジスタを使用すると、プログラムの実行時パフォーマンスが向上することがあります。ただし、スタックを調べ、追跡するために、一部ツールの能力の低下を招きます。このスタック調査機能は、システムパフォーマンスの測定やチューニングの際に重要です。このため、この最適化を使用すると、グローバルなシステムパフォーマンスを犠牲にしてローカルのプログラムパフォーマンスが向上することがあります。
-
事後診断用にスタックをダンプするパフォーマンスアナライザなどのツールが機能しなくなります。
-
デバッガ (adb、mdb、dbx など)
が、スタックをダンプしたり、スタックフレームを直接ポップしたりできなくなります。
-
dtrace パフォーマンス解析機能が、スタック上の、フレームポインタを失った最新のフレームの前のフレームに関する情報を収集できなくなります。
-
Posix の pthread_cancel がクリーンアップハンドラを検出できなくなります。
-
C++ の例外が、C 関数経由で伝搬できなくなります。
フレームポインタを失った C 関数が、その
C 関数経由で例外をスローする C++ 関数を呼び出す場合、C++ 例外で問題が発生します。一般にそうした呼び出しは、関数が関数ポインタを受け付けるか
(たとえば qsort)、malloc などの大域関数が割り込みを受けるときに発生します。
前述の最後の 2 つの影響によって、アプリケーションの正しい動作に影響が生じることがあります。多くのアプリケーションコードは、こうした問題を検出しません。-xO4 を使用して作成されたライブラリには、そのクライアントによる使用制限を詳述したマニュアルを用意することを推奨します。
注: -xpg も指定されている場合、コンパイラは -xregs=frameptr を無視し、警告を表示します。
|
SPARC のデフォルトは -xregs=appl,float です。
x86 のデフォルトは -xregs=no%frameptr です。-fast の展開に含まれる場合は -xregs=frameptr です。
アプリケーションにリンクする共有ライブラリ用のコードは、-xregs=no%appl,float を指定してコンパイルすることをお勧めします。少なくとも、リンクするアプリケーションでのレジスタ処理に問題がないように、共有ライブラリがアプリケーションレジスタを使用する方法を明示的に示す必要があります。
たとえば、大局的な方法で (重要なデータ構造体を示すためにレジスタを使用するなど) レジスタを使用するアプリケーションは、ライブラリと確実にリンクするため、-xregs=no%appl なしでコンパイルされたコードを含むライブラリがアプリケーションレジスタをどのように使用するかを正確に特定する必要があります。