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

16.15.7 遅延スロットの定義

insn の属性の機構を使うと、ターゲットマシンに遅延スロットがもしあれば、 遅延スロットを必要であると指定することができる。 ある命令は、物理的にその直後に置かれている命令群が、その命令の前に 置かれているかのように実行されるとき、遅延スロットを必要とする と言われる。 古典的な例では、分岐命令と呼び出し命令が該当し、 分岐や呼び出しが実行される前に後続の命令を実行することがある。

機種によっては、条件分岐命令が、遅延スロットに置かれている 命令を選択的に無効化することができる。 これは、遅延スロットにある命令が、分岐の結果によっては実行されないという ことを意味する。 分岐が真のときに無効化を行なう命令と分岐が偽の時に無効化を行なう命令の 両方がサポートされている。

遅延スロット空けジューリングが命令スケジューリングと異なるのは、 ある命令が遅延スロットを必要とするかどうかを決めるには、生成される 命令の型にだけ依存し、命令間のデータ流には依存しないという点にある。 データ依存の命令スケジューリングに関する議論については次の節を 参照のこと。

ある insn が一個以上の遅延スロットを必要とするという要件は、 define_delay 式により指示される。 define_delay 式は以下の形式を取る。

 
(define_delay test
              [delay-1 annul-true-1 annul-false-1
               delay-2 annul-true-2 annul-false-2
               …])

test は、属性のテストであり、この define_delay がある特定の insn に適用されるかどうかを指示する。 もし適用されるのであれば、必要な遅延スロットの数が 二番目の引数として指定されるベクターの長さにより決定される。 遅延スロット n に置かれている insn は、属性テスト delay-n を 満足しなければならない。annul-true-n は属性テストであり、 分岐が真の時にどの insn が無効化されるかを指定する。 同様に、annul-false-n は分岐が偽の時に、 遅延スロットにあるうちのどの insn が無効化されるかを指定する。 遅延スロットの無効化がサポートされていないなら、(nil) を 指定すること。

例えば、良くある場合として分岐 insn と呼び出し insn が一個の遅延スロット を必要とし、そのスロットには分岐あるいは呼び出し以外の任意の insn を 置くことができる場合、以下のコードを ‘md’ ファイルに置くことになる。

 
(define_delay (eq_attr "type" "branch,call")
              [(eq_attr "type" "!branch,call") (nil) (nil)])

define_delay 式は複数指定することができる。 その場合、各 define_delay 式は、別々の遅延スロット要件を 指定し、二つの define_delay 式のテストで両方真になる insn が あってはならない。

例えば、分岐には一個の遅延スロットを必要とするが、呼び出しには二つ の遅延スロットが必要で、遅延スロットには分岐 insn も呼び出し insn も 置くことができず、分岐用の遅延スロットに有効な任意の insn が 分岐が真の場合には無効化可能であるという機種では、以下のように表現する。

 
(define_delay (eq_attr "type" "branch")
   [(eq_attr "type" "!branch,call")
    (eq_attr "type" "!branch,call")
    (nil)])

(define_delay (eq_attr "type" "call")
              [(eq_attr "type" "!branch,call") (nil) (nil)
               (eq_attr "type" "!branch,call") (nil) (nil)])

This document was generated using texi2html 1.78.