Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)

9,073 views

Published on

Introducing a native compiler for 8-bit PIC micro controllers written in Common Lisp.

Published in: Technology
  • Be the first to comment

Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)

  1. 1. 8-bit PIC マイコン用ネイティブコンパイラの作成(後編) 2015.4.27 Masayuki Takagi Lisp Meet Up presented by Shibuya.lisp #27
  2. 2. © 2015 Masayuki Takagi-2- 自己紹介 高木 雅之 cl-cuda : a library to use NVIDIA CUDA in Common Lisp Common Lisp から CUDA を使うライブラリ。昨年ここで紹介しました。 仕事は? 1月に会社を設立。お見積もりお受けします。 Common Lisp @kamonama
  3. 3. © 2015 Masayuki Takagi-3- 前回のおさらい - 動機 これまで、まともにアセンブラを書いたことがなかったのです。 1月下旬:はじめての PIC マイコン 2月上旬:はじめてのアセンブラ PIC マイコンをはじめて触りました。 PIC で何作ろう?PIC用のコンパイラ作ろう。 2月中旬:PIC 用のコンパイラ
  4. 4. © 2015 Masayuki Takagi-4- 前回のおさらい - 前回のサマリ  ピン配置  メモリアーキテクチャ  プログラムメモリ  データメモリ  スペシャル・ファンクション・レジスタ  W レジスタ  命令セット 前回は、主に PIC マイコンのアーキテクチャを説明しました。
  5. 5. © 2015 Masayuki Takagi-5- 前回のおさらい - 話の流れ そのあと、今回作った、PIC マイコン用のコンパイラについて説明します。 PIC マイコンについて PIC マイコン用コンパイラについて 最初に、PIC マイコン自体について説明します。 基本的な内容なので、知っている人はニヤニヤしながら聞いていてください
  6. 6. © 2015 Masayuki Takagi-6- コンパイラについて - コンパイラの概要  ホスト言語は、ML 系言語の本当に小さなサブセット。ただし S 式表現  ターゲット言語は、 8 ビット PIC マイコンのアセンブリ  コンパイラ言語は、Common Lisp  コンパイラの設計は、MinCaml をベースにした(MinCaml ですみません…) 8 ビット PIC アセンブリ ML 系言語 サブセット (S 式表現) Common Lisp ホスト言語ホスト言語 ターゲット言語ターゲット言語コンパイラ言語コンパイラ言語
  7. 7. © 2015 Masayuki Takagi-7- コンパイラについて - 構文 リテラル 42 変数参照 x 減算 - 条件分岐 if 変数束縛 let 局所関数定義 let 関数適用 (f x y) 繰り返し loop I/O setreg リテラルは、8ビット符号無し整数のみ提供。 関数の引数や let 式で定義された変数を参照する。 いったん、8ビット符号無し整数の減算のみ提供。 いったん、整数の等値比較による条件分岐のみ提供。 let 式によって、変数を定義できる。 let 式によって、局所関数を定義できる。束縛の要素数によって、 変数束縛構文と区別する。クロージャは採用しない。 大域関数や局所関数に対する関数呼び出し。 PIC アセンブリの DECFSZ 命令にコンパイルされる効率的な繰り返 しを提供。 スペシャル・ファンクション・レジスタに対する I/O を提供。例外的に 、副作用を持つ構文。 今回のコンパイラは、いったん以下の構文を提供しています。
  8. 8. © 2015 Masayuki Takagi-8- コンパイラについて - loop 構文  繰り返しを、構文として提供  当初は、関数の再帰呼び出しに展開さ れる PIC マクロを定義していた →ループ変数の管理が必要  PIC の DECFSZ 命令にコンパイルされ るよう、改めて構文として定義 loop 構文 movlw 02Ah movwf L0 _LOOP7 call _DO_SOMETHING decfsz L0,f goto _LOOP7 retlw 000h この loop 構文は、以下の PIC アセンブリにコンパイルされる。 (loop 42 (do-something)) 以下のように loop 構文を使用する。 Common Lisp マクロ PIC マクロ 以下の中での設計選択 構文 コンパイラでの最適化 インライン・アセンブラ
  9. 9. © 2015 Masayuki Takagi-9- コンパイラについて - progn PICマクロ  逐次処理は、入れ子の let 式で表現す る(専用の構文を設けない)  簡単のため、progn PICマクロを提供  無駄な mov 命令は、アセンブリ出力時 に排除し最適化 progn PICマクロ (let ((tmp (setreg :gpio #x20))) (let ((tmp (mdelay 50))) (let ((tmp (setreg :gpio #x00))) (mdelay 950)))) progn PICマクロは、以下のように入れ子の let 式に展開される。 (progn (setreg :gpio #x20) ; LED を点灯 (mdelay 50) ; 50ms の遅延 (setreg :gpio #x00) ; LED を消灯 (mdelay 950)) ; 950ms の遅延 逐次処理は、progn PICマクロを使って以下のように記述できる。
  10. 10. © 2015 Masayuki Takagi-10- コンパイラについて – 呼び出し規約(1/2)  ハードウェアには、「関数呼び出し」の概念はない  あるのは、サブルーチン・コールのみ  「関数呼び出し」を実現するために、引数と戻り値の受け渡しのルールが必要  ソフトウェア・スタックに引数を積んで引き渡し  X86 系 CPU の push/pop 命令に相当  間接アドレシングが煩雑なため、方針変更 なぜ呼び出し規約が必要か?なぜ呼び出し規約が必要か? 当初の設計当初の設計
  11. 11. © 2015 Masayuki Takagi-11- コンパイラについて – 呼び出し規約(2/2)  入力用疑似レジスタ(I0-I7)、ローカル用疑似レジスタ(L0-L7)  MIPS や Sparc の呼び出し規約を参考  引数は、入力用疑似レジスタに格納して、呼び出される関数に渡す  戻り値は、W レジスタに格納して返す  関数呼び出し時に、「生きているレジスタ」をスタックに退避する 変更後の設計変更後の設計
  12. 12. © 2015 Masayuki Takagi-12- コンパイラについて - コンパイルステージ マクロ展開 インライン化 K 正規化 α変換 β簡約 let の平坦化 アセンブリ生成 レジスタ割り当て 即値最適化 仮想マシンコード生成 クロージャ変換 不要定義削除 以下のように、ホスト言語で記述されたプログラムを少しずつ変換して、ターゲット言語のプログラム を得ます。
  13. 13. © 2015 Masayuki Takagi-13- コンパイルステージ(1/12) - マクロ展開  コンパイルされる式に含まれるマクロを 展開  マクロは、DEFPICMACRO マクロで定義  式を走査し、マクロがあれば再帰的に走 査 マクロ展開 ;; delay for 500ms (mdelay 500) (progn (loop 1 (loop 0 (mdelay1))) (loop 244 (mdelay1))) マクロ展開前のコードを以下とすると、 以下のように、MDELAY PICマクロが展開される。 (defpicmacro mdelay (n) (check-type n (unsigned-byte 16)) (multiple-value-bind (q r) (truncate n 256) (cond ((and (> q 0) (> r 0)) `(progn (loop ,q (loop 0 (mdelay1))) (loop ,r (mdelay1)))) ((> q 0) `(loop ,q (loop 0 (mdelay1)))) ((> r 0) `(loop ,r (mdelay1))) (t '(nop))))) 以下のように、MDELAY PICマクロが定義されているとする。 マクロ展開 インライン化 K 正規化 α変換 β簡約 letの平坦化 不要定義削除 クロージャ変換 仮想マシンコード 即値最適化 レジスタ割り当て アセンブリ出力
  14. 14. © 2015 Masayuki Takagi-14- コンパイルステージ(2/12) - インライン化  大域関数や局所関数を、呼び出し元に 展開  関数呼び出しに伴う処理(レジスタの退 避、引数の受け渡し、ジャンプ)を削減  パフォーマンス上、非常に有効  ただし、デメリットもある(コードの肥大化 、コンパイル時間の増大) → どこまで実 施? インライン化 (loop 255 (mdelay1)) (loop 255 (loop #xf8 (nop))) インライン化される前のコードを以下とすると、 このコードは、以下のように MDELAY1 PIC関数がインライン化さ れる。 (defpic mdelay1 () (loop #xf8 ; 0xF8 is a magic number to delay (nop))) ; for 1 msec 以下のように、MDELAY1 PIC関数が定義されているとする。 マクロ展開 K 正規化 α変換 β簡約 letの平坦化 不要定義削除 クロージャ変換 仮想マシンコード 即値最適化 レジスタ割り当て アセンブリ出力インライン化
  15. 15. © 2015 Masayuki Takagi-15- コンパイルステージ(3/12) – K 正規化  式の評価の途中結果を、一時変数に格 納する  アセンブリは、複雑な式を一度に計算で きない  複雑な式を、よりアセンブリに近い簡単 な式に分解する K 正規化 (let ((tmp1 (+ x y)) (+ tmp1 z)) この式を K 正規化し、途中の評価結果を一時変数に格納するこ とで、以下の式が得られる。 (+ (+ x y) z) 以下のように、ある式の評価結果を別の式の引数に使う式があ るとする。 マクロ展開 インライン化 α変換 β簡約 letの平坦化 不要定義削除 クロージャ変換 仮想マシンコード 即値最適化 レジスタ割り当て アセンブリ出力K 正規化
  16. 16. © 2015 Masayuki Takagi-16- コンパイルステージ(4/12) – α変換  異なる変数に、異なる名前を付ける  後のコンパイルの過程が簡単になる  今回は、変数名だけでなく、関数名につ いても同様の変換を行う α変換 (let ((x1 (+ 1 2))) (let ((x2 (+ x1 3))) x2)) この式をα変換し、変数 x に別々の名前を付ける。 (let ((x (+ 1 2))) (let ((x (+ x 3))) x)) 以下のように、(たまたま)同じ名前の変数 x に値を束縛する式 があるとする。 マクロ展開 インライン化 K 正規化 β簡約 letの平坦化 不要定義削除 クロージャ変換 仮想マシンコード 即値最適化 レジスタ割り当て アセンブリ出力α変換
  17. 17. © 2015 Masayuki Takagi-17- コンパイルステージ(5/12) – β簡約  ある変数が別の変数に束縛されている とき、被束縛変数を束縛変数で置き換え る  λ計算におけるβ簡約(≒関数適用)の 特殊な形 β簡約 (+ y y) この式をβ簡約し、変数 x を変数 y で置き換える。伴い、let 束縛は取り除かれる。 (let ((x y)) (+ x y)) 以下のように、変数 x に変数 y が束縛されているとする。 マクロ展開 インライン化 K 正規化 α変換 letの平坦化 不要定義削除 クロージャ変換 仮想マシンコード 即値最適化 レジスタ割り当て アセンブリ出力β簡約
  18. 18. © 2015 Masayuki Takagi-18- コンパイルステージ(6/12) – let の平坦化  let 式の束縛式の中に、ネストして let 式 が現れるとき、それを平坦化する let の平坦化 (let ((y 1)) (let ((x (+ y 2))) (+ x 3))) これを、束縛式の中の let 式を外側に移しその本体式を変数に 束縛することで、平坦化する。 (let ((x (let ((y 1)) (+ y 2)))) (+ x 3)) 以下のように、let 式の束縛式の中にネストして let 式が現 れる式があるとする。 マクロ展開 インライン化 K 正規化 α変換 β簡約 不要定義削除 クロージャ変換 仮想マシンコード 即値最適化 レジスタ割り当て アセンブリ出力letの平坦化
  19. 19. © 2015 Masayuki Takagi-19- コンパイルステージ(7/12) – 不要定義削除  使われていない変数束縛や局所関数定 義を取り除く  このような変数束縛や局所関数定義は、 インライン化や定数畳み込みで生じる  ただし、副作用を伴う束縛は取り除かな いものとする 不要定義削除 (let ((f (x y) (+ x y))) (+ 1 2)) (+ 1 2) 関数 f は、その呼び出し元でインライン化される。 他に関数 f を呼び出す箇所がない場合、関数 f の定義を取 り除くことができる。 (let ((f (x y) (+ x y))) (f 1 2)) 以下のように、局所関数定義 f とその関数呼び出しがあるとする。 (let ((tmp (setreg :gpio #x00))) (mdelay 950)) ただし、逐次処理に伴う副作用を持つ束縛は、取り除かない。 マクロ展開 インライン化 K 正規化 α変換 β簡約 letの平坦化 クロージャ変換 仮想マシンコード 即値最適化 レジスタ割り当て アセンブリ出力不要定義削除
  20. 20. © 2015 Masayuki Takagi-20- コンパイルステージ(8/12) – クロージャ変換  今回は、クロージャを採用しない(第一級 の関数や自由変数は扱わない)  簡単のため、局所関数定義を式の外側 に移動するにとどめる  局所定義関数は、大域関数定義に続け てアセンブリにコンパイルされる クロージャ変換 (let ((f (x y) (+ x y))) (let ((a 1)) (f a 2))) 簡単のため、局所関数定義を外側へ移動する。 (let ((a 1)) (let ((f (x y) (+ x y))) (f a 2))) 以下のように、局所関数 f が定義されているとする。 マクロ展開 インライン化 K 正規化 α変換 β簡約 letの平坦化 不要定義削除 仮想マシンコード 即値最適化 レジスタ割り当て アセンブリ出力クロージャ変換
  21. 21. © 2015 Masayuki Takagi-21- コンパイルステージ(9/12) – 仮想マシンコード生成  最適化された式を、仮想マシンコードに 変換する  基本的には、Sparc の命令に対応  ただし、非線形な仮想マシンコード  let 命令の束縛式か本体式かが、リン ケージに対応 仮想マシンコード生成 (let ((x (set 1))) (let ((y (add 1 2))) (add x y))) この式は、以下の仮想マシンコードに変換される。 (let ((x 1)) (let ((y (+ 1 2))) (+ x y))) 以下のような式があるとする。 let 命令 letrec 命令 set 命令 mov 命令 sub 命令 ifeq 命令 loop 命令 call 命令 setreg 命令 with-save 命令 仮想マシンコードの一覧 :tail (:non-tail REG) リンケージ 関数末尾 関数非末尾(REGへの格納) restore 命令 マクロ展開 インライン化 K 正規化 α変換 β簡約 letの平坦化 不要定義削除 クロージャ変換 即値最適化 レジスタ割り当て アセンブリ出力仮想マシンコード
  22. 22. © 2015 Masayuki Takagi-22- コンパイルステージ(10/12) – 即値最適化  可能な場合、即値をオペランドにとる命 令を使うことで最適化  clrf 命令、movlw 命令、retlw 命令など 即値最適化 (let ((x (set 1))) (add x 2)) movlw 001h movwf L0 movlw 002h movwf L1 movf L1,w addwf L0,w return 即値最適化により、以下の仮想マシンコードに変換できる。 即値最適化により、最終的なアセンブリが以下のようになる。 (let ((x (set 1))) (let ((y (set 2))) (add x y))) 以下の仮想マシンコードがあるとする。 movlw 001h movwf L0 movlw 002h addwf L0,w return 即値最適化前(7命令) 即値最適化後(5命令) マクロ展開 インライン化 K 正規化 α変換 β簡約 letの平坦化 不要定義削除 クロージャ変換 仮想マシンコード レジスタ割り当て アセンブリ出力即値最適化
  23. 23. © 2015 Masayuki Takagi-23- コンパイルステージ(11/12) – レジスタ割当て  変数(≒無限に存在する仮想レジスタ) に、レジスタを割り当てる  ソフトウェア的な疑似レジスタ :L0 - :L7 を、順に割り当てる  レジスタの数が足りない場合は:  「死んでいる」レジスタを再利用  それでも足りない場合、ソフトウェア・ス タックに退避 レジスタ割当て (let ((:L0 (set 1))) (let ((:L1 (set 2))) (add :L0 :L1))) 変数に、レジスタを割り当てる。 (let ((x (set 1))) (let ((y (set 2))) (add x y))) 以下の仮想マシンコードがあるとする。 マクロ展開 インライン化 K 正規化 α変換 β簡約 letの平坦化 不要定義削除 クロージャ変換 仮想マシンコード 即値最適化 アセンブリ出力レジスタ割り当て
  24. 24. © 2015 Masayuki Takagi-24- コンパイルステージ(12/12) – アセンブリ出力  仮想マシンコードを PIC のアセンブリに 変換する  非線形のマシンコードを走査し、線形の PIC アセンブリに変換する  リンケージに応じ、レジスタに MOV する か、関数から RETURN する アセンブリ出力 ((movlw 1) ; (set 1) to :L0 (movwf :L0) (movlw 2) ; (set 2) to :L1 (movwf :L1) (movf :L1 :w) ; (add :L0 :L1) and set W reg (addwf :L0 :w) (return)) ; return to the caller movlw 001h movwf L0 movlw 002h movwf L1 movf L1,w addwf L0,w return この仮想マシンコードは、いったん PIC アセンブリの S 式表現に 変換される。 S 式で表現された PIC アセンブリは、以下の PIC アセンブリ に変換され出力される。 (let ((:L0 (set1))) (let ((:L1 (set 2))) (add :L0 :L1))) 以下のような、レジスタ割り当て済みの仮想マシンコードがあると する。 マクロ展開 インライン化 K 正規化 α変換 β簡約 letの平坦化 不要定義削除 クロージャ変換 仮想マシンコード 即値最適化 レジスタ割り当て アセンブリ出力
  25. 25. 実行例
  26. 26. © 2015 Masayuki Takagi-26- 実行例 – LED 点滅サンプル (defpic mdelay1 () (loop #xf8 ; 0xF8 is a magic number to delay (nop))) ; for 1 msec (defpicmacro mdelay (n) (check-type n (unsigned-byte 16)) (multiple-value-bind (q r) (truncate n 256) (cond ((and (> q 0) (> r 0)) `(progn (loop ,q (loop 0 (mdelay1))) (loop ,r (mdelay1)))) ((> q 0) `(loop ,q (loop 0 (mdelay1)))) ((> r 0) `(loop ,r (mdelay1))) (t '(nop))))) (defpic init () (progn (setreg :gpio #x0) ; clera GP0-5 (setreg :cmcon0 #x07) ; disable comparator (setbank1) ; switch to bank 1 (setreg :trisio #x08) ; only GP3 is input mode (setreg :ansel #x00) ; disable analog IO (setreg :ioc #x00) ; disable interruption (setbank0) ; switch to bank 0 (setreg :intcon #x00))) ; disable interruption (defpic main () (progn (setreg :gpio #x20) ; set GP5 to high (mdelay 50) ; delay for 50 msec (setreg :gpio #x00) ; set GP5 to low (mdelay 950) ; delay for 950 msec (main))) ; repeat LED 点滅サンプル - led.lisp mdelay1 PIC関数  処理を 1ms 遅延させる mdelay PICマクロ  指定したマイクロ秒だけ、処理を遅延させる  8ビット整数のため、一重のループでは 255ms まで。1秒 を表現できず不便  マクロにすることで、65535ms まで表現可能。 init PIC関数  ブート時に1度だけ実行される特殊関数  ここで、必要な初期設定を行う main PIC関数  init PIC関数の後に実行される特殊関数  ここで、メイン処理を行う  しばしば、自己再帰ループを構成する
  27. 27. © 2015 Masayuki Takagi-27- 実行例 – LED 点滅サンプル – mdelay1 PIC関数 _MDELAY1 MOVLW 0F8h MOVWF L0 _LOOP3 CLRF NULL DECFSZ L0,F GOTO _LOOP3 RETLW 000h ;;; 0xF8 is a magic number to delay ;;; for 1 msec. (defpic mdelay1 () (loop #xf8 (nop))) コンパイル前コンパイル前 アセンブリアセンブリ
  28. 28. © 2015 Masayuki Takagi-28- 実行例 – LED 点滅サンプル – mdelay PICマクロ (defpicmacro mdelay (n) (check-type n (unsigned-byte 16)) (multiple-value-bind (q r) (truncate n 256) (cond ((and (> q 0) (> r 0)) `(progn (loop ,q (loop 0 (mdelay1))) (loop ,r (mdelay1)))) ((> q 0) `(loop ,q (loop 0 (mdelay1)))) ((> r 0) `(loop ,r (mdelay1))) (t '(nop))))) (defpic mdelay950 () (mdelay 950)) コンパイル前コンパイル前 _MDELAY950 MOVLW 003h MOVWF L0 _LOOP11 CLRF L1 _LOOP12 MOVLW 0F8h MOVWF L2 _LOOP13 CLRF NULL DECFSZ L2,F GOTO _LOOP13 DECFSZ L1,F GOTO _LOOP12 DECFSZ L0,F GOTO _LOOP11 MOVLW 0B6h MOVWF L4 _LOOP14 MOVLW 0F8h MOVWF L5 _LOOP15 CLRF NULL アセンブリアセンブリ DECFSZ L5,F GOTO _LOOP15 DECFSZ L4,F GOTO _LOOP14 RETLW 000h
  29. 29. © 2015 Masayuki Takagi-29- 実行例 – LED 点滅サンプル – init PIC関数 _INIT CLRF GPIO MOVLW 007h MOVWF CMCON0 MOVLW 020h MOVWF STATUS MOVLW 008h MOVWF TRISIO CLRF ANSEL CLRF IOC CLRF STATUS CLRF INTCON RETURN (defpic init () (progn (setreg :gpio #x0) ; clear GP0-5 (setreg :cmcon0 #x07) ; disable comparator (setbank1) ; switch to bank 1 (setreg :trisio #x08) ; only GP3 is input mode (setreg :ansel #x00) ; disable analog IO (setreg :ioc #x00) ; disable interruption (setbank0) ; switch to bank 0 (setreg :intcon #x00))) ; disable interruption コンパイル前コンパイル前 アセンブリアセンブリ
  30. 30. © 2015 Masayuki Takagi-30- 実行例 – LED 点滅サンプル – main PIC関数 _MAIN MOVLW 020h MOVWF GPIO MOVLW 032h MOVWF L1 _LOOP4 MOVLW 0F8h MOVWF L2 _LOOP5 CLRF NULL DECFSZ L2,F GOTO _LOOP5 DECFSZ L1,F GOTO _LOOP4 CLRF GPIO MOVLW 003h MOVWF L5 _LOOP6 CLRF L6 _LOOP7 MOVLW 0F8h MOVWF L7 _LOOP8 (defpic main () (progn (setreg :gpio #x20) ; set GP5 to high (mdelay 50) ; delay for 50 msec (setreg :gpio #x00) ; set GP5 to low (mdelay 950) ; delay for 950 msec (main))) ; repeat コンパイル前コンパイル前 アセンブリアセンブリ CLRF NULL DECFSZ L7,F GOTO _LOOP8 DECFSZ L6,F GOTO _LOOP7 DECFSZ L5,F GOTO _LOOP6 MOVLW 0B6h MOVWF L0 _LOOP9 MOVLW 0F8h MOVWF L1 _LOOP10 CLRF NULL DECFSZ L1,F GOTO _LOOP10 DECFSZ L0,F GOTO _LOOP9 GOTO _MAIN
  31. 31. © 2015 Masayuki Takagi-31- 実行例 – LED 点滅サンプル – 生成されるアセンブリ INCLUDE"p12f683.inc" list p=12f683 __CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BOD_ON & _IESO_OFF& _PWRTE_ON & _INTOSCIO & _MCLRE_OFF CBLOCK 020h L0,L1,L2,L3,L4,L5,L6,L7 I0,I1,I2,I3,I4,I5,I6,I7 NULL SP,STMP,STK ENDC ORG 0 GOTO MAIN ORG 4 GOTO INTR _INTR RETURN _INIT CLRF GPIO MOVLW 007h MOVWF CMCON0 MOVLW 020h MOVWF STATUS MOVLW 008h MOVWF TRISIO CLRF ANSEL CLRF IOC CLRF STATUS CLRF INTCON RETURN _MAIN MOVLW 020h MOVWF GPIO MOVLW 032h MOVWF L1 _LOOP1 MOVLW 0F8h MOVWF L2 _LOOP2 CLRF NULL DECFSZ L2,F GOTO _LOOP2 DECFSZ L1,F GOTO _LOOP1 CLRF GPIO MOVLW 003h MOVWF L5 _LOOP3 CLRF L6 _LOOP4 MOVLW 0F8h MOVWF L7 _LOOP5 CLRF NULL DECFSZ L7,F GOTO _LOOP5 DECFSZ L6,F GOTO _LOOP4 DECFSZ L5,F GOTO _LOOP3 MOVLW 0B6h MOVWF L0 _LOOP6 MOVLW 0F8h MOVWF L1 _LOOP7 CLRF NULL DECFSZ L1,F GOTO _LOOP7 DECFSZ L0,F GOTO _LOOP6 GOTO _MAIN _PUSH_STACK MOVWF STMP MOVF SP,W MOVWF FSR MOVF STMP,W MOVWF INDF INCF SP,F RETURN _POP_STACK DECF SP,F MOVF SP,W MOVWF FSR MOVF INDF,W RETURN INTR CALL _INTR RETFIE MAIN MOVLW STK MOVWF SP CALL _INIT CALL _MAIN END
  32. 32. おまけ
  33. 33. © 2015 Masayuki Takagi-33- Lisp マシン  CONS マシン、CADR マシン、Symbolics、SCHEME-79 チップ、ELIS、SILENT  LispmFPGA、Spica  Reduceron(ハードウェアによるλ計算)  タグ付きデータ  多重分岐  メモリ管理  非線形命令セット(どこまで可能?) Lisp マシンいろいろLisp マシンいろいろ Lisp マシンの要件(仮)Lisp マシンの要件(仮)
  34. 34. © 2015 Masayuki Takagi-34- Lisp マシン  ハードウェアによるリアルタイム・ガベージ・コレクションの実装  S. Shukla et al., IBM Research, 2012, “And Then There Were None: A Stall-Free Real -Time Garbage Collector for Reconfigurable Hardware”  CPU ストールがゼロ  ゴール設定は? いまやっていることいまやっていること 課題課題

×