Mercurial > hg > CbC > old > device
changeset 654:fd2dfa1fa627
*** empty log message ***
author | kono |
---|---|
date | Sun, 26 Nov 2006 21:54:03 +0900 |
parents | d66e5a137d73 |
children | cddab906095e |
files | Changes Idea |
diffstat | 2 files changed, 239 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Sun Nov 26 14:59:54 2006 +0900 +++ b/Changes Sun Nov 26 21:54:03 2006 +0900 @@ -9161,40 +9161,3 @@ offset は、結構複雑になるので、直す方が良いらしい。 時間かける価値あるの? 少しかかりそうだな... - - | frame pointer | stack pointer - v----> argument local <--|-----v - caller_arg - -ではなくて、 - - | previous $fp - |<-intr_size---><--------r1_offset----------->| - | | frame pointer | stack pointer - v<--- interface-+---- local ----->|<--------->v - <0 >0 caller_arg - -なら、いいんじゃない? caller_arg は sp 相対で積めば良い。 - -これだと、frame pointer がgoto で可変になる。interface がarugment -扱いになるので、限りなくsubroutine call に近くなるけど。 -(まぁ、そうだよな、そういう狙いだし...) - -だったら、完全にfunction callに合わせることも可能なんじゃないか? -可変長引数の場合とまったく同じになる。gcc の(予定ししてる実装と同じ) - - | previous $fp - |<-intr_size---><-------------r1_offset------------>| - | |frame pointer | stack pointer - v<--- interface-+-------|--- local ----->|<-------->v - <0 >0 xxx caller_arg - |frame pointer | stack pointer - v<--- interface----+-------|--- local ----->|<-------->v - <0 >0 xxx caller_arg - -caller_arg はsp上に積むと。そうすれば、alloca も問題ない。 - -でも、めんどくさいよ。めんどくさい。めんどくさいです。 - -でも、やるしかない。 -
--- a/Idea Sun Nov 26 14:59:54 2006 +0900 +++ b/Idea Sun Nov 26 21:54:03 2006 +0900 @@ -1733,3 +1733,242 @@ } みたいな感じ? + +Sun Nov 26 21:14:57 JST 2006 + + | frame pointer | stack pointer + v----> argument local <--|-----v + caller_arg + +ではなくて、 + + | previous $fp + |<-intr_size---><--------r1_offset----------->| + | | frame pointer | stack pointer + v<--- interface-+---- local ----->|<--------->v + <0 >0 caller_arg + +なら、いいんじゃない? caller_arg は sp 相対で積めば良い。 +local 変数は max_caller_arg が不定なので sp 相対では積めない。 + +これだと、frame pointer がgoto で可変になる。interface がarugment +扱いになるので、限りなくsubroutine call に近くなるけど。 +(まぁ、そうだよな、そういう狙いだし...) + +だったら、完全にfunction callに合わせることも可能なんじゃないか? +可変長引数の場合とまったく同じになる。gcc の(予定ししてる実装と同じ) +これだと、C-- の paraterized goto と、まったく同じになる。 + + | previous $fp + |<-intr_size---><-------------r1_offset------------>| + | |frame pointer | stack pointer + v<--- interface-+-------|--- local ----->|<-------->v + <0 >0 xxx caller_arg + |frame pointer | stack pointer + v<--- interface----+-------|--- local ----->|<-------->v + <0 >0 xxx caller_arg + +caller_arg はsp上に積むと。そうすれば、alloca も問題ない。 + +これを採用しなかったのは、たぶん、fp を移動しなければならな +いのを嫌ったんだろうな。今は、parse tree 作ってから、code +生成も可能なので、そうしても良いんだが。 + +でも、めんどくさいよ。めんどくさい。めんどくさいです。 +でも、やるしかない。 + +これを、やれば、C からの変換もかなりやさしくなるかも知れない。 + +Sun Nov 26 19:41:38 JST 2006 + +max interface みたいなのが必要で、そうすれば、local 変数との +相互作用は避けられる。逆に言えば、利用は出来ない。 + +でも、max_interface は1 path では決まらない。だから、long offset +の時は、ちょっとはまる。特にARMの場合。やっぱり、max_interface +は決め打ちがいいのかな? そうすると、function call から呼ぶ +ときにはまるが... + +offset を 0 側からにすれば、max_interface はfp設定時のみに +なるが、そうすると、interface を変更したときのcopyが発生しやすく +なる。いや、そんなことはないのかな? + + __code f(int a,int b) { + goto g(int c,int b,int a); + } + + v<---|----+----local ----->|<-------->v before f + a,b + v<--- interface-+-------|--- local ----->|<-------->v f + a,b + v<--- interface-+-------|--- local ----->|<-------->v goto g + a,b,c + +みたいな感じですか? 後ろをそろえるわけね。その方が自然か。 + +これだと、やっぱり、max_interface が問題になる。やっぱり、それで、 +fp を下にしてあるんだろうな。 + + __code f(int a,int b) { + goto g(int c,__code *f,int a,int b); + } + + __code g(int c,__code (*n)(...),...) { + goto n(...); + } + + |<----------------------------r1_offset------------>| + |frame pointer | stack pointer + v<--- interface---------|--- local ----->|<-------->v f + a,b,(n,c) + |frame pointer | stack pointer + v<--- interface---------|--- local ----->|<-------->v goto g + a,b,fp,n,c + |frame pointer | stack pointer + v<-interface-+-------|-- local --->|<-------->v g + a,b,fp,n,c + |frame pointer | stack pointer + v<--- interface---------|--- local ----->|<-------->v goto n + a,b + +えーと、goto n(...); で、どうやってfp を元に戻すの? ... の位置で、 +前の fp を覚えておけば良い。(*) + +これだと、function call を、そのまま実現できそうだけど? みたいだね。 + + __code f(int a,int b,...) { + goto g(int c,f,int a,int b,...); + } + + __code g(int c,__code *n(int a,int b,...),...) { + goto n(int d,int e,int g,...); + } + +とかすると、無限にstackが延びる。ふーん。 + + __code g(int c,__code *n(...),...) { + goto n(int d,int e); + } + +は、どうする? fp は、そのままなんだろうね。 + + |<----------------------------r1_offset------------>| + |frame pointer | stack pointer + v<--- interface-+-------|--- local ----->|<---------v f + a,b,(n,c) + |frame pointer | stack pointer + v<--- interface-+-------|--- local ----->|<---------v goto g + a,b,fp,n,c + |<----------------------r1_offset------------>| + |frame pointer | stack pointer + v<-interface----+----|-- local --->|<---------v g + a,b,fp,n,c + v<-interface-+----|-- local --->|<---------v g + d,e + +で、fp は上書きか。それは、良くない。なので、fp の分ずらす。 +というよりは、fp の次を指すようにするのが良いのか。 + + __code f(int a,int b,...) { + goto g(int c,__code *f,int a,int b,...); + } + + __code g(int c,__code (*n)(...),...) { + goto n(...); + } + + |<----------------------------r1_offset------------>| + |frame pointer | stack pointer + v---- interface-+-------|--- local ----->|<---------v f + a,b,(n,c) + |frame pointer | stack pointer + v---- interface-+-------|--- local ----->|<---------v goto g + a,b,fp,n,c + |<-------------------r1_offset------------>| + |frame pointer | stack pointer + v<-interface-+----|-- local --->|<---------v g + a,b,fp,n,c + |frame pointer | stack pointer + v---- interface-+----------|-- local --->|<---------v goto n + a,b + +というわけか。frame pointer のオプションがあった方が良いわけだね。 + +これだと、全体の変更も少なくて済みそうだ。(ほんとうか?) + +g の ... の位置を前もって知ることが必須。かなりコードが繁雑に +なるけど。 + __code g(int c,__code n,...) { +の方が良いが、それだと、型のチェックが出来ない。実際には、 +かなり繁雑な型を書く羽目になる。typedef すればいいんだけどね。 + +__code は暗黙のtypedef にする? + + +これを許すとmax_interfaceの制限は現実的ではない? でもないか... +そのcodeでアクセス限界だからね。だったら、max_interface を +作って、(1024程度?) いや、やっぱり fp は動かさないとだめ +なので、良くない。 + +fp を積む場合と、戻す場合との区別は? 結構微妙か。 + goto 側の定義 ...が先に(か同時に)来たら戻す + goto 側の定義 ...が実引数より後に来たら積む +で、いいわけね? + +ちょっと、Semantics が複雑になりすぎる。可能なんだけど。 +environment での goto でたまにリセットしないとおかしくなりそう。 +Stack 増えている場合は、Warning ぐらいだした方がいいかも。 +大域的に見ないとわからない。有限かどうかも。 + +全部、tail recursive call でやるのと、あまり変わらないかな。 +そうすると、c-- のparametarized goto と差がないかも。 + + +あ、そうか。 + + __code g(int c,__code *n(int a,int b,...),...) { + goto n(int d,int e,int g,...); + } + +の n は、自動的に定義された方が便利だろう。 + + __code g(int c,...) { + goto __cotinuation(int d,int e,int g,...); + } + +みたいな感じ。 + + go g(int c,int b,...) to hoge(...); + +ですか? それは、だめか... だめでもないんだけど、型の設定が +難しすぎる。 + +K&R style の宣言の方が綺麗なのか... + +Sun Nov 26 21:53:05 JST 2006 + +(*) interface の大きさの増減は、自分のinterface を見れば +わかるはずだよね? だから、fp のsaveは必要ないはずだが... + + __code f(int a,int b,...) { + goto g(int c,__code *f,int a,int b,...); + } + + __code g(int c,__code (*n)(...),...) { + goto n(...); + } + +確かにわかるんだけど、宣言を間違えたときに、おじゃんになる。 +どうせ、だめではあるんだが。引数の型は一段階までしか、 +チェックしないので、だめだね。 + +このあたり、理論的な問題があるみたいだな。 + + stack を含めた有限な型付け + と、その表現 + +って問題があるわけね? + +そうか、parallel assignment では、同じ部分を前もって探した +方が効率がよいわけか。(どうせ、やっていることだが) +