日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS MACRO コンパイラ
|
目次 | 索引 |
この章では, OpenVMS VAX システムから OpenVMS Alpha または OpenVMS Industry Standard 64 システムへの Macro-32 コードの移植を計画する際に使用できる手順について説明します。
この章の主なトピックは以下のとおりです。
注意 コンパイラの起動方法については, 付録 A を参照してください。 |
1.1 MACRO コンパイラの機能 |
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 つの問題を解決したことによって,コンパイラがさらにコードを調べ,最初の問題の陰に隠れていたその他の問題を検出できるようになったためです。
コンパイラには,この手順を容易にするための機能が多数含まれています。以下のような機能があります。
コンパイラは,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 |
コンパイラの最適化処理によって,一部の命令がコードの流れに無関係と判断されることがあります。そのような場合,命令は削除されます。このような例としては,次のように,後続の条件分岐がない 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 つの異なるレジスタを対象としている点に注意してください。現在コンパイラは,レジスタに値をロードする命令の後で,一度も読み込まれることなくそのレジスタが上書きされる場合でも,その命令を削除しません。しかし,将来この最適化が実装される可能性があります。
注意 一般に,メモリの読み取り参照で実際にメモリがアクセスされる必要があるコードの存在は,慎重に調べる必要があります。現在または将来の最適化で,メモリ参照が移動または削除される可能性があるためです。 |
1.2.4 命令のインターリーブ |
デフォルトで実行される命令のスケジューリング ( 第 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 に移植するための効率の良い方法であることが実証されています。
.CALL_ENTRY 句を使用したい場合以外は, VAX MACRO のエントリ・ポイント .ENTRY を .CALL_ENTRY に変更する必要はありません。また,ここでレジスタ引数を追加する必要もありません。
これらの指示文を正しく配置するためのガイドラインについては, 第 2.3 節 を参照してください。
それぞれの指示文の完全な構文の説明については, 付録 B を参照してください。
例
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 のコーディング・スタイルについて詳細に説明しています。
このパスで見つかった問題に対処することで,コンパイラは以降のパスでその他の問題を発見できるようになります。
VAX MACRO モジュールの移植に関してある程度経験を積むと,ソースを調べて問題を発見し,コンパイラを実行する前にそれを修正するのは,比較的容易になります。
すでに OpenVMS Alpha で動作している VAX MACRO コードを OpenVMS I64 に移植するのは,比較的簡単な作業です。 OpenVMS VAX からの移植と違い,ほとんどの VAX MACRO コードは変更なしで再コンパイルすることができます。
OpenVMS Alpha と OpenVMS I64 の間の呼び出し規則の違いにより,コンパイラは以下の点について知る必要があります。
R0/R1 以外のレジスタに値を返すルーチンと, JSB/BSBW 命令で呼び出される Macro-32 以外の言語で記述されたルーチンについてコンパイラに指示するために,リンケージ指示文 (.CALL_LINKAGE,.DEFINE_LINKAGE) を追加する必要があります。また,ルーチンが標準でない戻り方をする場合には,それぞれの間接 CALLS/CALLG 命令に .USE_LINKAGE 指示文を追加する必要があります。ルーチンが Macro-32 以外の言語で記述されている場合は,それぞれの間接 JSB/BSBW 命令に .USE_LINKAGE 指示文を追加します。詳細は, 付録 B, 専用の指示文 を参照してください。
1.4 OpenVMS Alpha から OpenVMS I64 への段階的な移植手順
目次 | 索引 |
|