changeset 533:80b5058f0535 inline-code-gen-passed

inline code-gen test passed.
author kono
date Fri, 30 Dec 2005 18:33:55 +0900
parents cecf5103679e
children 0f24e1dba811
files Changes mc-codegen.c mc-inline.c mc-parse.c test/code-gen.c
diffstat 5 files changed, 203 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Fri Dec 30 13:36:17 2005 +0900
+++ b/Changes	Fri Dec 30 18:33:55 2005 +0900
@@ -7526,4 +7526,169 @@
 あぁ、確かに goto のラベルは、inline の中ではlocal なscope
 にしないといけないのであった。で、どうすれば良いわけ? 
 
-うまく直せない。scope 関係を見直せば良
\ No newline at end of file
+うまく直せない。scope 関係を見直せば良いんだけど.... enter_top_scope とか。
+マルチレベルscopeになるわけね。
+
+ではなくて、parse してしまえば、single level scpe になるので、
+enter_scope して、st_label では、make_local_scope すれば良いらしい。
+
+## 65:     } while ( k < j);
+        la r11,lo16(-20)(r30)
+        la r10,lo16(-24)(r30)
+        cmpw cr2,r10,r11
+
+なので、rvalue が取れてないみたいね。そう言われてみると、
+IVAR のravalue とかは無視してましたが、RVALUEみたいなのが
+いるってこと? 
+
+RINDIRECT で逃げようと思ったが、
+
+## 40:    if (i>j) return j;
+        li r11,-3
+        lwz r11,lo16(0)(r11)
+        li r10,5
+        lwz r10,lo16(0)(r10)
+        cmpw cr1,r10,r11
+        ble cr1,L_37
+        li r10,-3
+        lwz r10,lo16(0)(r10)
+## 41:    else return i;
+
+const でreplaceする時がまずいな。RIVARみたいなのを作ると、
+ちょっとcaseが増えすぎるが... pindirect でいんちきするか。
+
+(で、あとで、やっぱりだめで、const replace を諦めてるし)
+
+const で置換したIVARのアドレスを取られると気まずいなぁ。
+
+このあたりはマルチパスでないとできない。まぁ、parse tree を
+持っているので可能ではあるけど。
+
+Sun Dec 25 20:24:02 JST 2005
+
+さて、return を作らないとだめか。
+
+なに、結局、
+
+    return value がないときは jump 
+    return value がある時には、g_expr でjump
+
+にする? とりあえず。
+
+pfdecl で struct_return は、なんとかしてるの?
+
+やっぱ、ret() で、 code_set_return_register(1);
+は、だめじゃん。if 文の分岐で値を同じレジスタ
+に置くためには.... ?: と同じ方法か。
+
+code_get_fixed_creg ねぇ。
+        t = code_get_fixed_creg(USE_CREG,d);
+        gen_jmp(e3=fwdlabel());
+        fwddef(e2);
+        t1=g_expr0(cadddr(e1));
+        code_set_fixed_creg(t,1,d);
+ですか。
+
+Mon Dec 26 10:54:29 JST 2005
+
+  .cstring とかのデータモードとglobalラベルが変。
+
+これねぇ。string をconstに置くかどうかは arch によるわけだから、
+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,...)
+
+みたいな?
+
+Tue Dec 27 18:17:55 JST 2005
+
+inline をstaticとして扱うoptionがあった方がいいかもね。
+
+あ、そうか。inline で new_lvar したら、あとでfreeしないと。
+ということは、keep track しないとまずいのね。
+
+## 94:  i += k;
+        la r3,lo16(-32)(r30)
+        lwz r3,lo16(0)(r3)
+        li r11,3
+
+当然、const arg でないとconstantに置き換えてはいけないわけね。
+address を取られた場合も同様。ということは、has_address みたいな
+attribute も必要なわけだ。
+
+ま、それはあとで。
+
+Wed Dec 28 17:29:59 JST 2005
+
+skipspc() で、inmode の時に、cheap に書かれてしまうので、
+cheap 上の string  をterminate しないうちに、skipspc()
+してはいけないわけね。
+
+なんだが、"hoge" "ahoge" のcaseに、inmode の ST_COMMENT
+が干渉してしまうわけね。それは、まずいか。
+
+やっぱり、STRING は、"" で一つにして、複数つながる
+っていう構文にした方が良いね。
+
+    list(STRING,value,continue)
+
+みたいな感じ。でも、それだと変更が多い(何故か nptr にいれてた...)
+ので、やっぱり、append しました。
+
+Thu Dec 29 09:59:38 JST 2005
+
+PowerPC の get_lregister が失敗するのが、まだ、微妙に残ってる。
+足りないはずないんだけどね。input register も探させちゃうか。
+そういえば、最初は input register は使わない方針だったけど、
+今は使ってもいいんじゃないの?
+
+Fri Dec 30 16:31:33 JST 2005
+
+IVAR の置換だけど、
+
+453         int lvar;
+454         if (car(lvar=cadr(e))==IVAR) {
+455             lvar=p_lvar(cadr(e)); // can be anything....
+456             switch(car(lvar)) {
+(gdb) l
+457             case LVAR:
+458                 return rvalue_t(lvar,cadddr(e));
+
+だと、やっぱり、LVAR のindirect と干渉してしまう?
+
+indirect の型は、その場のtypeでは型変換が終ってしまっている
+ので、その前のでないとだめ。そもそも型を渡さずに、
+UCINDIRECT とかを見るべきだよね。逆か? RINDIRECTを
+一つにして型を持ち歩いた方がいいのか?
+
+配列のADDは、inline でどこに消えちゃったの?
+って、あと一つまでいったか。
+
+
--- a/mc-codegen.c	Fri Dec 30 13:36:17 2005 +0900
+++ b/mc-codegen.c	Fri Dec 30 18:33:55 2005 +0900
@@ -3252,7 +3252,7 @@
 /* right value , get the value of the variable */
 
 static int
-indirect(int t,int e1)
+indirect(int t,int e1,int type)
 {
     int e2,e3,e4,offset;
     e2 = e1;
@@ -3271,7 +3271,7 @@
 extern int
 rvalue(int e)
 {
-    int op,c,e1;
+    int op,c;
     NMTBL *n;    
     int type0 = type_value(type);
 
@@ -3332,10 +3332,9 @@
 	}
 	return(list3(RLVAR+op,cadr(e),caddr(e)));
     case INDIRECT:
-	e1=cadr(e);
-	return(indirect(RINDIRECT+op,cadr(e)));
+	return(indirect(RINDIRECT+op,cadr(e),type0));
     case IVAR:
-	return(indirect(RINDIRECT+op,e));
+	return(indirect(RINDIRECT+op,e,type0));
     default:return(e); /* idempotent case? */
     }
 }
@@ -3815,7 +3814,8 @@
 	    return(e1);
 	if (car(e)==CONST) {
 	    if(car(e1)==ADDRESS) {
-		if (car(cadr(e1))!=GVAR) {
+		if (car(cadr(e1))==IVAR) {
+		} else if (car(cadr(e1))!=GVAR) {
 		    // must be lvar
 		    if (car(cadr(e1))!=LVAR) error(-1);
 		    return(list2(ADDRESS,
--- a/mc-inline.c	Fri Dec 30 13:36:17 2005 +0900
+++ b/mc-inline.c	Fri Dec 30 18:33:55 2005 +0900
@@ -451,19 +451,24 @@
 prindirect(int e)
 {
     int lvar;
+    int offset = caddr(e);
     if (car(lvar=cadr(e))==IVAR) {
 	lvar=p_lvar(cadr(e)); // can be anything....
 	switch(car(lvar)) {
 	case LVAR:
+	    if(offset) {
+		return list3(car(e),lvar,offset);
+	    }
 	    return rvalue_t(lvar,cadddr(e));
 	case REGISTER: case DREGISTER:
 	case FREGISTER: case LREGISTER:
 	case CONST: case FCONST: case DCONST: case LCONST:
 	    // should do type check
+	    if (offset) error(-1);
 	    return lvar;
 	}
     }
-    return list3(car(e),pexpr(cadr(e)),caddr(e));
+    return list3(car(e),pexpr(cadr(e)),offset);
 }
 
 static int
@@ -490,6 +495,7 @@
 static int
 pbinop(int op,int e1,int e2)
 {
+    // we should call binop here, but we don't know the type...
     return list3(op,pexpr(e1),pexpr(e2));
 }
 
--- a/mc-parse.c	Fri Dec 30 13:36:17 2005 +0900
+++ b/mc-parse.c	Fri Dec 30 18:33:55 2005 +0900
@@ -2516,19 +2516,18 @@
 	if (inmode) {
 	    parse = list3(ST_GOTO,parse,
 		list2(FLABEL,(int)get_name(nptr0->nm,0,0)));
-	} else {
-	    t = nptr0->sc;
-	    if (t==EMPTY||t==EXTRN1||t==EXTRN) {
-		// error check?
-		nptr0->sc=EMPTY;
-		nptr0=l_top_search(nptr0->nm,0);
-		nptr0->sc = FLABEL;
-		nptr0->dsp = fwdlabel();
-	    } else if (!(t==FLABEL||t==BLABEL)) {
-		error(STERR);
-	    }
-	    gen_jmp(nptr0->dsp);
 	}
+	t = nptr0->sc;
+	if (t==EMPTY||t==EXTRN1||t==EXTRN) {
+	    // error check?
+	    nptr0->sc=EMPTY;
+	    nptr0=l_top_search(nptr0->nm,0);
+	    nptr0->sc = FLABEL;
+	    if (!inmode) nptr0->dsp = fwdlabel();
+	} else if (!(t==FLABEL||t==BLABEL)) {
+	    error(STERR);
+	}
+	if (!inmode) gen_jmp(nptr0->dsp);
 	control=0;
 	conv->sm_();
 	checksym(SM);
@@ -2578,19 +2577,17 @@
 	checkret();
     if (inmode)
 	parse = list3(ST_LABEL,parse,(int)get_name(nptr->nm,0,0));
-    else {
-	if(nptr->sc == FLABEL) {
-	    // already used by goto with fwdlabel
-	    fwddef(nptr->dsp);
-	} else if(nptr->sc != EMPTY && nptr->sc != EXTRN1) {
-	    error(TYERR); // duplicate label
-	} else {
-	    nptr->sc=EMPTY;
-	    // define this label in top level scope
-	    nptr1=l_top_search(nptr->nm,0);
-	    nptr1->sc = BLABEL;
-	    nptr1->dsp = backdef();
-	}
+    if(nptr->sc == FLABEL) {
+	// already used by goto with fwdlabel
+	if (!inmode) fwddef(nptr->dsp);
+    } else if(nptr->sc != EMPTY && nptr->sc != EXTRN1) {
+	error(TYERR); // duplicate label
+    } else {
+	nptr->sc=EMPTY;
+	// define this label in top level scope
+	nptr1=l_top_search(nptr->nm,0);
+	nptr1->sc = BLABEL;
+	if (!inmode) nptr1->dsp = backdef();
     }
     conv->label_();
     getsym(0);
--- a/test/code-gen.c	Fri Dec 30 13:36:17 2005 +0900
+++ b/test/code-gen.c	Fri Dec 30 18:33:55 2005 +0900
@@ -3461,6 +3461,7 @@
     }
 }
 
+void
 code_cond_ulll()
 {
     unsigned long long i;
@@ -3478,6 +3479,7 @@
     }
 }
 
+void
 code_cond_luu()
 {
     long long i;