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

15.14 アドレスの埋め込み副作用

メモリアドレスとして現れる、特別な副作用式コードが 6 つある。

(pre_dec:m x)

x を標準量だけデクリメントする副作用を表す。 また、x がデクリンメントされた後の値も表す。 xregmem でなければならず、 ほとんどのマシンでは reg しか許していない。 m はそのマシンのポインタ用のマシンモードでなければならない。 x のデクリメントされる量は、アドレスとして振る舞う式の メモリ参照を含むマシンモードの長さをバイト数で表したものである。 以下に使い方の例を示す。

 
(mem:DF (pre_dec:SI (reg:SI 39)))

これは、疑似レジスタ 39 を DFmode の値の長さだけデクリメントし、 その結果を DFmode の値のアドレスとして使う事を示している。

(pre_inc:m x)

同様だが、デクリンメントではなく x のインクリメントを指定する。

(post_dec:m x)

pre_dec と同じ副作用を表すが、異なる値になる。 これにより表される値は、デクリメントされる前の x の値である。

(post_inc:m x)

同様だが、デクリンメントではなく x のインクリメントを指定する。

(post_modify:m x y)

xy に設定する副作用を表現し、かつ x が修正を受ける前の x を表現する。xregmem でなければならない。 だが、多くの機種では reg しか許していない。 m は使われている機種でのポインタのマシンモードでなければならない。 x がデクリメントされる量は、この式がアドレスの役割をする メモリ参照のマシンモードの長さをバイトで表したものである。 これは、現在実装されていないことに注意。

y は次の三つの形式のうちの一つでなければならない。

(plus:m x z) (minus:m x z) (plus:m x i)

ここで z はインデックス・レジスタで、i は定数である。

使い方の例を示す。

 
(mem:SF (post_modify:SI (reg:SI 42) (plus (reg:SI 42) (reg:SI 48))))

これは、疑似レジスタ 42 を、疑似レジスタ 48 の内容をそれに加算する形で 変更することを示している。ただし、42 が指し示していた内容が使われた後で 行われる。

(pre_modify:m x expr)

同様に、x の内容を使う前に副作用が発生する。

これらの組み込み副作用式は注意して使わなければならない。 命令パターンでは使わない。コンパイラの ‘flow’ パスに至るまでは、 スタックへのプッシュを表現するのに使われるだけである。 ‘flow’ パスは、レジスタが一個の命令でインクリメントまたはデクリメント され、かつ、その直前または直後でアドレスとして使われている場合を 探す。そのような場合は、プリ/ポスト・インクリメント/デクリメントを 使うように変換する。

これらの式のオペランドとして使われているレジスタが、 ある insn の別のアドレス中で使われていると、そのレジスタの元の値が使われる。 レジスタをアドレス以外に使うことは、同一 insn 内で埋め込み副作用式として 使うのは許されない。なぜなら、そういう式は、 異なる機種では異なる振る舞いをし、そのため、取扱いが曖昧になるので 許されない。

組み込み副作用式で表現可能な命令は、また、 アドレスレジスタがどのように変更されるかを記述する追加の set を含む parallel を使って表現することもできる。 だが、これは行なわれない。何故ならこのような操作をともかく許す機種では、 典型的には、メモリアドレスが要求される場所ならどこでもそういう操作を 許すからである。 これらの操作を付加的な並列格納として記述すると、 マシン記述のエントリ数が二倍必要になる。


This document was generated using texi2html 1.78.