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


OpenVMS マニュアル


 

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

タイトルページ
目次
まえがき
第 1 部 : 概念と方法
第 1 章:Macro-32コードの移植の準備
第 2 章:MACROコンパイラのプラットフォームごとの動作
第 3 章:ソースに対する推奨される変更と必要な変更
第 4 章:移植したコードの性能改善
第 5 章:MACROの64ビット・アドレッシングのサポート
第 2 部:リファレンス・セクション
付録 A :MACROコンパイラの修飾子
付録 B :専用の指示文
付録 C :MACROコンパイラ・ビルトイン
付録 D :VAXからAlphaまたはI64への移植用のマクロ
付録 E :64ビット・アドレッシング用のマクロ
索引
PDF
OpenVMS ホーム
HP OpenVMS MACRO コンパイラポーティングおよびユーザーズ・ガイド

HP OpenVMS MACRO コンパイラ
ポーティングおよびユーザーズ・ガイド


目次 索引

第 1 部
概念と方法

第 1 章
Macro-32 コードの移植の準備

この章では, OpenVMS VAX システムから OpenVMS Alpha または OpenVMS Industry Standard 64 システムへの Macro-32 コードの移植を計画する際に使用できる手順について説明します。

この章の主なトピックは以下のとおりです。

  注意
コンパイラの起動方法については, 付録 A を参照してください。



OpenVMS MACRO コンパイラは, OpenVMS VAX システム (VAX MACRO アセンブラ) 向けに記述された Macro-32 ソース・コードをコンパイルして, OpenVMS Alpha システムや OpenVMS I64 システムで動作する機械語コードを生成します。

  注意
このコンパイラは,Macro-32 コードを OpenVMS Alpha システムおよび OpenVMS I64 システムに移植するために提供されています。新規に開発する場合は,中級言語または高級言語を使用することをお勧めします。

変更なしでコンパイルできる VAX MACRO コードもありますが,ほとんどのコード・モジュールでは, OpenVMS Alpha または OpenVMS I64 に移植する際に,エントリ・ポイント指示文の追加が必要となります。多くの場合それ以外の変更も必要となります。

最初のコンパイルでは,コンパイラによってモジュールの問題が数個しか検出されず,それらの問題を修正した後でさらに問題が検出されることがあります。これは,1 つの問題を解決したことによって,コンパイラがさらにコードを調べ,最初の問題の陰に隠れていたその他の問題を検出できるようになったためです。

コンパイラには,この手順を容易にするための機能が多数含まれています。以下のような機能があります。

  • コンパイラが生成するメッセージの種類を制御したり,生成されたコードで VAX と同じ動作をさせるための修飾子。たとえば,/FLAG 修飾子を使用すると,コンパイラが報告する情報メッセージの種類を指定することができます。これらのメッセージの多くは,VAX アーキテクチャへの依存など,移植上の問題を示しています。 /FLAG 修飾子で指定できるオプションには,アラインされていないスタックやメモリの参照の報告や,サポートされていない指示文の報告などがあります。 /FLAG 修飾子についての詳細は, 付録 A, MACRO コンパイラの修飾子 を参照してください。

  • ルーチンのエントリ・ポイントを示してコンパイラに指示する指示文や,コードのセクションに対して VAX と同じ動作を強制する指示文。たとえば .CALL_ENTRY は,呼び出されるルーチンのエントリ・ポイントをコンパイラに対して宣言します。 第 2.3 節第 2.5 節第 3 章 では,コンパイラが特別な指示文を必要とする状況について説明しています ( 付録 B, 専用の指示文 を参照)。

  • OpenVMS Alpha プラットフォームでは, 64 ビット演算を実行する Alpha 命令と Alpha PALcode 命令にアクセスできるようにするためのビルトイン (PALcode は,Privileged Architecture Library codeの略)。たとえば,EVAX_ADDQ を適切なオペランドとともに使用すると,クォドワード加算命令が実行されます ( 付録 C, MACRO コンパイラ・ビルトイン を参照)。

  • OpenVMS I64 プラットフォームの場合,特定の I64 命令にアクセスできるようにするためのビルトイン。また,Alpha から I64 へのコードの移植を支援するために, EVAX_ ビルトインの多くが I64 用に再実装されています ( 付録 C, MACRO コンパイラ・ビルトイン を参照)。

コンパイラは,64 ビット・アドレスをサポートしています。これについては, 第 5 章付録 E に説明があります。 64 ビット・アドレスのサポートは, OpenVMS Alpha Version 7.0 で追加されました。このサポートは,OpenVMS Alpha や OpenVMS I64 でサポートされている高級言語を使用せずに, VAX MACRO を使用して 64 ビットのアドレス空間にアクセスするのが望ましいまれなケース向けに提供されています。

1.2 コンパイラとアセンブラの違い

MACRO コンパイラは,アセンブラではなくコンパイラであることに注意してください。そのため,入力コードに完全に一致する出力コードを作成するわけではありません。最適化処理で,コードが移動,複製,削除され,命令がインターリーブされることがあります。さらに,移植されたコードに誤りがあった場合の動作は,それに対応する VAX コードの動作と同じにならないことがあります。これらの違いについては,以降の項で説明します。

1.2.1 コードの移動

OpenVMS Alpha システムや OpenVMS I64 システムでは,分岐予測が間違っていた場合のコストが高くなります。コンパイラは,モジュール内の最も可能性が高いコード・パスを判断し,そのコード・パスをつなげたコードを生成します。可能性が低いと判断されたコード・パスは,モジュールの後ろの方に移動されます。次の例を考えます。

        $ASSIGN_S       DEVNAM=DEVICE,CHAN=CHANNEL 
        BLBS    R0,10$ 
        JSB     PROCESS ERROR 
        HALT 
10$: 

この例で,コンパイラは HALT を可能性が低いコード・パスと判断し,また 2 つのコード・ストリームが 10$ で再結合されないことを検出します。これらの条件により,この分岐が実行される可能性が高いと判断されます。次に,間にある命令をモジュールの後ろに移動し, BLBS 命令を,移動したコードに分岐する BLBC 命令に変更し,次のようにラベル 10$ の位置からインライン・コードの生成を続行します。

        $ASSIGN_S       DEVNAM=DEVICE,CHAN=CHANNEL 
        BLBC    L1$ 
10$:      . 
          . 
          . 
        (routine exit) 
L1$:    JSB     PROCESS ERROR 
        HALT 

コンパイラ指示文 .BRANCH_LIKELY および .BRANCH_UNLIKELY を使用することで,コンパイラによる条件分岐の可能性の判断を変更することができます ( 第 4.2 節 を参照)。

1.2.2 コードの複製

コンパイラは,小さいコード・セクションを何度も複製して,過剰な分岐をなくすことがあります。たとえば,次の VAX コードへの分岐をコンパイルするときに,コンパイラは ERROR1 へ分岐するそれぞれの場所に MOVL を複製し,直接 COMMON_ERROR に分岐するように変更することがあります。

ERROR1: MOVL    #ERROR1,R0 
        BRW     COMMON_ERROR 



1.2.3 コードの削除

コンパイラの最適化処理によって,一部の命令がコードの流れに無関係と判断されることがあります。そのような場合,命令は削除されます。このような例としては,次のように,後続の条件分岐がない CMP 命令や TST 命令があります。

        CMPB    (R2),511(R2) 
        JSB     EXE$SENDMSG 

この CMPB 命令を削除すると,命令の目的が, 2 箇所のメモリ位置にアクセスし,ルーチンを呼び出す前にメモリ・ページをページ・インさせることだった場合には,問題が発生します。このような部分は,OpenVMS Alpha や OpenVMS I64 に移植する際には, VAX と Alpha または I64 のページ・サイズが異なるため,いずれにせよ変更が必要となる可能性があります。ページ・サイズの変更に加えて,次のように命令を MOVx 命令に置き換える必要があります。

        MOVB    (R2),R1 
        MOVB    8191(R2),R0 
        JSB     EXE$SENDMSG 

この 2 つの MOVB 命令では,2 つの異なるレジスタを対象としている点に注意してください。現在コンパイラは,レジスタに値をロードする命令の後で,一度も読み込まれることなくそのレジスタが上書きされる場合でも,その命令を削除しません。しかし,将来この最適化が実装される可能性があります。

  注意
一般に,メモリの読み取り参照で実際にメモリがアクセスされる必要があるコードの存在は,慎重に調べる必要があります。現在または将来の最適化で,メモリ参照が移動または削除される可能性があるためです。



デフォルトで実行される命令のスケジューリング ( 第 4.3 節 を参照) により, 1 つの VAX 命令から生成された Alpha または Itanium の命令と,周りの VAX 命令から生成された Alpha または Itanium の命令がインターリーブされます。

1.2.5 予約オペランド・フォルト

VAX システムでは,一部の VAX MACRO 命令で,特定のオペランドが必要な範囲にないと予約オペランド・フォルトが発生することがあります。たとえば,INSV などのビット操作命令では,サイズ・オペランドが 32 よりも大きいと, VAX システムは実行時予約オペランド・フォルトを生成します。

OpenVMS Alpha システムと OpenVMS I64 システムでは,範囲外のオペランドがコンパイル時の定数の場合は,コンパイラがこの条件を検出してエラー・メッセージを出力します。しかし,このオペランドが実行時の変数の場合は,コンパイラは実行時の範囲チェックを生成しません。オペランドが範囲外の場合,この命令の実行によって誤った結果が生成されますが,フォルトにはなりません。

1.3 OpenVMS VAX から OpenVMS Alpha または OpenVMS I64 への段階的な移植手順

以下の手順は, VAX MACRO コードを OpenVMS Alpha または OpenVMS I64 に移植するための効率の良い方法であることが実証されています。

  1. 移植する各モジュールを最初から最後まで調べ,正常な移植を阻害するようなコーディング・スタイルになっていないことを確認します。このような調査が必要なのは, VAX アーキテクチャについての広範な知識を利用した,無数の創意に富んだ用法を備えた VAX MACRO コードを扱うことは,コンパイラにとって不可能なためです。このようなコードが発見されずにそのままになっていると, VAX MACRO コードを OpenVMS Alpha または OpenVMS I64 に移植するという努力が根底から覆される可能性があります。

  2. モジュールの各エントリ・ポイントに,適切なエントリ・ポイント指示文を追加してください。
    このような指示文には次のものがあります。

    • .CALL_ENTRY

    • .JSB_ENTRY

    • .JSB32_ENTRY

    • .EXCEPTION_ENTRY (Alpha システムのみ)


    .CALL_ENTRY 句を使用したい場合以外は, VAX MACRO のエントリ・ポイント .ENTRY を .CALL_ENTRY に変更する必要はありません。また,ここでレジスタ引数を追加する必要もありません。
    これらの指示文を正しく配置するためのガイドラインについては, 第 2.3 節 を参照してください。
    それぞれの指示文の完全な構文の説明については, 付録 B を参照してください。

  3. コンパイラを起動してモジュールをコンパイルします。これを実行するために推奨されるコマンド・プロシージャを 第 2.12 節 に示します。
    アラインされていないスタックおよびメモリの参照,ルーチンの分岐,問題が起きる可能性がある命令,自己変更コードがあると,デフォルトでは,コンパイラがエラーを出力します。コマンド行で /FLAG=HINTS を指定すると,コンパイラは,手順 2 で挿入したエントリ・ポイント指示文の input および output レジスタ引数に対する忠告を出力します。

  4. コンパイラによって報告される問題に注目します。
    通常 MACRO コンパイラは, OpenVMS Alpha システムと OpenVMS I64 システムで同じメッセージを生成しますが,以下の接頭辞だけは例外です。

    • OpenVMS Alpha システム上の AMAC

    • OpenVMS I64 システム上の IMAC


    AMAC-I-ARGLISHOME, argument list must be homed in caller 
    


    または

    IMAC-I-ARGLISHOME, argument list must be homed in caller 
    


    Help Message ユーティリティを呼び出して,表示された各コンパイラ・メッセージに対する説明やユーザの対処を参照することができます。
    Help Message ユーティリティについては,DCL ヘルプまたは OpenVMS System Messages: Companion Guide for Help Message Users を参照してください。また, 第 1.5 節第 3 章 では, OpenVMS Alpha や OpenVMS I64 に直接変換できない VAX MACRO のコーディング・スタイルについて詳細に説明しています。
    このパスで見つかった問題に対処することで,コンパイラは以降のパスでその他の問題を発見できるようになります。

  5. Macro-32 ソース・コードを編集します。コンパイラによって指摘された問題を修正し,コンパイラが見逃した問題が他にないか探します。
    ただし,コンパイラが情報として出力する診断メッセージが出ないようにするためだけにコードを変更することはしないでください。情報レベルのメッセージのほとんどは,正常にコンパイルできるものの, OpenVMS Alpha や OpenVMS I64 では最適な性能が発揮できないコードを指摘するためにあります。 ソース・コード中の問題のある命令の調査を終え,問題がなくなったと確信したら,コードの修正を終了します。コマンド行修飾子 /FLAG と /WARN を使用して,診断メッセージの生成を制御できる点に注意してください。また,.ENABLE 指示文と .DISABLE 指示文を使用すると,モジュール内のコードの一部分で情報レベルのメッセージの表示をオフにすることができます。

  6. 手順 2 で追加したエントリ・ポイント指示文に, inputoutputpreserve,および scratch 引数のうち適切なものを追加し,指定した各引数に該当するレジスタのリストを指定します。指定するレジスタの決定方法については, 第 2.6 節 を参照してください。

  7. OpenVMS I64 システムの場合は,リンケージ指示文 (.CALL_LINKAGE,.DEFINE_LINKAGE) を追加し, R0/R1 以外のレジスタに値を返すルーチンと, Macro-32 以外の言語で記述された,JSB 命令で呼び出されるルーチンについて,コンパイラに指示します。また,ルーチンの戻りが標準的でない場合は,間接的な CALLS/CALLG 命令のそれぞれに .USE_LINKAGE 指示文を追加します。さらに,ルーチンが Macro-32 以外の言語で記述されている場合は,それぞれの間接 JSB 命令に .USE_LINKAGE 指示文を追加します。詳細は, 付録 B を参照してください。

  8. Macro-32 ソース・コードに対して,コンパイラから情報メッセージ以外が出力されず, OpenVMS Alpha または OpenVMS I64 の正しいオブジェクト・コードが生成されるようになるまで,手順 3 〜 7 を繰り返します。

  9. モジュールが OpenVMS VAX と OpenVMS Alpha または OpenVMS I64 システムで共通な場合は ( 第 1.7 節 に示すコーディング規約を参照), VAX MACRO アセンブラとコンパイラの両方でエラーがなくなるまで移植作業は終わりではありません。

VAX MACRO モジュールの移植に関してある程度経験を積むと,ソースを調べて問題を発見し,コンパイラを実行する前にそれを修正するのは,比較的容易になります。

1.4 OpenVMS Alpha から OpenVMS I64 への段階的な移植手順

すでに OpenVMS Alpha で動作している VAX MACRO コードを OpenVMS I64 に移植するのは,比較的簡単な作業です。 OpenVMS VAX からの移植と違い,ほとんどの VAX MACRO コードは変更なしで再コンパイルすることができます。

OpenVMS Alpha と OpenVMS I64 の間の呼び出し規則の違いにより,コンパイラは以下の点について知る必要があります。

  • JSB 命令または BSBW 命令を使用して, VAX MACRO で記述されていないコードにジャンプするような MACRO コード

  • CALLS 命令または CALLG 命令を使用して, R0 や R1 以外のレジスタに値を返すルーチンを呼び出す MACRO コード

R0/R1 以外のレジスタに値を返すルーチンと, JSB/BSBW 命令で呼び出される Macro-32 以外の言語で記述されたルーチンについてコンパイラに指示するために,リンケージ指示文 (.CALL_LINKAGE,.DEFINE_LINKAGE) を追加する必要があります。また,ルーチンが標準でない戻り方をする場合には,それぞれの間接 CALLS/CALLG 命令に .USE_LINKAGE 指示文を追加する必要があります。ルーチンが Macro-32 以外の言語で記述されている場合は,それぞれの間接 JSB/BSBW 命令に .USE_LINKAGE 指示文を追加します。詳細は, 付録 B, 専用の指示文 を参照してください。


目次 索引

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