LIR 定義

Const式

ここでは Const 式に対する意味を定義する。ASMCONST 式は Pure 式に分類されている。

(INTCONST t z) t∈Itype
z∈Z を型 t で表した整数値を表す。

(FLOATCONST t r) t∈Ftype ∧ br w r ≠ ⊥
r∈R を型 t で表した浮動小数値を表す。

Addr 式

ここでは Addr 式の意味を定義する。Static 式はグローバル変数のアドレス、Frame 式はローカル変数のアドレスを表すためのものである。

Label 式は L 関数のロケーションを表す。

(STATIC t s) t ∈Itype
s∈String で示されるプログラムメモリまたはデータメモリのアドレス。

(FRAME t s) t ∈Itype
s∈String で示されるオフセットとフレームポインタの和で生成されるデータメモリのアドレス。

(LABEL t s) t ∈Itype
s∈String で示されるロケーション。

Reg 式

ここでは Reg 式に対する意味を定義する。マシンの自然なワード長より小さな 単位での演算等で、オペランドに指定されたレジスタの一部にアクセスする場合が ある。そのような部分的なレジスタを、元のレジスタの部分レジスタという。

以下の定義が使われるのは Reg 式が Set 式の第一引数以外で、そのレジスタが 格納している値を取り出すという場合にかぎられるように Set 式が定義されている。

(REG t s)
s∈String で示されるレジスタの値。

(SUBREG t x n) w < w_1 ∧ 0 ≦ n < w_1/w ∈ N
xで指定されるレジスタの n 番目の部分レジスタの値。 m∈SubregModifier はここでは参照されない。

Pure 式

(NEG t x) t = tx
符号反転。

(ADD t x y) t = tx = ty
加算。

(SUB t x y) t = tx = ty
減算。

(MUL t x y) t = tx = ty
乗算。

(DIVS t x y) t = tx = ty
符号つき除算。

(DIVU t x y) t∈Itype ∧ t = tx = ty
符号なし除算。

(MODS t x y) t∈Itype ∧ t = tx = ty
符号つき剰余。

(MODU t x y) t∈Itype ∧ t = tx = ty
符号なし剰余。

(CONVSX t x) t,tx ∈Itype ∧ w > w_1
符号拡張。

(CONVZX t x) t,tx ∈Itype ∧ w > w_1
ゼロ拡張。

(CONVIT t x) t,tx ∈Itype ∧ w < w_1
精度の低い整数へ。

(CONVFX t x) t,tx ∈Ftype ∧ w > w_1
精度の高い浮動小数へ。

(CONVFT t x) t,tx ∈Ftype ∧ w < w_1
精度の低い浮動小数へ。

(CONVFI t x) t ∈Itype ∧ tx ∈Ftype
浮動小数から整数へ。

(CONVSF t x) t ∈Ftype ∧ tx ∈Itype
符号つき整数から浮動小数へ。

(CONVUF t x) t ∈Ftype ∧ tx ∈Itype
符号なし整数から浮動小数へ。

(BAND t x y) t ∈Itype ∧ t = tx = ty
論理積。

(BOR t x y) t ∈Itype ∧ t = tx = ty
論理和。

(BXOR t x y) t ∈Itype ∧ t = tx = ty
排他的論理和。

(BNOT t x) t ∈Itype ∧ t = tx
論理否定。

(LSHS t x y) t,ty ∈Itype ∧ t = tx
符号つき左シフト。y の値とモディファイア m=(s n d) に従い、以下のようにシフトカウントが決まる。 まず y の値を n ビットの符号つき(s=S)、 あるいは符号なし(s=U)整数と解釈し、仮のシフトカウントとする。 つぎに y の値がその n ビット符号つき(あるいは符号なし)数として 表現出来るなら仮のカウントを正式なシフトカウントとする。 そうでない場合、その挙動は d に依存し、d=D なら 表現出来なくてもその解釈された値をシフトカウントとする。 d=U ならシフトカウントを ⊥ とし、 シフト結果全体を ⊥ とする。

よっつあるシフト命令において、左シフト、右シフトの区別は シフトカウントが正の場合の向きによる。符号つきシフトか符号なしシフト かの区別はシフトされる x の値 v_1 の解釈による。

(LSHU t x y) t,ty ∈Itype ∧ t = tx
符号なし左シフト。

(RSHS t x y) t,ty ∈Itype ∧ t = tx
符号つき右シフト。

(RSHU t x y) t,ty ∈Itype ∧ t = tx
符号なし右シフト。

(TSTEQ t x y) t ∈Itype ∧ tx = ty
比較 (x = y)。

(TSTNE t x y) t ∈Itype ∧ tx = ty
比較 (x ≠ y)。

(TSTLTS t x y) t ∈Itype ∧ tx = ty
符号つき比較 (x < y)。

(TSTLES t x y) t ∈Itype ∧ tx = ty
符号つき比較 (x ≦ y)。

(TSTGTS t x y) t ∈Itype ∧ tx = ty
符号つき比較 (x > y)。

(TSTGES t x y) t ∈Itype ∧ tx = ty
符号つき比較 (x ≧ y)。

(TSTLTU t x y) t,tx ∈Itype ∧ tx = ty
符号なし比較 (x < y)。

(TSTLEU t x y) t,tx ∈Itype ∧ tx = ty
符号なし比較 (x ≦ y)。

(TSTGTU t x y) t,tx ∈Itype ∧ tx = ty
符号なし比較 (x > y)。

(TSTGEU t x y) t,tx ∈Itype ∧ tx = ty
符号なし比較 (x ≧ y)。

(ASMCONST t x) t = tx ∧ isasmconst x
意味は x と同じである。 ここに isasmconst はリンカが解決出来る定数かどうかを 判定する Unspecified 関数である。

(PURE t x) x∈IntConstExp
副作用のない任意の演算。拡張用。 ここに pureapply は自然数 nb v_1 で示される関数に引数 [v_2,…,v_n] を与えた結果を計算する Unspecified 関数である。

Mem 式

(MEM t x) tx ∈Itype
データメモリのアドレス x にある型 t のオブジェクトが 格納している値。 m∈MemModifier が存在し、m=V の時にかぎり Mem 式 は volatile オブジェクトを表し、読み込みがトレースに記録され、 結果は予測不能値となる。

Set 式

ここでは Set 式に対する意味を定義する。

(SET t (MEM t' x [& m]) y) t=t'=ty
データメモリのアドレス x にある型 t のオブジェクトへ x の値を代入する。 m∈MemModifier が存在し、m=V の時にかぎり Mem 式は volatile オブジェクトを表し、書き込みがトレースに記録される。

(SET t (REG t' s) x) t=t'=tx
Reg 式が表すレジスタに x の値を代入する。

(SET t (SUBREG t' (REG tx s) n)) t=t'=tx
SubReg 式が表す部分レジスタに x の値を代入する。 m∈SubregModifier が存在し、m=N の時にかぎり (REG tx s) 中の指定部分以外に予測不能値が入る。

Jump 式

(JUMP l)
ラベル式 l で示されるロケーションへジャンプする。

(JUMPC x l1 l2) x.code∈TstOps
Tst 式 x の値が 1 なら l1 へ、0 なら l2 へジャンプする。

(JUMPN x ((c1 l1) … (cn ln)) l0) tx∈Itype ∧ i≠j ⇒ ci ≠ cj
整数式 x の値が ci∈Z に等しければ li へジャンプ、 そうでなければ l0 へジャンプする。

DefLabel 式

(DEFLABEL s)
ラベルを定義する。

Call 式

ここでは Call 式の意味を定義する。

(CALL x1 (x2 … xn) (y1 … ym))
x1 の値 v1 で示されるプログラムメモリに L 関数があると仮定し、 多値関数としての解釈に引数を与え、結果の多値を yi に代入する。

Interface 式

ここでは Interface 式の意味を定義する。意味関数 E で参照されるのは w_f のみである。他は意味関数 F で参照される。

(PROLOGUE (wf wr) x1 … xn)
★フレームポインタを wf だけインクリメント。

(EPILOGUE (wf wr) x1 … xn)
★フレームポインタを wf だけデクリメント。

★F のセマンティックスにおけるローカルなエリアの変更を無視すること と関連しており、きちんとした定義はやっかいである。こまったもんだ。

Special 式

(PARALLEL x1 … xn)
x1,…,xn の副作用を同時に行なう。 xn は SET, USE, CLOBBER のいずれかで、PHI は含まない。

(USE r)
レジスタ r が使用されることを表す。

(CLOBBER x1)
構文から x1 は Set 式の第一引数に許されるものであり、 そこに予測不能値が入ることを表す。

(PHI x (x1 l1) … (xn ln))
φ関数( x = φ(x1, …, xn) )。
ここでxi(1≦i≦n)の値は、対応するラベル式li(1≦i≦n)が示す先行基本ブロック(predecessor)の一つから伝えられ、新しい変数x(REG式)にマージされる。

IF式

(IF t cond then else) t = tthen = telse
Tst式 cond を評価し、結果が真ならばthen、偽ならばelseの値を返 す式。その式の型は t である。

Last update: 2003/05/06
森 公一郎 kmori@lsi-j.co.jp