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

16.6.4 制約修飾子文字

以下に制約の修飾子となる文字を示す。

=

オペランドが書き込み専用であることを意味する。このオペランドに 以前保持されていた値は捨てられ、出力データで置き換えられる。

+

オペランドが読み込みと書き込みの両方に使われることを意味する。

コンパイラが、オペランドを制約を満たすように修正する際に、 どのオペランドが命令に対する入力で、どのオペランドが出力かを 知っている必要がある。‘=’ は、出力であることを示す。 ‘+’ は、オペランドが入力と出力の両方に使われることを示す。 それ以外のオペランドは入力専用と仮定される。

&

(ある特定の選択肢において)このオペランドが早期破壊 オペランドであることを意味する。早期破壊オペランドとは、 命令が入力オペランドを使い終わる前に変更されるオペランドである。 このため、このオペランドは、入力オペランドや任意のメモリアドレスの一部 として使われるレジスタには置かれない。

&’ は、記述されている選択肢に対してしか適用されない。 複数の選択肢のある制約では、一つの選択肢は ‘&’ を必要とするが 他の選択肢は必要としないということが時々ある。 そういう例については、68000 の ‘movdf’ insn を参照のこと。

入力オペランドは、それが入力として使われるのが以前の結果が書き込まれる 前なら、早期破壊オペランドに結び付けることができる。 この形式の選択肢を追加すると、入力の一部しか早期破壊により影響 を受けない場合は、GCC の生成するコードが良くなることが多い。 例えば、ARM の ‘mulsi3’ insn を参照のこと。

&’ があっても、‘=’ を書く必要はなくならない。

%

このオペランドと次のオペランドが交換可能であることを指示する。 これは、コンパイラにとって、二つのオペランドを交換するのが 全ての制約を満たすようにするには最もコストの低い方法であれば、 その方法を取ることを可能にする。 この制約は、オペランドを二つしか取らない加算命令向けのパターンで 良く使われる。以下に、68000 の半語の加算命令の定義例を示す。

 
(define_insn "addhi3"
  [(set (match_operand:HI 0 "general_operand" "=m,r")
     (plus:HI (match_operand:HI 1 "general_operand" "%0,0")
              (match_operand:HI 2 "general_operand" "di,g")))]
  …)
#

次に続く文字からコンマまでの全ての文字を制約としては使わないことを 示す。それらの文字は、レジスタ選択でのみ意味を持つ。

*

次に続く文字がレジスタ選択の際には無視されることを示す。 ‘*’ は、制約としての制限の意味と再ロードには影響を与えない。

次に例を示す。68000 は、データ・レジスタ中の半語を符号拡張する命令を 持っており、また、アドレス・レジスタにコピーすることで符号拡張を 行なうことも出来る。どちらの種類のレジスタも受け入れ可能な場合、 アドレスレジスタをコピー先とした場合の制約がより限定が緩いので、 レジスタ割当がアドレスレジスタを最終目標とするのが最適である。 このため、‘*’ を使って、制約文字 ‘d’ (データレジスタ用)が 好ましいレジスタを選択するときには無視されるようにする。

 
(define_insn "extendhisi2"
  [(set (match_operand:SI 0 "general_operand" "=*d,a")
        (sign_extend:SI
         (match_operand:HI 1 "general_operand" "0,g")))]
  …)

This document was generated using texi2html 1.78.