日本-日本語

製品  >  ソフトウェア  >  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 コンパイラポーティングおよびユーザーズ・ガイド | HPE 日本(日本ヒューレット・パッカード株式会社)

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


目次 索引

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

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

OpenVMS Alpha システムでは,以下の 2 種類のビルトインが提供されています。

  • Alpha 命令ビルトイン。 VAX には対応する命令がない Alpha 命令にアクセスするために使用します ( 付録 C.1 節 を参照)。

  • Alpha PALcode ビルトイン。 Alpha には対応する命令がない VAX 命令をエミュレートし,クォドワード・キュー操作などのその他の機能を実行するために使用します ( 付録 C.2 節 を参照)。

OpenVMS I64 システムでは,以下の 2 種類のビルトインが提供されています。

  • Alpha 命令ビルトイン。 VAX には対応する命令がない Itanium 命令を生成するために使用します ( 付録 C.1 節 を参照)。

  • Itanium 命令ビルトイン。 VAX には対応する命令がない Itanium 命令を生成するために使用します ( 付録 C.3 節 を参照)。

OpenVMS I64 システムでは,すべての Alpha PALcode ビルトインはシステムによって提供されるマクロでエミュレートされます。

両方の種類のビルトインを表に示します。それぞれの表の 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 Alpha PALcode ビルトイン

Alpha PALcode ビルトインは,主に特権コード用であり, Alpha 命令ビルトインと同じように使用しますが,例外が 2 つあります。

  • キュー PAL 関数では,その他すべての関数と異なり,コンパイラは PAL 呼び出しを行う前に入力引数を Alpha レジスタに移動しません。そのため,この処理を実行するコードを記述する必要があります。

  • 値を返す PAL 呼び出しのビルトインを使用する場合は,ソース・コードで明示的に R0 から戻り値を読み込む必要があります。

Alpha PALcode ビルトイン EVAX_INSQHIQR,EVAX_INSQTIQR, EVAX_REMQHIQR,および EVAX_REMQHITR は,クォドワード・キューの操作をサポートしていますが,この機能は VAX MACRO ではサポートされていません。これらのビルトインを使用する場合は,次の例に示すように,入力引数を R16 (および EVAX_INSQxxxx では R17) に移動するコードを記述する必要があります。

MOVAB  Q_header, R16  ; Set up address of queue header for PAL call 
EVAX_REMQHIQR         ; Remove quadword queue entry 
EVAX_STQ  R0, entry   ; Save entry address returned in R0 

Alpha PALcode ビルトインを 表 C-2 に示します。

  注意
コンパイラ指示文 .DEFINE_PAL を使用することで,この表に載っていない Alpha PALcode 操作のビルトインを定義することができます。 付録 B, 専用の指示文 を参照してください。

OpenVMS I64 システムでは,ビルトインの多くはシステム提供のマクロでエミュレートされています。

表 C-2 Alpha PALcode ビルトイン
ビルトイン オペランド 説明
EVAX_CFLUSH <RQ> Cache flush
EVAX_DRAINA <> Drain aborts
EVAX_LDQP <AQ> Load quadword physical
EVAX_STQP <AQ,RQ> Store quadword physical
EVAX_SWPCTX <AQ> Swap privileged context
EVAX_BUGCHK <RQ> Bugcheck
EVAX_CHMS <> Change mode supervisor
EVAX_CHMU <> Change mode user
EVAX_IMB <> Instruction memory barrier
EVAX_SWASTEN <RQ> Swap AST enable
EVAX_WR_PS_SW <RQ> Write processor status software field
     
EVAX_MTPR_ASTEN <RQ> Move to processor register ASTEN
EVAX_MTPR_ASTSR <RQ> Move to processor register ASTSR
EVAX_MTPR_AT <RQ> Move to processor register AT
EVAX_MTPR_FEN <RQ> Move to processor register FEN
EVAX_MTPR_IPIR <RQ> Move to processor register IPIR
EVAX_MTPR_IPL <RQ> Move to processor register IPL
EVAX_MTPR_PRBR <RQ> Move to processor register PRBR
EVAX_MTPR_SCBB <RQ> Move to processor register SCBB
EVAX_MTPR_SIRR <RQ> Move to processor register SIRR
EVAX_MTPR_TBIA <> Move to processor register TBIA
EVAX_MTPR_TBIAP <> Move to processor register TBIAP
EVAX_MTPR_TBIS <AQ> Move to processor register TBIS
EVAX_MTPR_TBISD <AQ> Move to processor register, TB invalidate single DATA
EVAX_MTPR_TBISI <AQ> Move to processor register, TB invalidate single ISTREAM
EVAX_MTPR_ESP <AQ> Move to processor register ESP
EVAX_MTPR_SSP <AQ> Move to processor register SSP
EVAX_MTPR_USP <AQ> Move to processor register USP
     
EVAX_MFPR_ASN <> Move from processor register ASN
EVAX_MFPR_AT <> Move from processor register AT
EVAX_MFPR_FEN <> Move from processor register FEN
EVAX_MFPR_IPL <> Move from processor register IPL
EVAX_MFPR_MCES <> Move from processor register MCES
EVAX_MFPR_PCBB <> Move from processor register PCBB
EVAX_MFPR_PRBR <> Move from processor register PRBR
EVAX_MFPR_PTBR <> Move from processor register PTBR
EVAX_MFPR_SCBB <> Move from processor register SCBB
EVAX_MFPR_SISR <> Move from processor register SISR
EVAX_MFPR_TBCHK <AQ> Move from processor register TBCHK
EVAX_MFPR_ESP <> Move from processor register ESP
EVAX_MFPR_SSP <> Move from processor register SSP
EVAX_MFPR_USP <> Move from processor register USP
EVAX_MFPR_WHAMI <> Move from processor register WHAMI
     
EVAX_INSQHILR <> Insert entry into longword queue at head interlocked-resident
EVAX_INSQTILR <> Insert entry into longword queue at tail interlocked-resident
EVAX_INSQHIQR <> Insert entry into quadword queue at head interlocked-resident
EVAX_INSQTIQR <> Insert entry into quadword queue at tail interlocked-resident
EVAX_REMQHILR <> Remove entry from longword queue at head interlocked-resident
EVAX_REMQTILR <> Remove entry from longword queue at tail interlocked-resident
EVAX_REMQHIQR <> Remove entry from quadword queue at head interlocked-resident
EVAX_REMQTIQR <> Remove entry from quadword queue at tail interlocked-resident
     
EVAX_GENTRAP <> Generate trap exception
     
EVAX_READ_UNQ <> Read unique context
EVAX_WRITE_UNQ <RQ> Write unique context


目次 索引

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