コンパイラには、性能の向上や、64 ビット SPARC プログラムでのコードサイズを小さくするなど、さまざまな目的に合わせた各種のコードモデルがあります。コードモデルは以下の要素で決定します。
位置決め方法 (絶対コード、あるいは位置に依存しないコード)
コードサイズ (2G バイト未満)
位置 (下部、中央、アドレス空間内の任意位置)
外部オブジェクト参照モデル (スモールまたはラージ)
次の表は、64 ビット SPARC プログラムで使用できる各種コードモデルを示したものです。
表 6-1 コードモデルの説明
コードモデル |
位置決め方法 |
コードサイズ |
位置 |
外部オブジェクト参照モデル |
---|---|---|---|---|
abs32 |
絶対 |
2G バイト未満 |
下部 (アドレス空間の下位 32 ビット) |
なし |
abs44 |
絶対 |
2G バイト未満 |
中央 (アドレス空間の下位 44 ビット) |
なし |
abs64 |
絶対 |
2G バイト未満 |
任意 |
なし |
pic |
位置に依存しないコード |
2G バイト未満 |
任意 |
スモール (1024 以下の外部オブジェクト) |
PIC |
位置に依存しないコード |
2G バイト未満 |
任意 |
ラージ (2**29 以下の外部オブジェクト) |
スモールコードモデルを使用すると、命令シーケンスを短くできる場合があります。絶対コード内で静的データ参照を行うのに必要な命令の数は、abs32 コードモデルの場合が最も少なく、abs64 が最も多く、abs44 がその中間になります。同様に、pic コードモデルは、PIC コードモデルよりも少ない命令で静的データ参照を行います。その結果、コードモデルが小さいほどコードサイズも小さくなり、ラージコードモデルのような、より完全な機能性を必要としないプログラムの性能が向上します。
使用するコードモデルを指定するには、-xcode=<model> コンパイラオプションを使用する必要があります。現在、コンパイラは 64 ビットオブジェクトに対し、デフォルトで abs64 モデルを使用します。コードは、abs44 コードモデルの使用により最適化できます。より少ない命令を使用して、現在の UltraSPARC プラットフォームがサポートする 44 ビットのアドレス空間を利用できます。
コードモデルについては、SPARC V9 ABI およびコンパイラのマニュアルを参照してください。
abs32 コードモデルでコンパイルしたプログラムは、-M /usr/lib/ld/sparcv9/map.below4G オプションを使用して、4G バイトよりも下方にリンクする必要があります。