海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
前回 は、レジスタ割付けを人手でやってどうにか動かしたんだが、あれから10章(生存解析)、11章(レジスタ割付け)を経て、晴れて全部コンパイラでできるようになった。
まだ未実装の機能もあり、機能確認もこれからなので、確認済の限られた機能だけをつかって FizzBuzz をやってみた。実行結果のスクリーンショットが上、ソースが下である。なんか、まだ & 演算子を実装してなかったようで、最初の条件を mod3 = 0 & mod5 = 0
のように書いたらうまくいかなかった。
それはそうと、うまくいかないときに「残念ながらアプリは停止しました」しか情報がないのがつらい。
let
var mod5 := 0
var mod3 := 0
in
for i := 1 to 30 do (
mod5 := i - i / 5 * 5;
mod3 := i - i / 3 * 3;
if (mod5 + mod3) = 0 then
print("FizzBuzz, ")
else if mod3 = 0 then
print("Fizz, ")
else if mod5 = 0 then
print("Buzz, ")
else
(print(toString(i)); print(", "))
);
print("...\n")
end
以下、完全に自分むけメモだけど、今日の修正について。
Assem.hs の修正(oper_dst に src も加えた)は、Assem が複数命令を含んでいることによるもの。Assem の外からみると src と dst が干渉していることがわからないので、src が出口生存でないときにハザードを起した。ほんとは、Assem は1命令に対応するように実装すべきだったかも。
MakeGraph.hs はチョンボの修正。新しいラベルが保留中の前方参照を解決するときに、そのラベルと次の命令をただしく継げられていなかった。
この後、以下のように確認・デバッグを進めようかな。