3.2.3 命令サイズへの依存 |
|
たとえば,命令の長さに基づいて分岐オフセットを計算するコードは,変更する必要があります。
推奨される変更
ラベルと標準的な分岐を使用するか,計算型 GOTO に対しては CASE 命令を使用してください。
3.2.4 不完全な命令 |
|
OpenVMS VAX コードの一部の CASE 命令は,その後にオフセット・テーブルがなく,代わりにリンカによる psect の配置に依存して命令を完成させています。コンパイラは不完全な命令をエラーとして出力します。
推奨される変更
モジュール内の命令を完成させるか,データ psect 内にアドレスのテーブルを作成し,CASE 命令を,テーブルから分岐先アドレスを選択して分岐するようなコードで置き換えます。
3.2.5 トランスレートされない VAX 命令 |
|
コンパイラは以下の VAX 命令をトランスレートできないため,エラーとして出力します。
- LDPCTX および SVPCTX
- XFC
- ESCD,ESCE,および ESCF
- BUGx
推奨される変更
通常これらの命令は, VAX アーキテクチャに大きく依存するコードに現れます。このようなコードを OpenVMS Alpha システムまたは OpenVMS I64 システムに移植するには,書き直す必要があります。
3.2.6 内部プロセッサ・レジスタの参照 |
|
以下の命令には特に注意してください。
推奨される変更
OpenVMS Alpha システムでは,これらの命令が正しい Alpha 内部プロセッサ・レジスタ (IPR) を参照していることを確認してください。正しい内部プロセッサ・レジスタを参照していないと,エラーになります。 Alpha の内部プロセッサ・レジスタについての詳細は, Alpha Architecture Reference Manual を参照してください。
OpenVMS I64 システムでは,コンパイラは VAX 命令 MFPR と MTPR を直接サポートしていません。ただし,OpenVMS で提供されている一連のマクロがあり,このマクロが同じ機能を実行するシステム・サービスを呼び出します。
3.2.7 BICPSW 命令での条件コード Z および N の使用 |
|
BICPSW 命令はサポートされていますが,条件コード Z とN は同時には設定できません。条件コード Z を設定すると条件コード N がクリアされ,逆に条件コード N を設定すると条件コード Z がクリアされます。
推奨される変更
コードで両方の条件コードを同時に設定している場合は,コードを変更してください。
3.2.8 インターロックされるメモリ命令 |
|
Alpha Architecture Reference Manual では,インターロックされるメモリ命令の使用に対する厳密な規則が記述されています。特に,LDxL/STxC シーケンスの内部での分岐またはこのシーケンス内への分岐は禁止されています。インターロックされるシーケンスから外に向かう分岐は正しいため,変更する必要はありません。 Alpha 21264 (EV6) プロセッサとそれ以降のすべての Alpha プロセッサでは,それ以前のプロセッサと比較して,より厳密にこの規則に従うことを義務付けています。
Alpha 21264 プロセッサは, OpenVMS Alpha Version 7.1-2 で初めてサポートされました。
MACRO コンパイラが Macro-32 ソース・コードから生成したコードは,これらの規則に従っています。ただし,これらの命令をソース・コード中に直接記述できるように, EVAX_LQxL ビルトインと EVAX_STxC ビルトインが用意されています。
これらの命令が,インターロックされるメモリ命令を使用するための規則に従って使用されていることが保証できるように, MACRO コンパイラにチェックが追加されています。この機能は, OpenVMS Alpha Version 7.1-2 ではバージョン 3.1 のコンパイラから, OpenVMS Alpha Version 7.2 ではバージョン 4.1 のコンパイラから追加されています。
OpenVMS I64 システムでは,コンパイラは,EVAX_LDxL ビルトインを,ロードした値をハードウェアの AR.CCV レジスタに保存すると同時に,後で使用するためにローカルなコピーを保持する命令に置き換えます。 EVAX_STxC ビルトインは, EVAX_LDxL ビルトインによって以前保存された値と比較する compare-exchange (cmpxchg) 命令に置き換えられます。コンパイラは,インターロックされる命令シーケンスへの分岐に関する Alpha のすべての規則を適用します。
ここで述べた状況下では,コンパイラによって以下の警告メッセージが出力されます。
BRNDIRLOC, branch directive ignored in locked memory sequence