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