# HG changeset patch # User kono # Date 1135671589 -32400 # Node ID a513979e54954ad5291a16315346d4189263f00c # Parent 15c17f79940421e88c0dc99ffe84a65fc9e42363 *** empty log message *** diff -r 15c17f799404 -r a513979e5495 Changes --- 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,...) + +みたいな? + + diff -r 15c17f799404 -r a513979e5495 mc-codegen.c --- 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