library home hp.com home products and services support and drivers solutions
cd-rom home
End of Jump to page title
HP OpenVMS Systems
Documentation

Jump to content


HP OpenVMS

HP OpenVMS
OpenVMS Alpha から OpenVMS I64 へのアプリケーション・ポーティング・ガイド


前へ 次へ 目次 索引


6.3.3 OpenVMS I64 BLISS の機能

OpenVMS I64 BLISS では,OpenVMS I64 をサポートするのに必要な既存の Alpha BLISS の機能だけが提供されます。 Alpha BLISS では,OpenVMS 以外のオペレーティング・システムの機能もサポートしていますが, I64 BLISS コンパイラでは,このような機能は提供されません。

OpenVMS I64 BLISS の組み込み関数

I64 の BLISS コンパイラでは,OpenVMS I64 が正常に動作するのに必要な組み込み関数だけがサポートされています。

共通の BLISS 組み込み関数

既存の共通の BLISS 組み込み関数で,サポートされている関数は以下のとおりです。


ABS               CH$FIND_NOT_CH  CH$WCHAR     
ACTUALCOUNT       CH$FIND_SUB     CH$WCHAR_A                
ACTUALPARAMETER   CH$GEQ          MAX             
ARGPTR            CH$GTR          MAXA            
BARRIER           CH$LEQ          MAXU         
CH$ALLOCATION     CH$LSS          MIN             
CH$A_RCHAR        CH$MOVE         MINA            
CH$A_WCHAR        CH$NEQ          MINU            
CH$COMPARE        CH$PLUS         NULLPARAMETER   
CH$COPY           CH$PTR          REF             
CH$DIFF           CH$RCHAR        SETUNWIND       
CH$EQL            CH$RCHAR_A      SIGN            
CH$FAIL           CH$SIZE         SIGNAL          
CH$FILL           CH$TRANSLATE    SIGNAL_STOP   
CH$FIND_CH        CH$TRANSTABLE 

RETURNADDRESS 組み込み関数

新しい組み込み関数 RETURNADDRESS は,呼び出し元の関数を呼び出した関数の PC を返します。

この組み込み関数には引数がなく,形式は次のとおりです。


RETURNADDRESS() 

マシン固有の組み込み関数

I64 BLISS コンパイラでは,Alpha BLISS の以下のマシン固有の組み込み関数がサポートされています。


BARRIER 
ESTABLISH 
REVERT 
 
ROT   
SLL   
SRA   
SRL 
UMULH   
 
AdaWI 
 
ADD_ATOMIC_LONG   AND_ATOMIC_LONG  OR_ATOMIC_LONG 
ADD_ATOMIC_QUAD   AND_ATOMIC_QUAD  OR_ATOMIC_QUAD 

組み込み関数 xxx_ATOMIC_xxxでは,オプションの入力引数 retry-count はサポートされなくなりました。詳細については, 不可分な操作のための ADD,AND,OR 組み込み関数 を参照してください。


TESTBITSSI TESTBITCC  TESTBITCS 
TESTBITCCI TESTBITSS  TESTBITSC 

TESTBITxx インストラクションでは,オプションの入力引数 retry-count およびオプションの出力引数 success-flag はサポートされません。詳細については, 不可分な操作のための TESTBITxxI および TESTBITxx 組み込み関数 を参照してください。


ADDD    DIVD    MULD    SUBD    CMPD 
ADDF    DIVF    MULF    SUBF    CMPF 
ADDG    DIVG    MULG    SUBG    CMPG 
ADDS    DIVS    MULS    SUBS    CMPS 
ADDT    DIVT    MULT    SUBT    CMPT 
 
CVTDF   CVTFD   CVTGD   CVTSF   CVTTD 
CVTDG   CVTFG   CVTGF   CVTSI   CVTTG 
CVTDI   CVTFI   CVTGI   CVTSL   CVTTI 
CVTDL   CVTFL   CVTGL   CVTSQ   CVTTL 
CVTDQ   CVTFQ   CVTGQ   CVTST   CVTTQ 
CVTDT   CVTFS   CVTGT           CVTTS 
 
CVTID   CVTLD   CVTQD 
CVTIF   CVTLF   CVTQF 
CVTIG   CVTLG   CVTQG 
CVTIS   CVTLS   CVTQS 
CVTIT   CVTLT   CVTQT 
 
CVTRDL  CVTRDQ 
CVTRFL  CVTRFQ 
CVTRGL  CVTRGQ 
CVTRSL  CVTRSQ 
CVTRTL  CVTRTQ 

新しいマシン固有の組み込み関数

OpenVMS I64 BLISS に追加された多くの新しい組み込み関数では,オペレーティング・システムで使用できるシングル I64 インストラクションにアクセスする機能が提供されます。

シングル I64 インストラクションに対する組み込み関数

以下の一覧で大文字で示されている関数は,指定可能な新しい組み込み関数です。括弧内の小文字の名前は,実際に実行される I64 のインストラクションです。これらのインストラクションに対する引数 (および関連の BLISS 組み込み関数名) の詳細については,『Intel IA-64 Architecture Software Developer's Manual』を参照してください。


  BREAK   (break)         LOADRS (loadrs)        RUM    (rum) 
  BREAK2  (break)*        PROBER (probe.r)       SRLZD  (srlz.d)     
  FC      (fc)            PROBEW (probe.w)       SRLZI  (srlz.i)     
  FLUSHRS (flushrs)       PCTE   (ptc.e)         SSM    (ssm)      
  FWB     (fwb)           PCTG   (ptc.g)         SUM    (sum)    
  INVALAT (invala)        PCTGA  (ptc.ga)        SYNCI  (sync.i) 
  ITCD    (itc.d)         PTCL   (ptc.l)         TAK    (tak)      
  ITCI    (itc.i)         PTRD   (ptr.d)         THASH  (thash) 
  ITRD    (itr.d)         PTRI   (ptr.i)         TPA    (tpa)    
  ITRI    (itr.i)         RSM    (rsm)           TTAG   (ttag) 

注意

BREAK2 組み込み関数には,2 つのパラメータが必要です。最初のパラメータはコンパイル時リテラルでなければならず, BREAK インストラクションの 21 ビットの即値 (immediate value) を指定します。 2 番目のパラメータには任意の式を指定でき,その値が, BREAK インストラクションを実行する直前に IPF 汎用レジスタ R17 に移動されます。

プロセッサ・レジスタへのアクセス

OpenVMS I64 BLISS コンパイラでは, IPF インプリメンテーションの多くのさまざまなプロセッサ・レジスタへの読み書きアクセスのための組み込み関数が提供されています。これらの組み込み関数は以下のとおりです。

これらの組み込み関数は mov.i インストラクションを実行します。このインストラクションの詳細については,『Intel IA-64 Architecture Software Developer's Manual』を参照してください。 2 つの GET 組み込み関数は,指定されたレジスタの値を返します。

レジスタを指定するには,特殊なエンコードの整数定数を使用します。この定数は Intel C ヘッダ・ファイルに定義されています。このファイルの内容については,『Intel IA-64 Architecture Software Developer's Manual』を参照してください。

PALcode 組み込み関数

以下の Alpha BLISS PALcode 組み込み関数は I64 でもサポートされます。


   PAL_INSQHIL        PAL_REMQHIL                       
   PAL_INSQHILR       PAL_REMQHILR                       
   PAL_INSQHIQ        PAL_REMQHIQ                       
   PAL_INSQHIQR       PAL_REMQHIQR                       
   PAL_INSQTIL        PAL_REMQTIL                       
   PAL_INSQTILR       PAL_REMQTILR                       
   PAL_INSQTIQ        PAL_REMQTIQ                       
   PAL_INSQTIQR       PAL_REMQTIQR                       
   PAL_INSQUEL        PAL_REMQUEL                       
   PAL_INSQUEL_D      PAL_REMQUEL_D                       
   PAL_INSQUEQ        PAL_REMQUEQ                       
   PAL_INSQUEQ_D      PAL_REMQUEQ_D                       

24 のキュー操作 PALcall はそれぞれ,OpenVMS の実行時ルーチン SYS$PAL_xxxx の呼び出しとして, BLISS でインプリメントされています。

BLI$CALLG

VAX の CALLG( .AP, ...) は,OpenVMS Alpha BLISS ではアセンブリ・ルーチン BLI$CALLG(ARGPTR(), .RTN) に変更されています。このルーチンはもともと OpenVMS Alpha BLISS 向けに定義されたものですが,I64 アーキテクチャ向けに書き直され, OpenVMS I64 BLISS でサポートされています。

I64 のレジスタ

I64 の汎用レジスタはR3 〜 R11 および R19 〜 R31 であり, REGISTER,GLOBAL REGISTER,および EXTERNAL REGISTER に名前を指定でき, LINKAGE 宣言に対するパラメータとして指定することもできます。さらに,パラメータ・レジスタ R32 〜 R39 は, LINKAGE 宣言のみでパラメータとして指定できます。

現在のところ,I64 の汎用レジスタ R40 〜 R127 の名前を指定する機能をサポートする予定はありません。

REGISTER,GLOBAL REGISTER,EXTERNAL REGISTER,および LINKAGE 宣言によって,I64 の浮動小数点レジスタ,プレディケート・レジスタ,分岐レジスタ,およびアプリケーション・レジスタの名前を指定する機能は提供されていません。

特定のレジスタに対するユーザ要求を満たすことができない場合は,レジスタ競合のメッセージが出力されます。

ALPHA_REGISTER_MAPPING スイッチ

OpenVMS I64 BLISS では,新しいモジュール・レベル・スイッチ ALPHA_REGISTER_MAPPING が提供されています。

このスイッチは,MODULE 宣言または SWITCHES 宣言に指定できます。このスイッチを使用すると,この項で説明するように, Alpha のレジスタ番号を I64 のレジスタ番号に再マップできます。

REGISTER,GLOBAL REGISTER,および EXTERNAL REGISTER に指定されたレジスタ番号,またはリンケージ宣言の GLOBAL,PRESERVE,NOPRESERVE,または NOT USED に対するパラメータとして指定されたレジスタ番号 (0 〜 31 の範囲) は,以下の IMACRO マッピング・テーブルに従って再マッピングされます。


0  = GEM_TS_REG_K_R8         16 = GEM_TS_REG_K_R14 
1  = GEM_TS_REG_K_R9         17 = GEM_TS_REG_K_R15     
2  = GEM_TS_REG_K_R28        18 = GEM_TS_REG_K_R16     
3  = GEM_TS_REG_K_R3         19 = GEM_TS_REG_K_R17     
4  = GEM_TS_REG_K_R4         20 = GEM_TS_REG_K_R18     
5  = GEM_TS_REG_K_R5         21 = GEM_TS_REG_K_R19     
6  = GEM_TS_REG_K_R6         22 = GEM_TS_REG_K_R22     
7  = GEM_TS_REG_K_R7         23 = GEM_TS_REG_K_R23     
8  = GEM_TS_REG_K_R26        24 = GEM_TS_REG_K_R24     
9  = GEM_TS_REG_K_R27        25 = GEM_TS_REG_K_R25     
10 = GEM_TS_REG_K_R10        26 = GEM_TS_REG_K_R0      
11 = GEM_TS_REG_K_R11        27 = GEM_TS_REG_K_R0      
12 = GEM_TS_REG_K_R30        28 = GEM_TS_REG_K_R0      
13 = GEM_TS_REG_K_R31        29 = GEM_TS_REG_K_R29     
14 = GEM_TS_REG_K_R20        30 = GEM_TS_REG_K_R12     
15 = GEM_TS_REG_K_R21        31 = GEM_TS_REG_K_R0      

レジスタ番号 16 〜 20,26 〜 28,30 〜 31 のマッピングは, OpenVMS I64 BLISS では,無効な指定であると解釈されるレジスタに変換されます ( Alpha BLISS のレジスタ名 および I64 のレジスタ を参照)。 ALPHA_REGISTER_MAPPING が指定されているときに,これらのレジスタを含む宣言を行うと,以下のようなエラーが発生します。


         r30 = 30, 
.........^ 
%BLS64-W-TEXT, Alpha register 30 cannot be declared, invalid mapping to 
IPF register 12 at line number 9 in file ddd:[xxx]TESTALPHAREGMAP.BLI 

ソース行にはレジスタ番号 30 が指定されていますが,エラー・テキストにはレジスタ 12 に問題があることが示されています。レジスタ 12 はレジスタ番号 30 が変換された結果であり,指定するとエラーになります。

Alpha のレジスタ R16 〜 R21 がリンケージ I/O パラメータとして指定されている場合は,これらのレジスタに対して特殊なマッピング・セットが用意されています。

注意

リンケージ I/O パラメータのみの場合は, R16 〜 R21 のマッピングは次のようになります。


16 = GEM_TS_REG_K_R32 
17 = GEM_TS_REG_K_R33     
18 = GEM_TS_REG_K_R34     
19 = GEM_TS_REG_K_R35 
20 = GEM_TS_REG_K_R36 
21 = GEM_TS_REG_K_R37 

ALPHA_REGISTER_MAPPING と "NOTUSED"

ALPHA_REGISTER_MAPPING を指定すると, IA64 のスクラッチ・レジスタにマッピングされリンク宣言で NOTUSED が指定された Alpha レジスタは, PRESERVE セットに配置されます。

これにより,このレジスタを NOTUSED と宣言しているルーチンを実行するときにレジスタが退避され,ルーチンから抜けるときに復元されます。

/ANNOTATIONS 修飾子

OpenVMS I64 BLISS コンパイラでは,新しいコンパイル修飾子 /ANNOTATIONS がサポートされます。この修飾子は,コンパイル時にコンパイラが行っている (または行っていない) 最適化に関する情報をソース・リストに追加します。

この修飾子は,以下のキーワードにより,リストする情報を選択できます。

他のキーワードは GEM 最適化の情報を選択できます。

INLINING
LINKAGES
LOOP_TRANSFORMS
LOOP_UNROLLING
PREFETCHING
SHRINKWRAPPING
SOFTWARE_PIPELINING
TAIL_CALLS
TAIL_RECURSION

ALL と NONE を除き,他のすべてのキーワードは否定形にすることができます。修飾子自体を否定することもできます。デフォルトでは,修飾子はコマンド・ラインに指定されません。

/ANNOTATIONS 修飾子だけを指定し,パラメータを指定しなかった場合,デフォルトは ALL になります。

/ALPHA_REGISTER_MAPPING 修飾子

OpenVMS I64 BLISS コンパイラでは,ソースを変更せずに ALPHA_REGISTER_MAPPING を有効にすることができる新しいコンパイル修飾子がサポートされます。これは位置依存修飾子です。モジュールのコンパイル行にこの修飾子を指定すると,モジュール・ヘッダに ALPHA_REGISTER_MAPPING スイッチを設定した場合と同じ効果があります。

/ALPHA_REGISTER_MAPPING 情報メッセージ

OpenVMS I64 BLISS では,3 つの新しい情報メッセージが追加されています。

不可分な操作のための ADD,AND,OR 組み込み関数

OpenVMS I64 BLISS では,不可分 (atomic) なメモリ更新のために, ADD_ATOMIC_XXXX,AND_ATOMIC_XXXX,および OR_ATOMIC_XXXX 組み込み関数がサポートされます。これらの組み込み関数の一覧については, マシン固有の組み込み関数 を参照してください。

これらの組み込み関数をサポートする I64 インストラクションは,操作が正常終了するまで待つため,オプションの retry-count 入力パラメータは除外されています。これらの組み込み関数の形式は以下のように変更されました。


  option_ATOMIC_size(ptr, expr 
                     [;old_value] ) !Optional output 

ここで,

option は AND,ADD,OR のいずれかです。

size は LONG または QUAD です。

ptr は自然なアラインメントのアドレスでなければなりません。

返される値は 0 (操作失敗) または 1 (操作成功) です。

操作は,式 expr の,ptr によって示されるデータ・セグメントへの不可分な加算 (または AND もしくは OR) です。

オプションの出力パラメータ old_value は,ptr によって示されるデータ・セグメントの以前の値に設定されます。

OpenVMS Alpha BLISS のオプションの retry-count パラメータを使用すると,構文エラーになります。

不可分な操作のための TESTBITxxI および TESTBITxx 組み込み関数

OpenVMS I64 BLISS では,不可分な操作のために TESTBITxxI および TESTBITxx 組み込み関数がサポートされます。サポートされる組み込み関数の一覧については, マシン固有の組み込み関数 を参照してください。

これらの組み込み関数をサポートする I64 インストラクションは,操作が正常終了するのを待機するので,オプションの入力パラメータ retry-count とオプションの出力パラメータ success_flag は取り除かれています。これらの組み込み関数の形式は以下のとおりです。


   TESTBITxxx( field ) 

OpenVMS Alpha BLISS のオプションのパラメータ retry-count や success_flag を使用すると,構文エラーになります。

ロングワード書き込みとクォドワード書き込みの単位

OpenVMS I64 BLISS では,ここで説明する /GRANULARITY=keyword 修飾子,スイッチ DEFAULT_GRANULARITY=n,およびデータ属性 GRANUALRITY(n) がサポートされます。

ユーザはコマンド・ライン修飾子 /GRANULARITY=keyword,スイッチ DEFAULT_GRANULARITY=n,およびデータ属性 GRANULARITY(n) を使用することにより,ストアとフェッチの単位 (Granularity) を制御できます。

コマンド・ライン修飾子に指定するキーワードは, BYTE,LONGWORD または QUADWORD でなければなりません。値 n は,0 (バイト),2 (ロングワード) または 3 (クォドワード) でなければなりません。

これらを組み合わせて使用した場合,優先順位が最も高いのはデータ属性です。 SWITCHES 宣言でスイッチを使用した場合,同じスコープ内でその後に宣言されるデータの単位 (Granularity) を設定します。スイッチはモジュール・ヘッダでも使用できます。最も優先順位が低いのはコマンド・ライン修飾子です。

シフト (Shift) 組み込み関数

OpenVMS I64 BLISS では,既知の方向にシフトを行う組み込み関数がサポートされます。これらの組み込み関数の一覧については, マシン固有の組み込み関数 を参照してください。これらの関数は,0..%BPVAL-1 の範囲で行われるシフトに対してだけ有効です。

比較 (Compare) およびスワップ (Swap) 組み込み関数

OpenVMS Alpha と OpenVMS I64 の両方の BLISS で,以下の新しい比較およびスワップ組み込み関数がサポートされます。

これらの関数は,addr にあるロングワードまたはクォドワードを comparand と比較し,等しい場合は値を addr にストアするという,連動した操作を実行します。操作の成功 (1) または失敗 (0) を示すインジケータが返されます。

I64 固有のマルチメディア・インストラクション

I64 固有のマルチメディア・タイプのインストラクションへのアクセスをサポートする計画はありません。

リンケージ

CALL リンケージ

OpenVMS Alpha BLISS に関してここで説明する CALL リンケージは,OpenVMS I64 BLISS でもサポートされます。

32 ビット・コンパイラでコンパイルされたルーチンは, 64 ビット・コンパイラでコンパイルされたルーチンを呼び出すことができ,その逆も可能です。 64 ビットから 32 ビットに短縮される場合はパラメータが切り捨てられ,32 ビットから 64 ビットに拡張される場合は符号拡張されます。

デフォルト設定では,CALL リンケージは引数の数を渡します。この設定は,NOCOUNT リンケージ・オプションを使用することで無効にすることができます。

引数はクォドワードで渡されますが,32 ビット・コンパイラは下位 32 ビットしか「確認」できません。

JSB リンケージ

OpenVMS I64 BLISS コンパイラには JSB リンケージ・タイプがあります。 JSB リンケージで宣言されたルーチンは,OpenVMS I64 用に開発された JSB ルールに従います。

/[NO]TIE 修飾子

この修飾子のサポートは,OpenVMS I64 でも継続されます。デフォルトは /NOTIE です。

コンパイルされたコードから変換されたイメージを呼び出したり,変換されたイメージからコンパイルされたコードを呼び出す必要がある場合には,TIE を使用すると,コンパイルされたコードと変換されたイメージとを組み合わせて使用できます。

特に,TIE は以下の操作を行います。

/ENVIRONMENT=([NO]FP) および ENVIRONMENT([NO]FP)

OpenVMS Alpha BLISS では, /ENVIRONMENT=([NO]FP) 修飾子と ENVIRONMENT([NO]FP) スイッチが提供されており,これらを使用すると,コンパイラは特定の整数除算に対して浮動小数点レジスタの使用を禁止します。

しかし,OpenVMS I64 BLISS では,I64 のアーキテクチャ上の機能により, /ENVIRONMENT=NOFP コマンド修飾子および ENVIRONMENT(NOFP) スイッチは,浮動小数点レジスタの使用を完全に禁止するわけではありません。ソース・コードでは浮動小数点演算は使用しないように制限されますが,特定の演算 (特に整数乗算と整数除算,およびそれを暗黙に含む構造) 用に生成されたコードでは,一部の浮動小数点レジスタだけを使用するように制限されます。特に,このオプションを指定した場合,コンパイラは f6 〜 f11 だけを使用するように制限され,『Intel Itanium Processor-Specific Application Binary Interface』で説明している ELF EF_IA_64_REDUCEFP オプションを設定します。


前へ 次へ 目次 索引