日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第1章:はじめに
第2章:基本的な相違点
第3章:アプリケーションの調査
第4章:ソース・モジュールの移行
第5章:OpenVMS I64 開発環境
第6章:ポーティングの準備
第7章:その他の検討事項
付録A :アプリケーション評価チェックリスト
付録B :サポート対象外のレイヤード・プロダクト
付録C :アプリケーション固有のスタック切り換えコードの I64 へのポーティング
用語集
索引
PDF
OpenVMS ホーム

HP OpenVMS
OpenVMS Alpha から OpenVMS I64 へのアプリケーション・ポーティング・ガイド


目次 索引

レジスタ番号 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 のマッピングは次のようになります。

16 = GEM_TS_REG_K_R32 
17 = GEM_TS_REG_K_R33     
18 = GEM_TS_REG_K_R34     
19 = GEM_TS_REG_K_R35 
20 = GEM_TS_REG_K_R36 
21 = GEM_TS_REG_K_R37 

ALPHA_REGISTER_MAPPING と "NOTUSED"

ALPHA_REGISTER_MAPPING を指定すると, IA64 のスクラッチ・レジスタにマッピングされリンク宣言で NOTUSED が指定された Alpha レジスタは, PRESERVE セットに配置されます。

これにより,このレジスタを NOTUSED と宣言しているルーチンを実行するときにレジスタが退避され,ルーチンから抜けるときに復元されます。

/ANNOTATIONS 修飾子

OpenVMS I64 BLISS コンパイラでは,新しいコンパイル修飾子 /ANNOTATIONS がサポートされます。この修飾子は,コンパイル時にコンパイラが行っている (または行っていない) 最適化に関する情報をソース・リストに追加します。

この修飾子は,以下のキーワードにより,リストする情報を選択できます。

  • ALL

  • NONE

  • CODE --- マシン・コード・リストの注釈に使用されます。現在は NOP インストラクションにのみ,注釈が付けられます。

  • DETAIL --- 他のキーワードと組み合わせて使用し,詳細情報を提供します。

他のキーワードは GEM 最適化の情報を選択できます。

INLINING
LINKAGES
LOOP_TRANSFORMS
LOOP_UNROLLING
PREFETCHING
SHRINKWRAPPING
SOFTWARE_PIPELINING
TAIL_CALLS
TAIL_RECURSION

ALL と NONE を除き,他のすべてのキーワードは否定形にすることができます。修飾子自体を否定することもできます。デフォルトでは,修飾子はコマンド・ラインに指定されません。

/ANNOTATIONS 修飾子だけを指定し,パラメータを指定しなかった場合,デフォルトは ALL になります。

/ALPHA_REGISTER_MAPPING 修飾子

OpenVMS I64 BLISS コンパイラでは,ソースを変更せずに ALPHA_REGISTER_MAPPING を有効にすることができる新しいコンパイル修飾子がサポートされます。これは位置依存修飾子です。モジュールのコンパイル行にこの修飾子を指定すると,モジュール・ヘッダに ALPHA_REGISTER_MAPPING スイッチを設定した場合と同じ効果があります。

/ALPHA_REGISTER_MAPPING 情報メッセージ

OpenVMS I64 BLISS では,3 つの新しい情報メッセージが追加されています。

  • /ALPHA_REGISTER_MAPPING 修飾子をコマンド・ラインに指定すると,以下のメッセージが表示されます。

        %BLS64-I-TEXT, Alpha Register Mapping enabled by the command line 
    

  • スイッチ ALPHA_REGISTER_MAPPING をモジュール・ヘッダに指定するか,または SWITCH 宣言の引数として指定すると,以下のメッセージが表示されます。

        MODULE SIMPLE (MAIN=TEST, ALPHA_REGISTER_MAPPING)= 
        ..........................^ 
        %BLS64-I-TEXT, Alpha Register Mapping enabled 
    

  • スイッチ NOALPHA_REGISTER_MAPPING をモジュール・ヘッダに指定するか,または SWITCH 宣言の引数として指定すると,以下のメッセージが表示されます。

        MODULE SIMPLE (MAIN=TEST, NOALPHA_REGISTER_MAPPING)= 
        ..........................^ 
        %BLS64-I-TEXT, Alpha Register Mapping disabled 
    

不可分な操作のための ADD,AND,OR 組み込み関数

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) を設定します。スイッチはモジュール・ヘッダでも使用できます。最も優先順位が低いのはコマンド・ライン修飾子です。

シフト (Shift) 組み込み関数

OpenVMS I64 BLISS では,既知の方向にシフトを行う組み込み関数がサポートされます。これらの組み込み関数の一覧については, マシン固有の組み込み関数 を参照してください。これらの関数は,0..%BPVAL-1 の範囲で行われるシフトに対してだけ有効です。

比較 (Compare) およびスワップ (Swap) 組み込み関数

OpenVMS Alpha と OpenVMS I64 の両方の BLISS で,以下の新しい比較およびスワップ組み込み関数がサポートされます。

  • CMP_SWAP_LONG(addr, comparand, value)

  • CMP_SWAP_QUAD(addr, comparand, value)

これらの関数は,addr にあるロングワードまたはクォドワードを comparand と比較し,等しい場合は値を addr にストアするという,連動した操作を実行します。操作の成功 (1) または失敗 (0) を示すインジケータが返されます。

I64 固有のマルチメディア・インストラクション

I64 固有のマルチメディア・タイプのインストラクションへのアクセスをサポートする計画はありません。

リンケージ

CALL リンケージ

OpenVMS Alpha BLISS に関してここで説明する CALL リンケージは,OpenVMS I64 BLISS でもサポートされます。

32 ビット・コンパイラでコンパイルされたルーチンは, 64 ビット・コンパイラでコンパイルされたルーチンを呼び出すことができ,その逆も可能です。 64 ビットから 32 ビットに短縮される場合はパラメータが切り捨てられ,32 ビットから 64 ビットに拡張される場合は符号拡張されます。

デフォルト設定では,CALL リンケージは引数の数を渡します。この設定は,NOCOUNT リンケージ・オプションを使用することで無効にすることができます。

引数はクォドワードで渡されますが,32 ビット・コンパイラは下位 32 ビットしか「確認」できません。

JSB リンケージ

OpenVMS I64 BLISS コンパイラには JSB リンケージ・タイプがあります。 JSB リンケージで宣言されたルーチンは,OpenVMS I64 用に開発された JSB ルールに従います。

/[NO]TIE 修飾子

この修飾子のサポートは,OpenVMS I64 でも継続されます。デフォルトは /NOTIE です。

コンパイルされたコードから変換されたイメージを呼び出したり,変換されたイメージからコンパイルされたコードを呼び出す必要がある場合には,TIE を使用すると,コンパイルされたコードと変換されたイメージとを組み合わせて使用できます。

特に,TIE は以下の操作を行います。

  • コンパイルされたプログラムにプロシージャ・シグネチャ情報を挿入します。この結果,サイズが大きくなる可能性があり,リンク時とイメージ起動時に処理される再配置の回数も多くなる可能性がありますが,その他の点ではパフォーマンスへの影響はありません。

  • プロシージャ値の呼び出し (間接呼び出しまたは演算呼び出しとも呼ばれます) が,サービス・ルーチン (OTS$CALL_PROC) を使用してコンパイルされます。このルーチンは,ターゲット・プロシージャが IPF のネイティブ・コードなのか,変換されたイメージ内にあるのかを判断し,結果に従って操作を続行します。

/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 では,以下の標準関数がサポートされます。

  • %FFLOAT

  • %DFLOAT

  • %GFLOAT

  • %SFLOAT

  • %TFLOAT

新しいレキシカルと拡張されたレキシカル

OpenVMS I64 のコンパイラ BLISS32I と BLISS64I をサポートするために,以下の新しいコンパイラ状態レキシカルが BLISS に追加されました。

  • %BLISS は BLISS32V,BLISS32E,BLISS64E,BLISS32I,および BLISS64I を認識するようになりました。
    %BLISS(BLISS32) は,すべての 32 ビット BLISS コンパイラの場合に真になります。
    %BLISS(BLISS32V) は,VAX BLISS (BLISS-32) の場合だけ真になります。
    %BLISS(BLISS32E) は, 32 ビット Alpha コンパイラの場合に真になります。
    %BLISS(BLISS64E) は, 64 ビット Alpha コンパイラの場合に真になります。
    %BLISS(BLISS32I) は, 32 ビット I64 コンパイラの場合に真になります。
    %BLISS(BLISS64I) は, 64 ビット I64 コンパイラの場合に真になります。

  • レキシカル %BLISS32I と %BLISS64I が追加されました。その動作は,%BLISS に対する新しいパラメータと同様です。

  • %HOST および %TARGET レキシカルのキーワードにおける Intel Itanium アーキテクチャのサポートが,OpenVMS I64 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 属性には,以下のルールが適用されます。

  • SHORT 属性に指定された PSECT 名がまだ宣言されていない場合は,SHORT 属性にその名前が指定されることで宣言が成立します。 SHORT 属性を含む PSECT の属性は,SHORT 属性に指定された PSECT の属性になりますが, SHORT 属性で宣言された PSECT 名は SHORT 属性を持たず,GP_RELATIVE 属性を持ちます。

  • SHORT 属性に指定された PSECT 名が以前に宣言されている場合は,PSECT の属性は変更されません。 SHORT 属性に指定された PSECT に GP_RELATIVE 属性がない場合には,警告メッセージが生成されます。

  • ストレージ・クラスが OWN,GLOBAL,PLIT のいずれかのデータ・オブジェクトのサイズが 8 バイト以下であり,SHORT 属性を含む PSECT に割り当てるように指定された場合,そのオブジェクトは,SHORT属性に指定されている PSECT に割り当てられます。これは,1 ステップのプロセスであり,再帰的ではありません。ショート・データ・オブジェクトに SHORT 属性によって名前が変更された割り当て PSECT が含まれている場合,名前が変更された PSECT の SHORT 属性は,その後の名前変更の対象として考慮されません。

  • 8 バイトより大きなサイズのデータ・オブジェクトは, SHORT 属性を無視します。

  • CODE,INITIAL,および LINKAGE ストレージ・クラスのデータ・オブジェクトは,そのサイズに関係なく,SHORT 属性を無視します。

  • SHORT 属性による PSECT 名の変更では, PLIT データの前にあるカウント・ワードのサイズは PLIT オブジェクトのサイズに含まれません。


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 

  注意

  • A1,X2,Y2,および P5 の割り当ては呼び出し規則に違反します。これらの変数は,C や C++ などの他の言語と共有できません。 BLISS および MACRO で書かれたモジュールとの共有は可能です。

  • 現在の OpenVMS I64 BLISS の設計では, EXTERNAL 変数参照で GP_RELATIVE アドレッシング・モードはサポートされていません。しかし,EXTERNAL変数で使用される通常の GENERAL アドレッシング・モードは, GP_RELATIVE セクションを正しく参照します。現時点では,ADDRESSING_MODE(GP_RELATIVE) 属性を BLISS に追加する予定はありません。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.