changeset 524:135afeb2e134 first-inline-work

inline first work. no constant propagation.
author kono
date Wed, 28 Dec 2005 11:07:17 +0900
parents 009289571b54
children d84cea14dbdc
files Changes mc-codegen.c mc-inline.c test/too-long-argument.c
diffstat 4 files changed, 79 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Tue Dec 27 17:57:24 2005 +0900
+++ b/Changes	Wed Dec 28 11:07:17 2005 +0900
@@ -7491,6 +7491,21 @@
   }
 みたいな感じ?
 
+    Wed Dec 28 00:31:30 JST 2005
+
+違うね。
+
+    pexpr() {
+	e1=cadr(e);
+	switch(car(e)) {
+	case CASE:
+	... parse=list(CASE,parse,hoge,hoge); break;
+	}
+    }
+    parse = reverse0(parse);
+
+みたいな感じか。
+
 Sat Dec 24 21:00:17 JST 2005
 
 pfdecl で、inline を生成するんだけど、そこで引数のn->dspが arg_register
@@ -7610,4 +7625,20 @@
 
 みたいな?
 
-
+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 も必要なわけだ。
+
+ま、それはあとで。
--- a/mc-codegen.c	Tue Dec 27 17:57:24 2005 +0900
+++ b/mc-codegen.c	Wed Dec 28 11:07:17 2005 +0900
@@ -2813,6 +2813,8 @@
 	if (!inmode)
 	    ndsp = fwdlabel();
 	// で、inmode の時は?
+	// 名前のまま、nptr で取っておいて、その場で解決する
+	// scope は関数ローカルになる
 	break;
     case ADECL:                 // funcion arguments
 	if(!integral(type0)&&type0>0&&(car(type0)==FUNCTION||car(type0)==CODE)) {
@@ -3016,7 +3018,7 @@
 	ass = assign_expr0(
     (n->sc==REGISTER||n->sc==DREGISTER||n->sc==FREGISTER||n->sc==LREGISTER)?
 	    list3(n->sc,n->dsp,(int)n):
-	    list3(LVAR,n->dsp+offset,0),
+	    list3(n->sc,n->dsp+offset,(int)n),
 	e,t,type);
 	init_vars = list2(ass,init_vars);
     } else if(mode==SFDINIT) {
--- a/mc-inline.c	Tue Dec 27 17:57:24 2005 +0900
+++ b/mc-inline.c	Wed Dec 28 11:07:17 2005 +0900
@@ -306,6 +306,7 @@
 	g_expr(correct_type(e,cadr(fnptr->ty)));
 	t = type_value(cadr(fnptr->ty));
 	if (ret_reg_mode==0) {
+	    // return value register is not fixed
 	    ret_reg_mode=1;
 	    ret_register = code_get_fixed_creg(USE_CREG,t);
 	} else {
@@ -578,7 +579,7 @@
 	    v = get_dregister_var(n,1); break;
 	default:
 	    if (scalar(n->ty)) 
-		v = get_dregister_var(n,1);
+		v = get_register_var(n);
 	    else
 		error(TYERR);
 	}
@@ -611,37 +612,43 @@
 static int
 p_do(int e)
 {
-    return list4(ST_DO,pexpr(cadr(e)),pexpr(caddr(e)),pexpr(cadddr(e)));
+    int e2 = pexpr(caddr(e));
+    int e3 = pexpr(cadddr(e));
+    return list4(ST_DO,pexpr(cadr(e)),e2,e3);
 }
 
 static int
 p_while(int e)
 {
-    return list4(ST_WHILE,pexpr(cadr(e)),pexpr(caddr(e)),pexpr(cadddr(e)));
+    int e2 = pexpr(caddr(e));
+    int e3 = pexpr(cadddr(e));
+    return list4(ST_WHILE,pexpr(cadr(e)),e2,e3);
 }
 
 static int
 p_for(int e)
 {
     int e1=caddr(e);
-    int p0=car(e1);
-    int p1=cadr(e1);
-    int p2=caddr(e1);
-    int p3=cadddr(e1);
-    return list3(ST_FOR,pexpr(cadr(e)),
-	list4(pexpr(p0),pexpr(p1),pexpr(p2),pexpr(p3)));
+    int p0=pexpr(car(e1));
+    int p1=pexpr(cadr(e1));
+    int p2=pexpr(caddr(e1));
+    int p3=pexpr(cadddr(e1));
+    return list3(ST_FOR,pexpr(cadr(e)), list4(p0,p1,p2,p3));
 }
 
 static int
 p_switch(int e)
 {
-    return list4(ST_SWITCH,pexpr(cadr(e)),pexpr(caddr(e)),pexpr(cadddr(e)));
+    int e2 = pexpr(caddr(e));
+    int e3 = pexpr(cadddr(e));
+    return list4(ST_SWITCH,pexpr(cadr(e)),e2,e3);
 }
 
 static int
 p_comp(int e)
 {
-    return list3(ST_COMP,pexpr(cadr(e)),pexpr(caddr(e)));
+    int e1=pexpr(caddr(e));
+    return list3(ST_COMP,pexpr(cadr(e)),e1);
 }
 
 static int
@@ -675,7 +682,8 @@
 static int
 p_return(int e)
 {
-    return list3(ST_RETURN,pexpr(cadr(e)),pexpr(caddr(e)));
+    int e1=pexpr(caddr(e));
+    return list3(ST_RETURN,pexpr(cadr(e)),e1);
 }
 
 static int
@@ -1024,7 +1032,7 @@
     // for (e3 = e1 = caddr(e); e3; e3 = cadr(e3)) {
         t=caddr(e3);  // type
 	e4 = car(e3);
-	if (is_const(e4) /* ||(is_memory(e3)&&is_readonly(e3)) */ ) {
+	if (0 && is_const(e4) /* ||(is_memory(e3)&&is_readonly(e3)) */ ) {
 	    heap[pdisp+narg]=e4;
 	} else {
 	    arg = heap[pdisp+narg]=list3(LVAR,new_lvar(size(t)),0);
@@ -1042,6 +1050,7 @@
 	g_expr0(e2);
     else
 	g_expr_u(e2);
+    checkret();
     fwddef(retlabel);
     control=1;
 
--- a/test/too-long-argument.c	Tue Dec 27 17:57:24 2005 +0900
+++ b/test/too-long-argument.c	Wed Dec 28 11:07:17 2005 +0900
@@ -1,5 +1,7 @@
 #include <stdio.h>
 
+#undef WRONGNUMBER
+
 typedef code
 (*CCC)( int f1,int f2,int f3,int f4,int f5,int f6,int f7,int f8,int f9,int fa,int fb,int fc,int fd,int fe,int ff,
 	code(*ret)(int),
@@ -29,31 +31,45 @@
 code
 tcode4(int x,int y,CCC junction,code(*ret)(int),void *env)
 {
-
-     // goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,ret,env);
+#ifdef WRONGNUMBER
      goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,ret,env);
+#else
+     goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,ret,env);
+#endif
 }
 
 code
 tcode0(int x,int y,code(*junction)(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,code(*)(int),void *),code(*ret)(int),void *env)
 {
-
-     // goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,ret,env);
+#ifdef WRONGNUMBER
      goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,ret,env);
+#else
+     goto junction(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,ret,env);
+#endif
 }
 
 int
 main0()
 {
+#ifdef WRONGNUMBER
+     goto tcode2(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+	return,environment);
+#else
      goto tcode2(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
 	return,environment);
+#endif
 }
 
 int
 main1()
 {
+#ifdef WRONGNUMBER
+     goto tcode1(0,1,2,3,4,5,6,7,8,9,10,11,12,13,
+	return,environment);
+#else
      goto tcode1(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
 	return,environment);
+#endif
 }
 
 int
@@ -76,3 +92,5 @@
     main0();
     main1();
 }
+
+//