2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎

Slides:



Advertisements
Similar presentations
1 B10 CPU を作る 1 日目 解説 TA 高田正法
Advertisements

コンパイラ演習 第 6 回 2005/11/17 大山 恵弘 佐藤 秀明. 今回の内容 実マシンコード生成 – アセンブリ生成 (emit.ml) – スタブ、ライブラリとのリンク 末尾呼び出し最適化 – 関数呼び出しからの効率的なリターン (emit.ml) –[ 参考 ]CPS 変換 種々の簡単な拡張.
コンパイラ演習 第 6 回 (2011/11/17) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
コンパイラ演習 第 12 回 (2012/01/05) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
2006/10/5 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習番外編 (その2): JVM コンテスト
コンパイラ演習番外編 (その1): min-rt 改 コンテスト
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2012年度 計算機システム演習 第4回 白幡 晃一.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
コンパイラ演習 第 9 回 (2011/12/08) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
2006年度 計算機システム演習 第4回 2005年5月19日.
計算機システムⅡ 命令セットアーキテクチャ
コンパイラ演習 第12回 2006/1/26 大山 恵弘 佐藤 秀明.
2006/12/7 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
2006/11/02 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/11/16 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習 第 4 回 (2011/10/27) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
の まとめ 2007/04/02 (Mon) / d;id:hzkr
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
Tokuda Lab. NISHIMURA Taichi
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
TAL : Typed Assembly Language について
型付きアセンブリ言語を用いた安全なカーネル拡張
プログラミング言語入門 手続き型言語としてのJava
目的コードの生成 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第9章.
勉強会その3    2016/5/1 10 8分35秒 データの表現 演算.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
Cプログラミング演習 第7回 メモリ内でのデータの配置.
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
プログラミング言語入門.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
コンパイラ演習 第11回 2006/1/19 大山 恵弘 佐藤 秀明.
コンパイラ資料 実行時環境.
オブジェクト指向プログラミングと開発環境
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
プログラミング演習I 2003年4月30日(第3回) 木村巌.
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 5 回.
~sumii/class/proenb2010/ml2/
コンピュータアーキテクチャ 第 4 回.
ネットワーク・プログラミング デバイスドライバと環境変数.
ネットワーク・プログラミング Cプログラミングの基礎.
第4回 CPUの役割と仕組み2 命令の解析と実行、クロック、レジスタ
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
2006/6/27(通信コース)2006/7/5(情報コース) 住井
コンピュータアーキテクチャ 第 5 回.
言語プロセッサ 第12日目 平成20年1月9日.
X64 函数呼び出し規約 長谷川啓
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報システム基盤学基礎1 コンピュータアーキテクチャ編
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
6.5 最終コード生成 (1)コードの形式 ①絶対2進コード(AB : absolute binary) 命令後のオペランドが絶対番地指定。
Presentation transcript:

2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎 コンパイラ演習 第 4 回 2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎

今日の内容 仮想マシンコード生成 よりアセンブリに近い、 計算機のメモリを意識したコードに変換 関数呼び出し規約

仮想マシンコード 生成

クロージャ変換後のコード アセンブリ言語とはまだ隔たりがある データ構造の操作に伴うメモリ操作が 明示的でない レジスタが明示的でない データ構造の操作に伴うメモリ操作が 明示的でない レジスタが明示的でない 関数呼び出しに伴う変数の退避・回復が明示的でない if-then-else がある

MinCaml における今後の変換 データ構造の操作に伴う メモリ操作の明示化 → virtual.ml レジスタの明示化 → regalloc.ml 関数呼び出しに伴う 変数の退避・回復の明示化 → regalloc.ml if-then-else をラベルとブランチに変換 → emit.ml

MinCaml の仮想マシンコード (virtual.ml と regalloc.ml の間) メモリ操作が明示的 レジスタが非明示的 レジスタが無限個 変数の退避・回復が非明示的 if-then-else あり

MinCaml における 仮想マシンコード生成 (1) 以下の処理を行う命令列を生成 クロージャ作成 クロージャからの値の読み出し タプル作成 タプルからの値の読み出し 配列の値の読み出し・書き込み let 式を命令の列に変換

MinCaml における 仮想マシンコード生成 (2) 関数の引数を浮動小数とそれ以外に分離 後のフェーズのための準備 等号・不等号プリミティブを浮動小数用とそれ以外用に分離 型情報を利用 浮動小数定数テーブルを作成

関数呼び出し規約

関数呼び出し規約 関数を呼び出すコードと 呼び出される関数のコードとの間の約束事 関数呼び出し時に各レジスタが保持すべき値 関数を呼び出すコードと 呼び出される関数のコードとの間の約束事 関数呼び出し時に各レジスタが保持すべき値 関数呼び出し時の、あるべきメモリの状態 呼び出された関数によるレジスタ・メモリへの変更の仕方 各コンパイラ・アーキテクチャごとに 大体決まっている

関数呼び出し規約 (例): レジスタの使い方 汎用レジスタ: R0 から Rn-1 まで n 個 返り番地用レジスタ: Rret ヒープポインタ用レジスタ: Rhp スタックポインタ用レジスタ: Rsp

関数呼び出し規約 (例): 呼び出す側 生きている変数の値をスタックに退避する 呼び出される関数のクロージャのアドレスを R0 に入れる (クロージャを通じて呼び出す場合) 引数を R1, R2, R3, … に入れる 返り番地を Rret に入れる クロージャから、呼び出される関数のアドレスを取り出す (クロージャを通じて呼び出す場合) 呼び出される関数のアドレスにジャンプする 生きている変数の値をスタックから回復する

関数呼び出し規約(例): 呼び出される側 R0 の指すクロージャから自由変数の値を取り出す(自由変数がある場合) R1, R2, R3, … を引数として関数本体を実行する 返り値を R0 に入れる Rret にジャンプする

レジスタの使い方の例: SPARC g0 不使用: 常に値が0なので g1~g7 不使用: ライブラリの都合 o0~o5 一般レジスタとして使用(R13~R18) o6 不使用: OSやデバッガのため o7 Rret l0~l7 一般レジスタとして使用(R5~R12) i0, i1 Rsp, Rhp i2~i5 一般レジスタとして使用(R1~R4) i6, i7 不使用: OSやデバッガのため (※ 標準とは異なるので、main 関数や外部関数 にはスタブが要る)

レジスタの使い方の例: POWER r0 不使用: 命令によっては値が0なので r2 不使用: ライブラリの都合 r3~r30 一般レジスタとして使用(R1~R28) r1,r31 Rsp, Rhp LR Rret (※ 標準とは異なるので、main関数や外部関数 にはスタブが要る)

Callee-save register を導入する手もある 各レジスタを caller 側で保存・復元するかcallee 側で保存・復元するかは規約しだい Callee-save register は 小さい関数、leaf 関数で特に効く

メモリの使い方(例) ヒー プ Rhp 未使 用 Rs p Rretの退避 先 スタッ ク 汎用レジスタの退避 先 関数フレーム lo w hig h

共通課題 Web 検索エンジンや GCC などを利用してPOWER 以外のアーキテクチャで 標準の関数呼び出し規約が どうなっているか、 (少なくとも)一つ調べて述べよ。

課題の提出先と締め切り 提出先: compiler-enshu@yl.is.s.u-tokyo.ac.jp 締め切り: 2 週間後 (11/9) の午後 1 時 Subject: Report 4 <学籍番号> <アカウント> 本文にも氏名と学籍番号を明記のこと