日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS MACRO コンパイラ
|
目次 | 索引 |
この付録では,MACRO Compiler for OpenVMS Systems で提供されているビルトインについて説明します。
OpenVMS Alpha システムでは,以下の 2 種類のビルトインが提供されています。
OpenVMS I64 システムでは,以下の 2 種類のビルトインが提供されています。
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 など) を使用してレジスタに新しい値をロードすると,この形式に戻ります。 |
C.1 Alpha 命令ビルトイン ( OpenVMS Alpha システムおよび OpenVMS I64 システム向け) |
移植した VAX MACRO コードでは, 64 ビットのサイズを直接扱ったり, VAX には相当する命令がない Alpha 命令を使用するために, Alpha のネイティブな命令にアクセスしなくてはならない場合があります。コンパイラでは,このような命令にアクセスできるようにするためのビルトインが提供されています。 OpenVMS I64 システムでは,コンパイラは同等の Itanium 命令を生成します。
以下のバイトおよびワードのビルトインが MACRO コンパイラで提供されています。
これらのビルトインを使用する際には,ネイティブ 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 |
さらに,これらのビルトインを使用したコードを,バイトおよびワードのソフトウェア・エミュレータや,バイト命令とワード命令がハードウェアで実装されたプロセッサがないシステムで実行すると,次のように回復不可能な例外が発生します。
%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 命令にアクセスするために使用できない) ビルトインは,表にその旨明記しています。
ビルトイン | オペランド | 説明 | 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 | ○ |
Alpha PALcode ビルトインは,主に特権コード用であり, Alpha 命令ビルトインと同じように使用しますが,例外が 2 つあります。
Alpha PALcode ビルトイン EVAX_INSQHIQR,EVAX_INSQTIQR, EVAX_REMQHIQR,および EVAX_REMQHITR は,クォドワード・キューの操作をサポートしていますが,この機能は VAX MACRO ではサポートされていません。これらのビルトインを使用する場合は,次の例に示すように,入力引数を R16 (および EVAX_INSQxxxx では R17) に移動するコードを記述する必要があります。
C.2 Alpha PALcode ビルトイン
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 システムでは,ビルトインの多くはシステム提供のマクロでエミュレートされています。 |
ビルトイン | オペランド | 説明 |
---|---|---|
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 |
目次 | 索引 |
|