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

16.4 出力テンプレートとオペランド置換

出力テンプレートは文字列であり、 ある命令パターンに対するアセンブラコードを どのように出力するかを指定する。 テンプレートのほとんどの部分は、固定文字列であり、そのまま出力される。 文字 ‘%’ を使って、オペランドが代入される位置を指定する。 また、アセンブラに変種があるために異なる構文を必要とする場所を 特定するのにも使われる。

一番単純な場合では、‘%’ の数字 n が続いた場合は、 文字列のその部分にオペランド n を出力することを示す。

%’ の直後に英字1文字と数字1文字が続くと、オペランドの出力形式を 別のものに変えることを意味する。 英字としては四つの文字が標準で組み込み済の意味を持っており、 以下で解説する。マシン記述マクロ PRINT_OPERAND を 使って、標準ではない意味を持つ文字を追加定義することができる。

%cdigit’ を使うと、 通常は即値オペランドである事を示す構文を使わなくても、 定数値であるオペランドを置き換えることができる。

%ndigit’ は、表示前に定数値が否定を取られることを 除けば ‘%cdigit’ に同じである。

%adigit’ を使ってそれがあたかもメモリ参照であるかのように、 あるオペランドをアドレスとして扱われる実際のオペランドと置き換えることが できる。これは、「ロードアドレス」命令を出力する際に役に立つ。 そういう命令のアセンブラ構文では、オペランドをあたかもメモリ参照で あるかのように書くことを要求することが多いからである。

%ldigit’ は、ジャンプ命令に label_ref を代入するのに 使われる。

%=’ は、各命令に対し、コンパイルの全過程で一意的な番号を出力する。 これは、複数のアセンブラ命令を生成する一個のテンプレート中で 二回以上参照されるローカルラベルを作るときに便利である。

%’ の後ろに区切り文字が続くと、オペランドを使わない置き換えである ことを指定する。標準的な使い方は一個だけである。 ‘%%’ とするとアセンブラコードに ‘%’ を出力する。 その他の非標準的な場合は、マクロ PRINT_OPERAND で定義することが できる。 また、どの区切り文字が有効かをマクロ PRINT_OPERAND_PUNCT_VALID_P で 定義しなければならない。

テンプレートは複数のアセンブラ命令を生成して良い。 その場合には、各命令を ‘\;’ で区切って書く。

RTL にオペランドが二つあり、制約によりその二つが互いに一致することが 要求されている場合には、出力テンプレートでは、数字の小さい方のオペランド しか参照してはならない。一致したオペランドはいつも同じではなく、 コンパイラの残りの部分で、数字の小さい方のオペランドに出力する 適切な RTL 式を置くように調整する。

%’ の後ろに標準でない英文字や区切り文字を置く使い方の一つに、 同一のマシンに対する異なるアセンブラ言語を区別することがある。 例えば、68000 には Motorola 形式と MIT 形式がある。 Motorola 形式では、ほとんどのオペコード名にピリオドを使うのに対し、 MIT 形式では使わない。例えば、MIT 形式で ‘movel’ と書くオペコードは、 Motorola 形式では ‘move.l’ となる。 両方の出力形式に対して同じパターンファイルを使用するが、 Motorola 形式でピリオドが必要な場所には文字シーケンス ‘%.’ を 使うようにする。 マクロ PRINT_OPERAND は、Motorola 形式では、ピリオドを 出力するシーケンスを定義し、MIT 形式向けには何もしないマクロとして 定義する。

特別な場合として、テンプレートが一個の文字 # から成っていると コンパイラに対し、最初に insn を分割し、次にその結果の命令を別々に 出力することを指示する。 これは、出力テンプレートの冗長性を消去するのに役立つ。 複数のアセンブラ命令を出力する必要がある define_insn があり、 マッチする define_split が既に定義されているなら、 出力テンプレートとして単に # を使うことができ、 複数のアセンブラ命令を出力する出力テンプレートを書く必要はない。

マクロ ASSEMBLER_DIALECT が定義されていれば、 テンプレートで ‘{option0|option1|option2}’という形式の 構文を使うことができる。 アセンブラ言語の文法の複数の方言を記述する。 See section アセンブラ命令の出力.


This document was generated using texi2html 1.78.