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

16.6.2 複数の制約の選択肢

一個の命令が可能なオペランドの複数の選択肢の組を持つことが時々ある。 例えば、68000 では論理和命令はレジスタか即値をメモリと組み合わせることが できる。あるいは、任意の種類のオペランドをレジスタと組み合わせることができる。 だが、一つのメモリ位置をもう一つのメモリ位置と組み合わせることはできない。

このような制約は複数の選択肢として表現される。ある選択肢は、 各オペランド毎に、文字の連なりで記述される。あるオペランドに対する 制約は全体としては、最初の選択肢に現れるこのオペランド用の文字、カンマ、 第二の選択肢に現れるこのオペランド用の文字、カンマ、... が最後の選択肢 まで続く。 これが、68000 の全ワードの論理和命令ではどのようになされているかを 以下に示す。

 
(define_insn "iorsi3"
  [(set (match_operand:SI 0 "general_operand" "=m,d")
        (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
                (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
  …)

最初の選択肢は、オペランド0には ‘m’(メモリ)、オペランド 1 には ‘0’(これはオペランド 0 に一致しなければならないことを意味する)、 オペランド 2 には ‘dKs’ となる。 第二の選択肢は、オペランド0には ‘d’(データ・レジスタ)、 オペランド 1 には ‘0’、オペランド 2 には ‘dmKs’ となる。 制約中の ‘=’ と ‘%’ は全選択肢に適用される。 それらの意味は次の節 (see section レジスタクラス選択)で説明する。

全てのオペランドがどれか一つの選択肢に収まれば、その命令は有効である。 収まらない場合には、選択肢毎に、コンパイラが、選択肢を適用可能にするためには、 オペランドをコピーするための命令を幾つ追加しなければならないかを数え上げる。 最もコピーが少なくて済む選択肢が選ばれる。もし二つの選択肢のコピー数が 同じなら、先に現れるものが選ばれる。この選択方法は文字 ‘?’ と ‘1’ を使って変えることが出来る。

?

どの選択肢も厳密には適用できないときの選択として、 ‘?’ が現れる選択肢をちょっとだけ低く評価する。 GNU CC は、この選択肢を、そこに現れる ‘?’ 毎に、一単位分コストが 余計にかかるとみなす。

!

!’が現れる選択肢を大幅に低く評価する。 この選択肢は再ロードなしで収まる場合には依然として使うことができるが、 再ロードが必要な場合は、何か他の選択肢が使われる。

insn のパターンが、その制約に複数の選択肢を持つ場合は、 アセンブラコードの見た目は、どの選択肢が一致したかによりほとんどの場合 決まる。その場合は、アセンブラコードを書き出す C のコードで、 変数 which_alternative を使うことが出来る。 which_alternative は、何番目の選択肢が実際に満たされるかを 示す番号である。第一の選択肢は 0、第二の選択肢は 1 といった具合である。 See section アセンブラ出力用の C 言語の文


This document was generated using texi2html 1.78.