[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
メモリアドレスとして現れる、特別な副作用式コードが 6 つある。
(pre_dec:m x)
x を標準量だけデクリメントする副作用を表す。
また、x がデクリンメントされた後の値も表す。
x は reg
か mem
でなければならず、
ほとんどのマシンでは 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)
x を y に設定する副作用を表現し、かつ x が修正を受ける前の
x を表現する。x は reg
か mem
でなければならない。
だが、多くの機種では 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.