changeset 522:a513979e5495

*** empty log message ***
author kono
date Tue, 27 Dec 2005 17:19:49 +0900
parents 15c17f799404
children 009289571b54
files Changes mc-codegen.c
diffstat 2 files changed, 44 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Dec 26 22:52:36 2005 +0900
+++ b/Changes	Tue Dec 27 17:19:49 2005 +0900
@@ -7580,5 +7580,34 @@
 mc-code-*.c で解決するのが正しいわけだけど、emit_data に分散して
 しまっているね。
 
-
-
+Mon Dec 26 22:57:49 JST 2005
+
+引数中の関数型の定義があまり正確でないらしい。型宣言のない
+code segment の呼び出しで、間違った値を送ってしまう。
+
+大きな構造体二種類を含む parallel assignment が 無限ループ
+する。分割を小さくすると通る。
+
+register のtargetがoverrapしている場合に、registerを free
+してからsave_targetしているので同じregisterが再利用されて
+しまって無限ループしているらしい。save_target で register
+overlap を見るようにしたけど、ad-hoc じゃない? (ま、
+もともと今の実装が ad-hoc だし)
+
+ASSIGN_STRUCT_DIVDE ってDIVDEする大きさのlimitなのか。
+大きいのは逆にdivdeしないのか。
+
+Mon Dec 26 23:18:06 JST 2005
+
+そもそも、仮引数のユーザに名前と大きさを決めさせているんだ
+から、順序はこっちで決めれば良い。その代わり、異なる名前で
+仮引数を受けるのは許さないってのがいいかもね。とすると、code
+segment の引数のdefault とかを考えるとかなり、不思議な感じ。
+なんか整合性の良い interface ってあるんだろうか? stack を含
+めて? 
+
+   goto hoge(i=1,j=3,...)
+
+みたいな?
+
+
--- a/mc-codegen.c	Mon Dec 26 22:52:36 2005 +0900
+++ b/mc-codegen.c	Tue Dec 27 17:19:49 2005 +0900
@@ -909,7 +909,7 @@
 /*     source (after) list2(tag,disp)                       */
 /* source list    list3(e,cdr,sz)                           */
 
-#define DEBUG_PARALLEL_ASSIGN 3
+#define DEBUG_PARALLEL_ASSIGN 0
 
 /* overlap 
       return list of overlapped target
@@ -974,17 +974,20 @@
     /*新しいレジスタ(or スタック)を取得する*/
     if (scalar(ty) && sz==size_of_int && (e1=get_register_var(0))!=-1) {
 	// e1=list3(REGISTER,e1,0);
+	if (code_register_overlap(s,e1)) goto use_lvar;
 	*use=list3(t,*use,e1);
 	g_expr_u(assign_expr0(e1,s,ty,ty));
 	*target = append5(*target,t,ty,e1,list3(e1,0,sz));
 #if FLOAT_CODE
     } else if (ty==DOUBLE && sz==size_of_double && (e1=get_dregister_var(0,1))!=-1) {
 	// e1=list3(DREGISTER,e1,0);
+	if (code_register_overlap(s,e1)) goto use_lvar;
 	*use=list3(t,*use,e1);
 	g_expr_u(assign_expr0(e1,s,ty,ty));
 	*target = append5(*target,t,ty,e1,list3(e1,0,sz));
     } else if (ty==FLOAT && sz==size_of_float && (e1=get_dregister_var(0,0))!=-1) {
 	// e1=list3(FREGISTER,e1,0);
+	if (code_register_overlap(s,e1)) goto use_lvar;
 	*use=list3(t,*use,e1);
 	g_expr_u(assign_expr0(e1,s,ty,ty));
 	*target = append5(*target,t,ty,e1,list3(e1,0,sz));
@@ -992,11 +995,18 @@
 #if LONGLONG_CODE
     } else if ((ty==LONGLONG||ty==ULONGLONG)&&(e1=get_lregister_var(0))!=-1) {
 	// e1=list3(LREGISTER,e1,0);
+	if (code_register_overlap(s,e1)) goto use_lvar;
 	*use=list3(t,*use,e1);
 	g_expr_u(assign_expr0(e1,s,ty,ty));
 	*target = append5(*target,t,ty,e1,list3(e1,0,sz));
 #endif
     } else {
+	if (0) {
+use_lvar:;
+#if DEBUG_PARALLEL_ASSIGN>1
+printf("## register overrap in save_target\n");
+#endif
+	}
 	g_expr_u(assign_expr0((e1=list3(LVAR,new_lvar(sz),0)),s,ty,ty));
 	*target = append5(*target,t,ty,e1,list3(e1,0,sz));
 	*use=list3(t,*use,e1);
@@ -1227,6 +1237,8 @@
     return source;
 }
 
+// maximum size of struct divide (don't make it large)
+
 #define ASSIGN_STRUCT_DIVIDE 40
 
 static void