Mercurial > hg > CbC > old > device
changeset 576:00e5ce0e341a
*** empty log message ***
author | kono |
---|---|
date | Sun, 15 Jan 2006 12:03:37 +0900 |
parents | a4445cb1aa91 |
children | 7e0076617c76 |
files | Changes mc-codegen.c |
diffstat | 2 files changed, 70 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Sat Jan 14 01:00:05 2006 +0900 +++ b/Changes Sun Jan 15 12:03:37 2006 +0900 @@ -8298,6 +8298,69 @@ global heap に残すものをあまり気にしてなかった みたい。 - - - +Sat Jan 14 22:58:45 JST 2006 + +goto with environment だけど、code segment の中からの切替えは可能らしい。 +しかし、通常の関数からのgoto with environment はうまく動かない。 +これは何故だろう? + +そうか、env を設定したときは、構造体はコピーしないといけない +わけね。それは、code segment からでも同じ。 + +逆にメモリのoverrap は気にしなくて良いのか。通常の関数に戻 +る場合は、引数一つと決まっているからな。 + +Sun Jan 15 09:24:58 JST 2006 + +return がない時には、retlabelを生成しないほうがいい。 + +env を設定したら、jump のtargetをenv へのindirect + offset に +変えないとダメ。 + +goto with env は r1 しか変更してない。それは、code segment では、 +stack top に過ぎない。r30 の方を変更しないと。 +(いや、これは PowerPC 版だけの問題なのか...) + +code_set_frame_pointer が実はstack top しか設定してない。 + +env が設定されている場合は、メモリ上のinterfaceは、 +そのままコピーを実行すれば良く、並列代入する必要はない。 + +stack tpo はcode segment では frame pointer から計算される。(無駄?) +から、設定する必要は実はない。function に戻るときは必要。 + +new_environ のメモリ構成は... + + * gotoを呼び出した関数のr1 ! r1(goto前のr1) + # * r30 <---r1_offset---------> r1 +r+ +----------+--+----------+----------------+-----------+----------+----+ + cousin arg xx reg save !callee arg !code local caller arg xx + r20-r29 lvar>0 lvar<0 lvar>0x1000 000 + f20-f31 <-my_func_args--><--disp-----><-max_func_arg-> + *SIZE_OF_INT *SIZE_OF_INT + +と書いてあるが、 + disp = -args; +とか、 + /* reverse all argument offset (with size) */ + arglist = fnptr->dsp; + for(t=arglist;t;t=cadr(t)) { + n=(NMTBL *)caddr(t); + if(n->sc==LVAR) + n->dsp = -n->dsp-cadddr(t); + } +とかやっているので、lvar>0 ってのは存在しないらしい。つまり、 +全部、local variable 扱いになります。inline code ってのも +面白いけど、この辺を考慮しないとだめだね。 + +ってことは、fp はenvironment の一番下(つまり environment の +指しているところそのまま、で良いってことか? やっぱり +関数呼び出しに比べてなんて簡単なんだ。 + +R1SAVEして、frame pointer = environment でないのは、 +PowerPC 版だけか。ということは、PowerPC 版の R1SAVE +を解消することから始めないとだめなみたい。 + + + +