目的コードの生成 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第9章.

Slides:



Advertisements
Similar presentations
コンパイラ演習 第 6 回 2005/11/17 大山 恵弘 佐藤 秀明. 今回の内容 実マシンコード生成 – アセンブリ生成 (emit.ml) – スタブ、ライブラリとのリンク 末尾呼び出し最適化 – 関数呼び出しからの効率的なリターン (emit.ml) –[ 参考 ]CPS 変換 種々の簡単な拡張.
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ 2012年10月25日
言語処理系(1) 金子敬一.
CPU実験 第1回中間発表 4班 瀬沼、高橋、津田、富山、張本.
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
プログラミング言語論 第4回 式の構文、式の評価
2012年度 計算機システム演習 第4回 白幡 晃一.
App. A アセンブラ、リンカ、 SPIMシミュレータ
2006年度 計算機システム演習 第4回 2005年5月19日.
第4回目 2006/05/08.
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
条件式 (Conditional Expressions)
言語処理系(8) 金子敬一.
コンパイラ演習 第 4 回 (2011/10/27) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
第4回放送授業.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
計算機基礎Ⅱ,Ⅲ (指導書 pp. 76~94) 改訂:佐竹 純二 (作成:岡本 吉央).
6.4 コード最適化 (1)コード最適化(code optimization)
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
関数 関数とスタック.
第3回目 2006/05/01.
コンパイラ 2011年10月27日
コンパイラの解析 (4) 例外処理.
言語プロセッサ 第7回目 平成27年11月16日.
B演習(言語処理系演習)第8回 評価器 田浦.
勉強会その3    2016/5/1 10 8分35秒 データの表現 演算.
帰納変数 iが基本帰納変数 変数iに対して、 i := i±c という形の代入が一つのみ jがiに対する帰納変数
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
コンパイラ 第13回 上昇型構文解析(1) 38号館4階N-411 内線5459
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
レジスタの割付け 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第12章5節.
言語プロセッサ 第8回目 平成22年11月22日.
計算機構成 第6回 分岐命令とプログラムの実行 テキスト第5章
コンパイラ資料 実行時環境.
離散数学 07. 木 五島.
計算機構成 第3回 データパス:計算をするところ テキスト14‐19、29‐35
08. メモリ非曖昧化 五島 正裕.
計算機工学III オペレーティングシステム #4 並行プロセス:排他制御基礎 2006/04/28 津邑 公暁
フロントエンドとバックエンドのインターフェース
C言語を用いたマシン非依存な JITコンパイラ作成フレームワーク
オブジェクト指向プログラミングと開発環境
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
コンパイラ 2011年10月20日
09. メモリ・ディスアンビギュエーション 五島 正裕.
コンピュータアーキテクチャ 第 2 回.
ポインタとポインタを用いた関数定義.
コンピュータアーキテクチャ 第 2 回.
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
コンピュータアーキテクチャ 第 5 回.
プログラムの開発手順 1.プログラム設計(仕様の決定) 2.コーディング(ソースファイルの作成) 3.アセンブル(オブジェクトファイル
第6回放送授業.
言語プロセッサ 第12日目 平成20年1月9日.
X64 函数呼び出し規約 長谷川啓
Inline 展開のアルゴリズム 長谷川啓
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
フレンド関数とフレンド演算子.
演算子のオーバーロード.
PROGRAMMING IN HASKELL
情報システム基盤学基礎1 コンピュータアーキテクチャ編
POPL ミーティング 6/7 Inside ADL
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
C#プログラミング実習 第1回.
情報処理Ⅱ 第3回 2004年10月19日(火).
6.3 インタプリタ (1)インタプリタ(interpreter)とは
情報処理Ⅱ 第8回:2003年12月9日(火).
6.5 最終コード生成 (1)コードの形式 ①絶対2進コード(AB : absolute binary) 命令後のオペランドが絶対番地指定。
Presentation transcript:

目的コードの生成 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第9章

中間語 構文木とDAG 四つ組(3番地コード)と三つ組 抽象構文木(AST:abstract syntax tree) DAG(directed acyclic graph) 中間木 四つ組(3番地コード)と三つ組 (演算子, オペランド1, オペランド2, 結果) (演算子, オペランド1, オペランド2) 結果を三つ組の場所で示す。

中間語(続き) RTL 機械語 Register transfer language 命令語はレジスタとのやりとりが主。 例: a[i]=b+1; r[1]=m[b] r[1]=r[1]+1 r[2]=m[i] r[2]=r[2]*4 m[a+r[2]]=r[1] 機械語

コード生成器生成系 パターンマッチングによるコード生成器 コード生成器 目的コード 中間木 パターン 機械語 ….. ….. + → add reg, reg, const add r1, r1, 4 + reg const ….. ….. r1 4 パターンマッチングと コード生成のプログラム

木のパターンマッチングによる コード生成 = → R2 → R2 * + R2 + 2 R1 C R1 C R1 ↑ → R2 → R2 * + R2 + 2 R1 C R1 C R1 store R2,C(R1) load R2,C(R1) shiftL R2,R1,1 R1やR2はレジスタにマッチする。 Cは定数にマッチする。

= + * a r1 2 ↑ + b r1

= + r2 * a r1 2 ↑ + b r1 store r2,a(r1)

= + r2 * a r1 2 r2 ↑ + shiftL r2,r2,1 b r1 store r2,a(r1)

= + r2 * a r1 2 r2 + load r2,b(r1) shiftL r2,r2,1 b r1 store r2,a(r1) ↑ + load r2,b(r1) shiftL r2,r2,1 b r1 store r2,a(r1)

極大食い(maximal munch) トップダウンのパターンマッチング いろいろなマッチングがありうるときは、 中間木の根から葉の方向に。 いろいろなマッチングがありうるときは、 できるだけ大きなパターンを選ぶ。 極大食いが常に最適とは限らない。

ダイナミックプログラミングによる コード生成 (1) (2) (3) C → R1 = = + R2 R1 ↑ C R1 R2 M[R1+C]←R2 M[R1]←M[R2] R1←C cost=5 cost=6 cost=1

(5) (4) (6) → R1 → R2 → R1 + C + C R1 C R1 R1←M[C] R2←M[R1+C] R1←R1+C ↑ → R1 → R2 ↑ → R1 + C + C R1 C R1 R1←M[C] R2←M[R1+C] R1←R1+C cost=3 cost=5 cost=1

(7) → R1 + (8) R2 → R2 + + R1 R2 C R1 R1←R2+M[R1+C] R1←R1+R2 cost=6 ↑ R2 → R2 + + R1 R2 C R1 R1←R2+M[R1+C] R1←R1+R2 cost=6 cost=1

= + ↑ a ↑ + k b ↑ j a[k]=b[j];

= + ↑ a ↑ + k b ↑ r1←b; 1 b; 0 j

= + a + r3←a; 1 a; 0 b k r1←b; 1 r4←k; 1 b; 0 k; 0 j r2←j; 1 j; 0 ↑ ↑

= + a + r3←a; 1 a; 0 r2←M[j]; 0+3=3 b r2←M[r2+0]; 1+5=6 k r1←b; 1 ↑ a ↑ + r3←a; 1 a; 0 r2←M[j]; 0+3=3 r2←M[r2+0]; 1+5=6 k b ↑ r1←b; 1 b; 0 r4←k; 1 k; 0 j r2←j; 1 j; 0

= + r2←r2+b; 3+0+1=4 a + r2←r2+r1; 3+1+1=5 r3←a; 1 a; 0 r2←M[j]; 0+3=3 ↑ r2←r2+b; 3+0+1=4 r2←r2+r1; 3+1+1=5 a ↑ + r3←a; 1 a; 0 r2←M[j]; 0+3=3 r2←M[r2+0]; 1+5=6 k b ↑ r1←b; 1 b; 0 r4←k; 1 k; 0 j r2←j; 1 j; 0

= r2←M[r2+b]; 3+0+5=8 r2←M[r2+0]; 4+5=9 + r2←r2+b; 3+0+1=4 a + ↑ r2←r2+b; 3+0+1=4 r2←r2+r1; 3+1+1=5 a ↑ + r3←a; 1 a; 0 r2←M[j]; 0+3=3 r2←M[r2+0]; 1+5=6 k b ↑ r1←b; 1 b; 0 r4←k; 1 k; 0 j r2←j; 1 j; 0

= r2←M[r2+b]; 3+0+5=8 r2←M[r2+0]; 4+5=9 + a + r2←M[j]; 0+3=3 b k ↑ a ↑ + r2←M[j]; 0+3=3 k b ↑ r1←b; 1 b; 0 j

= r2←M[r2+b]; 3+0+5=8 r2←M[r2+0]; 4+5=9 + r2←r2+b; 3+0+1=4 a + b k j ↑

= r4←r4+a; 3+0+1=4 r4←r4+r3; 3+1+1=5 r2←M[r2+b]; 3+0+5=8 ↑ r4←M[k]; 0+3=3 r4←M[r4+0]; 1+5=6 r2←r2+b; 3+0+1=4 r2←r2+r1; 3+1+1=5 a ↑ + r3←a; 1 a; 0 r2←M[j]; 0+3=3 r2←M[r2+0]; 1+5=6 k b ↑ r1←b; 1 b; 0 r4←k; 1 k; 0 j r2←j; 1 j; 0

M[r4+a]←r2; 3+8+5=16 M[r4]←M[r2]; 4+4+6=14 = r4←r4+a; 3+0+1=4 r2←M[r2+b]; 3+0+5=8 r2←M[r2+0]; 4+5=9 + ↑ r4←M[k]; 0+3=3 r4←M[r4+0]; 1+5=6 r2←r2+b; 3+0+1=4 r2←r2+r1; 3+1+1=5 a ↑ + r3←a; 1 a; 0 r2←M[j]; 0+3=3 r2←M[r2+0]; 1+5=6 k b ↑ r1←b; 1 b; 0 r3←k; 1 k; 0 j r2←j; 1 j; 0

r2 ← M[j] 3 r2 ← r2+b 1 r4 ← M[k] 3 r4 ← r4+a 1 M[r4] ← M[r2] 6

文のコード生成 c=true c=false e=e1|e2 e=e1&e2 e=!e1 e=変数 Load R,e T(e,c,L)の定義:if (e==c) goto Lの目的コード c=true c=false e=e1|e2 T(e1,true,L) T(e2,true,L) T(e1,true,newL) T(e2,false,L) newL: e=e1&e2 T(e1,false,newL) T(e1,false,L) e=!e1 e=変数 Load R,e BrT R,L BrF R,L

文のコード生成 T((a&b)|!(c|d),true,L) = T(a&b,true,L) = T(a,false,L1) Load R1,a BrF R1,L1 T(b,true,L) Load R1,b BrT R1,L L1: L1: T(!(c|d),true,L) =T(c|d,false,L) = T(c,true,L2) Load R1,c BrT R1,L2 T(d,false,L) Load R1,d BrF R1,L L2: L2:

手続き呼び出しのコード レジスタの使い方 特定目的に使われるレジスタ BrLink L ! Branch and Link 大域的に使われるレジスタ群 手続き呼び出しをしても値が変わらない。 呼び出され側で大域的なレジスタを使う場合は、 呼び出され側で退避する(callee save register)。 局所的に使われるレジスタ群 それが保証されないもの。 呼び出し側で局所的なレジスタを使っている場合は、 呼び出し側で退避する(caller save register)。

プロローグ エピローグ 呼び出し側 呼び出され側 L: フレーム領域の獲得 大域レジスタの退避 (特定レジスタの退避 と新設定も含む)  と新設定も含む) 局所レジスタの退避 パラメタのセット 手続き本体のコード BrLink L 局所レジスタの回復 大域レジスタの回復 エピローグ フレーム領域の解放 戻り値のセット 戻り命令 呼び出し側 呼び出され側