[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.16.7 アセンブラ命令の出力

この節では、アセンブラ命令の出力について解説する。

REGISTER_NAMES

C の初期化子で、マシンレジスタのアセンブラでの名前をそれぞれ C の文字列定数で表したものである。 これを使ってコンパイラはレジスタ番号を変換してアセンブラ言語に 入れる。

ADDITIONAL_REGISTER_NAMES

定義されていれば、レジスタ名とレジスタ番号からなる構造体の配列に 対する、C の初期化子である。 このマクロはハードレジスタの名前を追加で定義し、 asm 文の宣言で、レジスタを参照するのに別名を使えるようにする。

ASM_OUTPUT_OPCODE (stream, ptr)

機械命令に対して、異なる名前を必要とする、変わったアセンブラを使うときは このマクロを定義する。

このマクロの定義は、C の、一個の文か複数個の文となり、アセンブラ命令の オペコードを標準入出力ストリーム stream に出力する。 マクロのオペランド ptrchar * 型の変数であり、 オペコード名の「内部」形式を指す。この内部形式は、マシン記述に 書かれているものである。この定義では、必要となる変換を行ないつつ、 オペコード名を stream に出力し、変数 ptr を、オペコードの 最後を指すようにインクリメントして、二回出力されないようにする。

実際は、このマクロ定義でオペコード名全体は処理しなくても良いし、 オペコード名以外のものも含めて処理しても良い。 だが、オペランドの代入を行なう ‘%’列を含むテキストを処理する場合は、 その代入を自分で行なわなければならない。 ptr をインクリメントして、普通に出力されるべきでないテキスト部分を 越えるようにすること。

オペランドの値を見る必要があるなら、recog_operand の要素として 入っている。

このマクロの定義が何もしないものなら、命令は普通の方法で出力される。

FINAL_PRESCAN_INSN (insn, opvec, noperands)

一個の C の文。この文は定義されていれば、insn 用のアセンブラコードを 出力する直前に実行され、抽出されたオペランドを異なる出力となるように 修正する。

ここで引数 opvecinsn から抽出したオペランドを 保持するベクトルであり、noperands はこの insn にとって意味のある データを保持するベクトルの要素数である。このベクトルの内容は、 この isn のテンプレートをアセンブラコードに変換するのに使われるもの なので、このベクトルの内容を変えることでアセンブラ出力を変更することが できる。

このマクロは、色々なアセンブラの記法で一個の命令パターンファイルを 共有している場合に役に立つ。このマクロの定義を異なるものにすることに より、命令の大部分を異なる出力(例えばオペランドの配置替え)になるように することができる。個々の命令パターンに影響する、アセンブラ記法の 差異は、そのパターンの出力ルーチンで条件で切り分けて書くことで 取り扱うようにするのが自然である。

このマクロが定義されていなければ、ヌル文に等価である。

FINAL_PRESCAN_LABEL

これが定義されていると、FINAL_PRESCAN_INSN が各 CODE_LABEL について呼び出される。その場合、opvec はヌルポインタに、 noperands はゼロになる。

PRINT_OPERAND (stream, x, code)

一個の C の複文。標準入出力ストリーム stream に 命令オペランド x 用のアセンブラ構文を出力する。 x は RTL 式である。

code は、オペランドを出力する幾つかの方法の一つを指定するのに 使われる値である。これは、同じオペランドを文脈によって異なる出力を しなければならない場合に使われる。code は、オペランドの出力を 要求するのに使われる ‘%’ 指定から来る。‘%’ 指定が 単に ‘%digit’ なら code は 0 である。 ‘%ltrdigit’ なら code は、ltr の ASCII コード である。

x がレジスタなら、このマクロはそのレジスタ名を出力すべきである。 レジスタ名は、char *[] 型の配列 reg_names に入っている。 reg_names は、REGISTER_NAMES で初期化される。

マシン記述に ‘%punct’ 指定(‘%’ の後に区切り文字一文字が 続く)があれば、このマクロは x がヌルポインタで、区切り文字が code である場合に呼び出される。

PRINT_OPERAND_PUNCT_VALID_P (code)

一個の C の式。codePRINT_OPERAND マクロで使うのに 有効な区切り文字である場合にこの式を評価すると真になる。 PRINT_OPERAND_PUNCT_VALID_P が定義されていないと、 このように使われる区切り文字がないということを意味する (標準の ‘%’ を除く)。

PRINT_OPERAND_ADDRESS (stream, x)

一個の C の複文。標準入出力ストリーム stream に、 ある命令の、アドレスが x のメモリ参照であるオペランド用の アセンブラ構文を出力する。x は RTL 式である。

機種によっては、シンボリックなアドレス用の構文は、そのアドレスが指して いるセクションに依存する。そういう機種では、マクロ ENCODE_SECTION_INFO を定義して、その情報を symbol_ref に格納し、このマクロでそれを 検査すること。

DBR_OUTPUT_SEQEND(file)

一個の C の文。全てのスロットの埋め草命令が出力された後に 実行すべき文である。必要なら dbr_sequence_length を 呼び出して、あるシーケンスで埋められるスロット数(現在、シーケンスを 出力中でないならゼロになる)を決定し、NOP命令を幾つ出力するかを 決める。

何もすべきことがないならこのマクロは定義しないこと。 ただし、遅延シーケンスの範囲が明らかになっている(例えば、空白によって) のなら、アセンブリ出力を読むときに役に立つであろう。

遅延スロットを持つ命令を出力するルーチンは、シーケンスの一部として 出力されないように(すなわち、スケジューリングパスが実行されないとき、 あるいはスロットを埋める命令が見つからない場合) 準備されていなければならない。変数 final_sequence は シーケンスの処理中でないときはヌルになり、処理中の場合は 出力される sequence RTX が入っている。

REGISTER_PREFIX
LOCAL_LABEL_PREFIX
USER_LABEL_PREFIX
IMMEDIATE_PREFIX

それぞれ、C の文字列式である。定義されていれば、asm_fprintf (‘final.c’ 参照)のオプション ‘%R’、‘%L’、‘%U’、 ‘%I’ で使われる。一個の ‘md’ ファイルで複数のアセンブラ形式を サポートしなければならないときに使う。その場合、色々な ‘tm.h’ で これらのマクロを別々に定義する。

ASSEMBLER_DIALECT

ターゲットのアセンブラ言語に複数の方言がある(オペコードが異なる等)場合は、 このマクロを一個の C の式として定義する。この式は、使うべき アセンブラ言語の方言のインデックス番号を指定する。この番号は 0 から 始まる。

このマクロが定義されていると、 ‘{option0|option1|option2…}’ という形の構文を、 パターンの出力テンプレート(see section 出力テンプレートとオペランド置換) や asm_fprintf の第一引数で使うことができる。 この構文は、ASSEMBLER_DIALECT の値が 0、1、2等になるのに 応じて、‘option0’、‘option1’、‘option2’ 等を出力する。 ここで指定する文字列内の任意の特殊文字は、その通常の意味が保たれる。

このマクロを定義しない場合は、‘{’、‘|’、‘}’ の 各文字は、テンプレートや asm_fprintf のオペランドで使われたときに 特別な意味を持たない。

色々な種類のアセンブラ言語構文をこの方法を使って表すことができるなら、 REGISTER_PREFIXLOCAL_LABEL_PREFIXUSER_LABEL_PREFIXIMMEDIATE_PREFIX といったマクロを定義すること。 構文の差異が大きくて、オペコードやオペランドの順番が異なるような 場合は、ASSEMBLER_DIALECT を定義して、 ‘{option0|option1}’ という構文を使うこと。

ASM_OUTPUT_REG_PUSH (stream, regno)

一個の C の式。stream にハードレジスタ番号 regno を スタックにプッシュするアセンブラコードを出力する。 このコードは最適化する必要はない。このマクロが使われるのは、プロファイリング の時だけなので。

ASM_OUTPUT_REG_POP (stream, regno)

一個の C の式。stream にハードレジスタ番号 regno を スタックからポップするアセンブラコードを出力する。 このコードは最適化する必要はない。このマクロが使われるのは、プロファイリング の時だけなので。


This document was generated using texi2html 1.78.