![]() |
![]() |
日本-日本語 | ![]() |
|
|
|
![]() |
![]() OpenVMS マニュアル |
|
![]() |
HP OpenVMS
|
目次 | 索引 |
レジスタ番号 16 〜 20,26 〜 28,30 〜 31 のマッピングは, OpenVMS I64 BLISS では,無効な指定であると解釈されるレジスタに変換されます ( Alpha BLISS のレジスタ名 および I64 のレジスタ を参照)。 ALPHA_REGISTER_MAPPING が指定されているときに,これらのレジスタを含む宣言を行うと,以下のようなエラーが発生します。
r30 = 30, .........^ %BLS64-W-TEXT, Alpha register 30 cannot be declared, invalid mapping to IPF register 12 at line number 9 in file ddd:[xxx]TESTALPHAREGMAP.BLI |
ソース行にはレジスタ番号 30 が指定されていますが,エラー・テキストにはレジスタ 12 に問題があることが示されています。レジスタ 12 はレジスタ番号 30 が変換された結果であり,指定するとエラーになります。
Alpha のレジスタ R16 〜 R21 がリンケージ I/O パラメータとして指定されている場合は,これらのレジスタに対して特殊なマッピング・セットが用意されています。
![]() | 注意 リンケージ I/O パラメータのみの場合は, R16 〜 R21 のマッピングは次のようになります。
|
ALPHA_REGISTER_MAPPING と "NOTUSED"
ALPHA_REGISTER_MAPPING を指定すると, IA64 のスクラッチ・レジスタにマッピングされリンク宣言で NOTUSED が指定された Alpha レジスタは, PRESERVE セットに配置されます。
これにより,このレジスタを NOTUSED と宣言しているルーチンを実行するときにレジスタが退避され,ルーチンから抜けるときに復元されます。
OpenVMS I64 BLISS コンパイラでは,新しいコンパイル修飾子 /ANNOTATIONS がサポートされます。この修飾子は,コンパイル時にコンパイラが行っている (または行っていない) 最適化に関する情報をソース・リストに追加します。
この修飾子は,以下のキーワードにより,リストする情報を選択できます。
他のキーワードは GEM 最適化の情報を選択できます。
INLINING
LINKAGES
LOOP_TRANSFORMS
LOOP_UNROLLING
PREFETCHING
SHRINKWRAPPING
SOFTWARE_PIPELINING
TAIL_CALLS
TAIL_RECURSION
ALL と NONE を除き,他のすべてのキーワードは否定形にすることができます。修飾子自体を否定することもできます。デフォルトでは,修飾子はコマンド・ラインに指定されません。
/ANNOTATIONS 修飾子だけを指定し,パラメータを指定しなかった場合,デフォルトは ALL になります。
OpenVMS I64 BLISS コンパイラでは,ソースを変更せずに ALPHA_REGISTER_MAPPING を有効にすることができる新しいコンパイル修飾子がサポートされます。これは位置依存修飾子です。モジュールのコンパイル行にこの修飾子を指定すると,モジュール・ヘッダに ALPHA_REGISTER_MAPPING スイッチを設定した場合と同じ効果があります。
/ALPHA_REGISTER_MAPPING 情報メッセージ
OpenVMS I64 BLISS では,3 つの新しい情報メッセージが追加されています。
%BLS64-I-TEXT, Alpha Register Mapping enabled by the command line |
MODULE SIMPLE (MAIN=TEST, ALPHA_REGISTER_MAPPING)= ..........................^ %BLS64-I-TEXT, Alpha Register Mapping enabled |
MODULE SIMPLE (MAIN=TEST, NOALPHA_REGISTER_MAPPING)= ..........................^ %BLS64-I-TEXT, Alpha Register Mapping disabled |
OpenVMS I64 BLISS では,不可分 (atomic) なメモリ更新のために, ADD_ATOMIC_XXXX,AND_ATOMIC_XXXX,および OR_ATOMIC_XXXX 組み込み関数がサポートされます。これらの組み込み関数の一覧については, マシン固有の組み込み関数 を参照してください。
これらの組み込み関数をサポートする I64 インストラクションは,操作が正常終了するまで待つため,オプションの retry-count 入力パラメータは除外されています。これらの組み込み関数の形式は以下のように変更されました。
option_ATOMIC_size(ptr, expr [;old_value] ) !Optional output |
ここで,
option は AND,ADD,OR のいずれかです。
size は LONG または QUAD です。
ptr は自然なアラインメントのアドレスでなければなりません。
返される値は 0 (操作失敗) または 1 (操作成功) です。
操作は,式 expr の,ptr によって示されるデータ・セグメントへの不可分な加算 (または AND もしくは OR) です。
オプションの出力パラメータ old_value は,ptr によって示されるデータ・セグメントの以前の値に設定されます。
OpenVMS Alpha BLISS のオプションの retry-count パラメータを使用すると,構文エラーになります。
不可分な操作のための TESTBITxxI および TESTBITxx 組み込み関数
OpenVMS I64 BLISS では,不可分な操作のために TESTBITxxI および TESTBITxx 組み込み関数がサポートされます。サポートされる組み込み関数の一覧については, マシン固有の組み込み関数 を参照してください。
これらの組み込み関数をサポートする I64 インストラクションは,操作が正常終了するのを待機するので,オプションの入力パラメータ retry-count とオプションの出力パラメータ success_flag は取り除かれています。これらの組み込み関数の形式は以下のとおりです。
TESTBITxxx( field ) |
OpenVMS Alpha BLISS のオプションのパラメータ retry-count や success_flag を使用すると,構文エラーになります。
OpenVMS I64 BLISS では,ここで説明する /GRANULARITY=keyword 修飾子,スイッチ DEFAULT_GRANULARITY=n,およびデータ属性 GRANULARITY(n) がサポートされます。
ユーザはコマンド・ライン修飾子 /GRANULARITY=keyword,スイッチ DEFAULT_GRANULARITY=n,およびデータ属性 GRANULARITY(n) を使用することにより,ストアとフェッチの単位 (Granularity) を制御できます。
コマンド・ライン修飾子に指定するキーワードは, BYTE,LONGWORD または QUADWORD でなければなりません。値 n は,0 (バイト),2 (ロングワード) または 3 (クォドワード) でなければなりません。
これらを組み合わせて使用した場合,優先順位が最も高いのはデータ属性です。 SWITCHES 宣言でスイッチを使用した場合,同じスコープ内でその後に宣言されるデータの単位 (Granularity) を設定します。スイッチはモジュール・ヘッダでも使用できます。最も優先順位が低いのはコマンド・ライン修飾子です。
OpenVMS I64 BLISS では,既知の方向にシフトを行う組み込み関数がサポートされます。これらの組み込み関数の一覧については, マシン固有の組み込み関数 を参照してください。これらの関数は,0..%BPVAL-1 の範囲で行われるシフトに対してだけ有効です。
比較 (Compare) およびスワップ (Swap) 組み込み関数
OpenVMS Alpha と OpenVMS I64 の両方の BLISS で,以下の新しい比較およびスワップ組み込み関数がサポートされます。
これらの関数は,addr にあるロングワードまたはクォドワードを comparand と比較し,等しい場合は値を addr にストアするという,連動した操作を実行します。操作の成功 (1) または失敗 (0) を示すインジケータが返されます。
I64 固有のマルチメディア・タイプのインストラクションへのアクセスをサポートする計画はありません。
OpenVMS Alpha BLISS に関してここで説明する CALL リンケージは,OpenVMS I64 BLISS でもサポートされます。
32 ビット・コンパイラでコンパイルされたルーチンは, 64 ビット・コンパイラでコンパイルされたルーチンを呼び出すことができ,その逆も可能です。 64 ビットから 32 ビットに短縮される場合はパラメータが切り捨てられ,32 ビットから 64 ビットに拡張される場合は符号拡張されます。
デフォルト設定では,CALL リンケージは引数の数を渡します。この設定は,NOCOUNT リンケージ・オプションを使用することで無効にすることができます。
引数はクォドワードで渡されますが,32 ビット・コンパイラは下位 32 ビットしか「確認」できません。
OpenVMS I64 BLISS コンパイラには JSB リンケージ・タイプがあります。 JSB リンケージで宣言されたルーチンは,OpenVMS I64 用に開発された JSB ルールに従います。
この修飾子のサポートは,OpenVMS I64 でも継続されます。デフォルトは /NOTIE です。
コンパイルされたコードから変換されたイメージを呼び出したり,変換されたイメージからコンパイルされたコードを呼び出す必要がある場合には,TIE を使用すると,コンパイルされたコードと変換されたイメージとを組み合わせて使用できます。
特に,TIE は以下の操作を行います。
/ENVIRONMENT=([NO]FP) および ENVIRONMENT([NO]FP)
OpenVMS Alpha BLISS では, /ENVIRONMENT=([NO]FP) 修飾子と ENVIRONMENT([NO]FP) スイッチが提供されており,これらを使用すると,コンパイラは特定の整数除算に対して浮動小数点レジスタの使用を禁止します。
しかし,OpenVMS I64 BLISS では,I64 のアーキテクチャ上の機能により, /ENVIRONMENT=NOFP コマンド修飾子および ENVIRONMENT(NOFP) スイッチは,浮動小数点レジスタの使用を完全に禁止するわけではありません。ソース・コードでは浮動小数点演算は使用しないように制限されますが,特定の演算 (特に整数乗算と整数除算,およびそれを暗黙に含む構造) 用に生成されたコードでは,一部の浮動小数点レジスタだけを使用するように制限されます。特に,このオプションを指定した場合,コンパイラは f6 〜 f11 だけを使用するように制限され,『Intel Itanium Processor-Specific Application Binary Interface』で説明している ELF EF_IA_64_REDUCEFP オプションを設定します。
/ENVIRONMENT=FP コマンド修飾子と ENVIRONMENT(FP) スイッチには影響ありません。
ここでは,BLISS コンパイラを使った浮動小数点演算のサポートについて説明します。
BLISS では,浮動小数点数値に関して,高いレベルのサポートは提供されません。浮動小数点リテラルを作成する機能はサポートされます。また,浮動小数点演算および変換操作を行うためのマシン固有の組み込み関数も用意されています。サポートされる組み込み関数の一覧については, マシン固有の組み込み関数 を参照してください。
どの浮動小数点組み込み関数もオーバーフローは検出しないため,値を返しません。
OpenVMS I64 BLISS でサポートされる浮動小数点リテラルは,OpenVMS Alpha BLISS の場合と同じで,%E,%D,%G,%S,および %T がサポートされます。
I64 浮動小数点レジスタの直接使用はサポートされていません。
浮動小数点パラメータを受け渡しする BLISS 以外のルーチンの呼び出し
値渡しで浮動小数点パラメータを受け取り,浮動小数点値または複素数値を返す BLISS 以外の標準ルーチンを呼び出すことができます。
OpenVMS I64 の BLISS では,以下の標準関数がサポートされます。
OpenVMS I64 のコンパイラ BLISS32I と BLISS64I をサポートするために,以下の新しいコンパイラ状態レキシカルが BLISS に追加されました。
OpenVMS I64 BLISS での IPF ショート・データ・セクションのサポート
IPF 呼び出し規則では,8 バイト以下のサイズのグローバル・データ・オブジェクトはすべて,ショート・データ・セクションに割り振ることが要求されています。
ショート・データ・セクションのアドレスは, GP ベース・レジスタの内容に 22 ビット・リテラルを加算する効率のよいコード・シーケンスによって設定されます。このコード・シーケンスは,すべてのショート・データ・セクションを組み合わせたサイズを制限します。ショート・データ・セクションに割り当てられたデータ容量の合計が 2**22 バイトを超えると,リンカ・エラーが発生します。 IPF のコンパイラは,ショート・グローバル・データ・セクションおよびショート・エクスターナル・データ・セクションにアクセスするときに, GP 相対アドレッシングを使用できます。
OpenVMS I64 BLISS は,PSECT 属性 GP_RELATIVE および新しい PSECT 属性 SHORT に対して,新しい動作を実行します。この新しい属性はショート・データ・セクションの割り当てをサポートします。
PSECT 属性として GP_RELATIVE キーワードを指定すると,PSECT はショート・データを含むセクションとしてラベルが付けられるため,リンカは GP ベース・アドレスの近くに PSECT を割り振ります。
SHORT 属性の構文は以下のとおりです。
SHORT ( psect-name ) |
SHORT 属性には,以下のルールが適用されます。
BLISS コードで PSECT を使用する例を以下に示します。
PSECT NODEFAULT = $GLOBAL_SHORT$ (READ,WRITE,NOEXECUTE,NOSHARE,NOPIC,CONCATENATE,LOCAL,ALIGN(3), GP_RELATIVE), ! The above declaration of $GLOBAL_SHORT$ is not needed. If the above ! declaration were deleted then the SHORT($GLOBAL_SHORT$) attribute in ! the following declaration would implicitly make an identical ! declaration of $GLOBAL_SHORT$. GLOBAL = $GLOBAL$ (READ,WRITE,NOEXECUTE,NOSHARE,NOPIC,CONCATENATE,LOCAL,ALIGN(3), SHORT($GLOBAL_SHORT$)), NODEFAULT = MY_GLOBAL (READ,WRITE,NOEXECUTE,SHARE,NOPIC,CONCATENATE,LOCAL,ALIGN(3)), PLIT = $PLIT$ (READ,NOWRITE,NOEXECUTE,SHARE,NOPIC,CONCATENATE,GLOBAL,ALIGN(3), SHORT($PLIT_SHORT$)); GLOBAL X1, ! allocated in $GLOBAL_SHORT$ Y1 : VECTOR[2,LONG], ! allocated in $GLOBAL_SHORT$ Z1 : VECTOR[3,LONG], ! allocated in $GLOBAL$ A1 : PSECT(MY_GLOBAL), ! allocated in MY_GLOBAL B1 : VECTOR[3,LONG] PSECT(MY_GLOBAL), ! allocated in MY_GLOBAL C1 : VECTOR[3,LONG] PSECT($GLOBAL_SHORT$); ! allocated in $GLOBAL_SHORT$ PSECT GLOBAL = MY_GLOBAL; ! use MY_GLOBAL as default for both noshort/short GLOBAL X2, ! allocated in MY_GLOBAL Y2 : VECTOR[2,LONG], ! allocated in MY_GLOBAL Z2 : VECTOR[3,LONG], ! allocated in MY_GLOBAL A2 : PSECT($GLOBAL$), ! allocated in $GLOBAL_SHORT$ B2 : VECTOR[3,LONG] PSECT($GLOBAL$); ! allocated in $GLOBAL$; ! Note that the allocations of A1, X2 and Y2 violate the calling ! standard rules. These variables cannot be shared with other ! languages, such as C or C++. PSECT GLOBAL = $GLOBAL$; ! back to using $GLOBAL$/$GLOBAL_SHORT$ as default noshort/short GLOBAL BIND P1 = UPLIT("abcdefghi"), ! allocated in $PLIT$ P2 = PLIT("abcdefgh"), ! allocated in $PLIT_SHORT$ P3 = PSECT(GLOBAL) PLIT("AB"), ! allocated in $GLOBAL_SHORT$ p4 = PSECT($PLIT_SHORT$) PLIT("abcdefghijklmn"), ! allocated in $PLIT_SHORT$ P5 = PSECT(MY_GLOBAL) PLIT("AB"); ! allocated in MY_GLOBAL |
![]() | 注意
|
目次 | 索引 |
![]() |
||||||||
|