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
+を解消することから始めないとだめなみたい。
+
+
+
+
--- a/mc-codegen.c	Sat Jan 14 01:00:05 2006 +0900
+++ b/mc-codegen.c	Sun Jan 15 12:03:37 2006 +0900
@@ -1344,6 +1344,10 @@
     return source;
 }
 
+//
+// CbC goto statement with environment
+//
+
 // maximum size of struct divide (don't make it large)
 
 #define ASSIGN_STRUCT_DIVIDE 40