Mercurial > hg > CbC > old > device
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は通るんじゃない? +(本気?)