日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 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 コンパイラポーティングおよびユーザーズ・ガイド | HPE 日本(日本ヒューレット・パッカード株式会社)

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


目次 索引

付録 C
MACRO コンパイラ・ビルトイン

この付録では,MACRO Compiler for OpenVMS Systems で提供されているビルトインについて説明します。

両方の種類のビルトインを表に示します。それぞれの表の 2 番目の欄は,ビルトインに渡すオペランドを示します。略語の意味は以下のとおりです。

WL = 書き込みロングワード (write longword)
ML = 変更ロングワード (modify longword)
AL = ロングワードのアドレス (address of longword)
WQ = 書き込みクォドワード (write quadword)
RQ = 読み込みクォドワード (read quadword)
MQ = 変更クォドワード (modify quadword)
AQ = クォドワードのアドレス (address of quadword)
AB = バイトのアドレス (address of byte)
AW = ワードのアドレス (address of word)
WB = 書き込みバイト (write byte)
WW = 書き込みワード (write word)

注意

同じレジスタに対してビルトインと VAX MACRO 命令を混在させる場合は注意してください。コンパイラから生成されるコードは,レジスタに 32 ビットの符号拡張された値が格納されていることを期待しますが,この形式でない 64 ビット値を作成することも可能です。そのようなレジスタに対してロングワード操作を行うと,正しい結果が得られません。

そのため,レジスタを VAX MACRO 命令のソース・オペランドとして使用する場合は,その前にレジスタを 32 ビットの符号拡張形式に戻してください。 VAX MACRO 命令 (MOVL など) を使用してレジスタに新しい値をロードすると,この形式に戻ります。



移植した VAX MACRO コードでは, 64 ビットのサイズを直接扱ったり, VAX には相当する命令がない Alpha 命令を使用するために, Alpha のネイティブな命令にアクセスしなくてはならない場合があります。コンパイラでは,このような命令にアクセスできるようにするためのビルトインが提供されています。 OpenVMS I64 システムでは,コンパイラは同等の Itanium 命令を生成します。

以下のバイトおよびワードのビルトインが MACRO コンパイラで提供されています。

  • EVAX_LDBU

  • EVAX_LDWU

  • EVAX_STB

  • EVAX_STW

  • EVAX_SEXTB

  • EVAX_SEXTW

これらのビルトインを使用する際には,ネイティブ VAX 命令と同じように, VAX オペランド・モードを使用します。たとえば,EVAX_ADDQ#8(R0),(SP)+,R1 は有効です。唯一の例外は,Alpha のロード/格納ビルトイン (EVAX_LD*,EVAX_ST*) の最初のオペランドがレジスタであることです。

OpenVMS Alpha で,バイトとワードのビルトインが含まれているコードを実行する最適な環境は,これらの命令をハードウェアで実装しているシステムです。このようなコードを,ソフトウェアで命令をエミュレートする Alpha システムで実行すると,以下の制限があります。

  • 大幅な性能低下
    例外を処理してソフトウェア・エミュレーションを起動するオーバヘッドがあるため,性能が大幅に低下します。ソフトウェア・エミュレーションが実施される場合,次のメッセージが出力されます。


    %SYSTEM-I-EMULATED, 
     an instruction not implemented on this processor was emulated 
    

  • ソフトウェア・エミュレーションに実装されていないいくつかの機能
    ソフトウェア・エミュレーションでは,その命令をハードウェアで実装しているシステム上にあるすべての機能を提供することはできません。内部アクセス・モードや高い IPL で動作するコードは,これらの命令を使用することができます。たとえば, IPL 2 よりも高いレベルのソフトウェア・エミュレーションを有効にすると,バグ・チェックは行われません。しかし,ハードウェア制御レジスタへの直接書き込みなど,これらの命令が有効なアプリケーションは実行が不可能になります。これは,そのようなアプリケーションでは,機能がエミュレートできないようなアドレス・ラインの存在を必要とするためです。

さらに,これらのビルトインを使用したコードを,バイトおよびワードのソフトウェア・エミュレータや,バイト命令とワード命令がハードウェアで実装されたプロセッサがないシステムで実行すると,次のように回復不可能な例外が発生します。


%SYSTEM-F-OPCDEC, opcode reserved to Digital fault at 
PC=00000000000020068,PS=0000001B 

注意

MACRO コンパイラ・ビルトイン内のメモリ参照は,常にクォドワードでアラインされていると想定されます。ただし,EVAX_SEXTB,EVAX_SEXTW,EVAX_LDBU,EVAX_LDWU,EVAX_STB, EVAX_STW,EVAX_LDQU,および EVAX_STQU を除きます。

表 C-1 に,コンパイラでサポートされている Alpha ビルトインの要約を示します。 Alpha 専用の (Itanium 命令を生成するためや Itanium 命令にアクセスするために使用できない) ビルトインは,表にその旨明記しています。

表 C-1 Alpha 命令ビルトイン ( OpenVMS Alphaシステムおよび OpenVMS I64システム向け)
ビルトイン オペランド 説明 OpenVMS I64 で動作するか
EVAX_SEXTB <RQ,WB> Sign-extend byte
EVAX_SEXTW <RQ,WW> Sign-extend word
EVAX_SEXTL <RQ,WL> Sign-extend longword
       
EVAX_LDBU <WQ,AB> Load zero-extended byte from memory
EVAX_LDWU <WQ,AQ> Load zero-extended word from memory
EVAX_LDLL <WL,AL> Load longword locked
EVAX_LDAQ <WQ,AQ> Load address of quadword
EVAX_LDQ <WQ,AQ> Load quadword
EVAX_LDQL <WQ,AQ> Load quadword locked
EVAX_LDQU <WQ,AQ> Load unaligned quadword
       
EVAX_STB <RQ,AB> Store byte from register to memory
EVAX_STW <RQ,AW> Store word from register to memory
EVAX_STLC <ML,AL> Store longword conditional
EVAX_STQ <RQ,AQ> Store quadword
EVAX_STQC <MQ,AQ> Store quadword conditional
EVAX_STQU <RQ,AQ> Store unaligned quadword
       
EVAX_ADDQ <RQ,RQ,WQ> Quadword add
EVAX_SUBQ <RQ,RQ,WQ> Quadword subtract
EVAX_MULQ <RQ,RQ,WQ> Quadword multiply
EVAX_UMULH <RQ,RQ,WQ> Unsigned quadword multiply high
       
EVAX_AND <RQ,RQ,WQ> Logical product
EVAX_OR <RQ,RQ,WQ> Logical sum
EVAX_XOR <RQ,RQ,WQ> Logical difference
EVAX_BIC <RQ,RQ,WQ> Bit clear
EVAX_ORNOT <RQ,RQ,WQ> Logical sum with complement
EVAX_EQV <RQ,RQ,WQ> Logical equivalence
EVAX_SLL <RQ,RQ,WQ> Shift left logical
EVAX_SRL <RQ,RQ,WQ> Shift right logical
EVAX_SRA <RQ,RQ,WQ> Shift right arithmetic
       
EVAX_EXTBL <RQ,RQ,WQ> Extract byte low
EVAX_EXTWL <RQ,RQ,WQ> Extract word low
EVAX_EXTLL <RQ,RQ,WQ> Extract longword low
EVAX_EXTQL <RQ,RQ,WQ> Extract quadword low
EVAX_EXTBH <RQ,RQ,WQ> Extract byte high
EVAX_EXTWH <RQ,RQ,WQ> Extract word high
EVAX_EXTLH <RQ,RQ,WQ> Extract longword high
EVAX_EXTQH <RQ,RQ,WQ> Extract quadword high
       
EVAX_INSBL <RQ,RQ,WQ> Insert byte low
EVAX_INSWL <RQ,RQ,WQ> Insert word low
EVAX_INSLL <RQ,RQ,WQ> Insert longword low
EVAX_INSQL <RQ,RQ,WQ> Insert quadword low
EVAX_INSBH <RQ,RQ,WQ> Insert byte high
EVAX_INSWH <RQ,RQ,WQ> Insert word high
EVAX_INSLH <RQ,RQ,WQ> Insert longword high
EVAX_INSQH <RQ,RQ,WQ> Insert quadword high
       
EVAX_TRAPB <> Trap barrier ×
EVAX_MB <> Memory barrier
EVAX_RPCC <WQ> Read process cycle counter ×
       
EVAX_CMPEQ <RQ,RQ,WQ> Integer signed compare, equal
EVAX_CMPLT <RQ,RQ,WQ> Integer signed compare, less than
EVAX_CMPLE <RQ,RQ,WQ> Integer signed compare, less equal
EVAX_CMPULT <RQ,RQ,WQ> Integer unsigned compare, less than
EVAX_CMPULE <RQ,RQ,WQ> Integer unsigned compare, less equal
       
EVAX_BEQ <RQ,AQ> Branch equal
EVAX_BLT <RQ,AQ> Branch less than
EVAX_BNE <RQ,AQ> Branch not equal
       
EVAX_CMOVEQ <RQ,RQ,WQ> Conditional move/equal
EVAX_CMOVNE <RQ,RQ,WQ> Conditional move/not equal
EVAX_CMOVLT <RQ,RQ,WQ> Conditional move/less than
EVAX_CMOVLE <RQ,RQ,WQ> Conditional move/less or equal
EVAX_CMOVGT <RQ,RQ,WQ> Conditional move/greater than
EVAX_CMOVGE <RQ,RQ,WQ> Conditional move/greater or equal
EVAX_CMOVLBC <RQ,RQ,WQ> Conditional move/low bit clear
EVAX_CMOVLBS <RQ,RQ,WQ> Conditional move/low bit set
       
EVAX_MF_FPCR <WQ> Move from floating-point control register ×
EVAX_MT_FPCR <WQ,RQ> Move to floating-point control register ×
EVAX_ZAP <RQ,RQ,WQ> Zero bytes
EVAX_ZAPNOT <RQ,RQ,WQ> Zero bytes with NOT mask



C.2 Itanium 命令ビルトイン ( OpenVMS I64 システム向け)


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項