changeset 154:3edd10355434

fix assign_opt and conv.c
author kono
date Thu, 31 Jul 2003 20:57:39 +0900
parents 33b39002ac58
children ccb2002d8a31
files Changes mc-codegen.c
diffstat 2 files changed, 69 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Jul 21 15:13:37 2003 +0900
+++ b/Changes	Thu Jul 31 20:57:39 2003 +0900
@@ -3152,3 +3152,71 @@
 
 Frame pointer は使うの? 使った方がいいんじゃない?
 PowerPC は使わなかったけど。
+
+Tue Jul 22 08:12:48 JST 2003
+
+switch 文をtableにコンパイルするには...
+
+最初の比較の行き先を後で指定するようにする
+        cmp reg,case_value
+        bne L_NEXT
+   ....
+   L_NEXT:
+を、
+        cmp reg,case_value
+        bne L_CASE
+   ....
+   L_NEXT:
+      ....
+   L_CASE 
+で、case 文が終ったらtableを作る。table がいらないようだったら、
+   L_CASE = L_NEXT
+
+各caseの入口は覚えておく。
+      (list of (value, label))
+
+table は、どうやって作るかと言うと、
+
+   まず、値の分布をチェックする
+   密度の高い表を作る(端のいくつかを除いて連続していること)
+   というか、(定差分で)連続している部分にだけ表を作れば良いか。
+   table は8entry以上。それ以下は、2分法に負ける。
+       (list of (number of entry, diff, (list of (value,label))))
+
+512 or 128kbyte まで容認する。限度はなくても良いか。連続している
+部分にしか表は作らない。
+
+連続してない部分は、2分法にする。
+
+2 分法でもいいけど。2分法にする? その方が簡単かな。最後のス
+テージは、(順序が一致していれば...) 元のコードが使えるし。そ
+うすると、sort して、真中かから比較して行けば良い。そうすれ
+ば表の分布とか考えなくても良いからいいかもね。
+
+簡単じゃん。
+
+まぁ、やっぱり、構文木の先読みをするんじゃないの? そうすれば
+reference のとられてない変数もわかるし。
+
+Wed Jul 23 16:21:12 JST 2003
+
+やっぱり構造体のタグの名前はname tableにいれちゃだめだね。
+まぁ、いれなきゃいけないんだけどさ。どうする?
+どうするっていっても...
+
+Thu Jul 31 15:07:08 JST 2003
+
+C から変換したコードは動いたけど。まぁ、cast は動くのは
+良いんだけど、こういうのじゃなくて、link を使った変換
+でもいいんじゃない? そうすれば、spagety stack でもOk
+だな。ただ、GC がないと使い物にならないだろうが。
+
+Link にすれば、型整合のある変換も可能だよね。ただ、union
+は意味ないか。record 型に直さないとね、
+
+recursion と loop をdetect すれば、static にcompile
+できる。あるいは、recursion の部分だけ配列にできる
+んじゃないかな。
+
+それぞれの利点と欠点を考察すればCWは通るんじゃない?
+(本気?)
--- a/mc-codegen.c	Mon Jul 21 15:13:37 2003 +0900
+++ b/mc-codegen.c	Thu Jul 31 20:57:39 2003 +0900
@@ -993,7 +993,7 @@
 	case REGISTER: code_assign_register(cadr(e2),byte,reg); return;
 	}
 	g_expr(e2);
-	code_assign(e2,byte,reg);
+	code_assign(creg,byte,reg);
 	return;
     }
     /* e2 is register now */