changeset 160:1f440a2790fb

*** empty log message ***
author kono
date Sun, 23 Nov 2003 19:54:02 +0900
parents b80e9737c3ce
children cc2fc5c0dfe5
files Changes mc-code-powerpc.c mc-codegen.c mc-parse.c
diffstat 4 files changed, 200 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Thu Aug 14 02:40:39 2003 +0900
+++ b/Changes	Sun Nov 23 19:54:02 2003 +0900
@@ -3382,3 +3382,100 @@
 720
 0.370u 0.010s 0:00.37 102.7%    0+0k 0+0io 88pf+0w
 
+
++jessica+kono time ./a.out 0
+720
+1.190u 0.010s 0:01.51 79.4%     0+0k 0+0io 0pf+0w
++jessica+kono time ./a.out 1
+719
+1.700u 0.000s 0:01.78 95.5%     0+0k 0+0io 0pf+0w
++jessica+kono time ./a.out 2
+470
+0.630u 0.000s 0:00.66 95.4%     0+0k 0+0io 0pf+0w
++jessica+kono time ./a.out 3
+720
+0.790u 0.000s 0:00.81 97.5%     0+0k 0+0io 0pf+0w
++jessica+kono time ./a.out 4
+0.000u 0.000s 0:00.00 0.0%      0+0k 0+0io 0pf+0w
+
++jessica+kono gcc test/conv1.c
++jessica+kono time ./a.out 0
+720
+0.960u 0.000s 0:00.97 98.9%     0+0k 0+2io 0pf+0w
++jessica+kono gcc -O test/conv1.c
++jessica+kono time ./a.out 0
+720
+0.470u 0.000s 0:00.48 97.9%     0+0k 0+0io 0pf+0w
++jessica+kono gcc -O6 test/conv1.c
++jessica+kono time ./a.out 0
+720
+0.260u 0.000s 0:00.26 100.0%    0+0k 0+0io 0pf+0w
+
+Mon Sep  1 13:49:43 JST 2003
+
+short がやっぱり欲しいよね。long long はともかく...
+そこまでいくと、ANSI-C 対応にできるんだが。long long
+は難しい?
+
+short は、そんなに難しくないはず。あとは、
+    statement を含めたtreeの処理
+    変換系の完成
+この二つだな。GCC に組み込むのは無理だろう。
+
+属性文法みたいな手法が使えればね。
+
+あと、struct のtag。やっぱりword table を作り直さないと。
+
+Wed Sep 10 21:53:16 JST 2003
+
+short や unsigned short の前に、
+なんか unsigned char もないんですけど。
+
+Wed Oct  8 22:43:17 JST 2003
+
+(また、一カ月、触ってないのか...)
+
+無名 code はあった方がいいんじゃない?
+
+   code *a(int i);
+   a  = code(int j) { } 
+
+みたいな感じ? C にはないけどね。もともと、名前を消費する
+方だからあった方がいいかも。でも、実行時に作られるわけじゃない。
+それに、こういうものを作ると closure だと思われるような
+気もする。closure みたいなものは「自分で管理する」ってのが
+CbC の思想だろ?
+
+そういえば、static なcodeはあった方がいいんじゃない?
+
+    static code func() { .... }
+
+か。それはそうだな。
+
+Fri Oct 10 13:08:01 JST 2003
+
+link register をうまく使うにはcontinuationに
+指定するだけではダメで、
+     goto hoge(....,next);
+code next..
+みたいなのがあった方がいいんじゃない?
+
+goto の後のステートメントは無名codeになればいいんだよね。
+
+stack を使わないサブルーチンみたいなものか。単なるcall
+になるわけね。それもいいかも。
+
+Sat Nov 22 15:51:36 JST 2003
+
+構造体のfieldの定義のnptrは、大域の名前テーブルから
+取り除かないといけない。でも、取り除いていしまうと、
+構造体からのポインタがずれちゃうので、まずい。
+
+filed専用の領域を作るのだと、複数の構造体が同じ
+field名を持つときにちょっと困る。構造体のタイプに
+埋め込むのがいいんだけど...
+
+そうすると、構造体のfiledかどうかをgetsymがチェック
+するときにちょっと困る。
+
+
--- a/mc-code-powerpc.c	Thu Aug 14 02:40:39 2003 +0900
+++ b/mc-code-powerpc.c	Sun Nov 23 19:54:02 2003 +0900
@@ -786,6 +786,15 @@
     regv[creg]=1;
 }
 
+void
+code_srgvar(int e1,int creg){
+    char *crn = register_name(creg);
+    printf("\tlhz %s,0(%s)\n",crn,
+                             register_name(get_ptr_cache((NMTBL*)cadr(e1))));
+    printf("\textsh %s,%s\n",crn,crn);
+    regv[creg]=1;
+}
+
 
 void
 code_register(int e2,int creg) {
@@ -814,6 +823,15 @@
     regv[creg]=1;
 }
 
+void
+code_srlvar(int e2,int reg) {
+    lvar_intro(e2);
+    printf("\tlhz %s,",register_name(reg));
+    lvar(e2);
+    printf("\textsh %s,%s\n",register_name(reg),register_name(reg));
+    regv[creg]=1;
+}
+
 
 void
 code_fname(NMTBL *n,int creg) {
@@ -1108,6 +1126,16 @@
     regv[creg]=0;
 }
 
+void
+code_cmp_srlvar(int e2) {
+    char *crn = register_name(creg);
+    lvar_intro(e2);
+    printf("\tlhz %s,",crn);
+    lvar(e2);
+    code_cmp_register(creg);
+    regv[creg]=0;
+}
+
 
 void
 code_cmp_rgvar(int e1) {
--- a/mc-codegen.c	Thu Aug 14 02:40:39 2003 +0900
+++ b/mc-codegen.c	Sun Nov 23 19:54:02 2003 +0900
@@ -265,22 +265,10 @@
 	creg=use_float(creg);
 	dmachinop(e1,0);
 	return FLOAT;
-    case COND:
-	e2=fwdlabel();
-	b_expr(cadr(e1),0,e2,0);
-	code_set_fixed_creg(0,INT);
-	t = g_expr0(caddr(e1));
-	code_set_fixed_creg(1,t);
-	jmp(e3=fwdlabel());
-	fwddef(e2);
-	code_set_fixed_creg(0,INT);
-	t = g_expr0(cadddr(e1));
-	code_set_fixed_creg(1,t);
-	fwddef(e3);
-	return t;
+    case COND:        /* a?0:1 should consider non-brach instruction */
     case DCOND:
     case FCOND:
-	d = (car(e1)==DCOND?DOUBLE:FLOAT);
+        d = (car(e1)==COND?INT:car(e1)==DCOND?DOUBLE:FLOAT);
 	e2=fwdlabel();
 	b_expr(cadr(e1),0,e2,0);
 	code_set_fixed_creg(0,d);
--- a/mc-parse.c	Thu Aug 14 02:40:39 2003 +0900
+++ b/mc-parse.c	Sun Nov 23 19:54:02 2003 +0900
@@ -362,13 +362,9 @@
 }
 
 static void
-decl(void)
+strage_class()
 {
-    NMTBL *n;
-    int t,sd;
-    if (mode==GDECL) { typedefed=0;  }
-
-    if(sym==STATIC) {
+   if(sym==STATIC) {
 	if(mode==LDECL) {
 		getsym();
 		conv->static_();
@@ -402,6 +398,15 @@
 	} else
 		error(DCERR);
     }
+}
+
+static void
+decl(void)
+{
+    NMTBL *n;
+    int t,sd;
+    if (mode==GDECL) { typedefed=0;  }
+    strage_class();
     if((t=typespec())==0) return;
     if(sym==SM) {
 	conv->return_type_(t,0,stypedecl);
@@ -469,6 +474,9 @@
     case UNSIGNED:
 	t = UNSIGNED;
 	if(getsym()==INT) getsym();
+	else if (sym==CHAR) { getsym(); t = sym; }
+	else if (sym==SHORT) { getsym(); t = sym; }
+	else if (sym==LONGLONG) {getsym(); t = sym; }
 	break;
     case SHORT:
 	t=INT;
@@ -796,13 +804,19 @@
 	    return n;
 	}
     }
-    if (n->sc!=EMPTY &&
-	    !((n->sc&~1)==EXTRN)&&
-	(mode!=ADECL || n->sc!=LVAR || n->ty!=INT) &&
-	(mode!=ADECL || n->sc!=REGISTER || n->ty!=INT) &&
-	((mode!=GSDECL&&mode!=LSDECL) || n->sc!=FIELD || n->dsp!=disp) &&
-	((mode!=GUDECL&&mode!=LUDECL) || n->sc!=FIELD || n->dsp!=0) )
-	 error(DCERR);
+    if (n->sc!=EMPTY &&  !((n->sc&~1)==EXTRN)) {
+      if (mode==ADECL) {
+	if (n->sc==LVAR && n->ty==INT);
+	else if ( n->sc==REGISTER && n->ty==INT);
+	else error(DCERR);
+      } else if (mode==GSDECL||mode==LSDECL) {
+	if (n->sc==FIELD && n->dsp==disp);
+	else error(DCERR);
+      } else if (mode==GUDECL||mode==LUDECL) {
+	if (n->sc==FIELD && n->dsp==0);
+ 	else error(DCERR);
+      } else error(DCERR);
+    }
     sz = size(n->ty = type);
     switch(mode) {
     case GDECL:
@@ -1045,6 +1059,19 @@
 }
 
 static int
+sdecl_field()
+{
+    int tags = 0;
+    while (getsym() != RC) {
+        decl();
+        tags = list3(type,tags,(int)nptr);
+    }
+    if (sdecl_f) conv->rc_();
+    getsym();
+    return reverse0(tags);
+}
+
+static int
 sdecl(int s)
 {
     int smode,sdisp,type0=0;
@@ -1067,15 +1094,8 @@
 	    if (sdecl_f) conv->lc_();
 	    if (nptr0->sc != EMPTY) error(DCERR);
 	    nptr0->sc = TAG;
-	    tags = 0;
-	    nptr0->ty = list4(s,-1,tags,(int)nptr0);
-	    while (getsym() != RC) {
-		decl();
-		tags = list3(type,tags,(int)nptr);
-	    }
-	    if (sdecl_f) conv->rc_();
-	    getsym();
-	    tags=reverse0(tags);
+	    nptr0->ty = list4(s,-1,0,(int)nptr0);
+	    tags = sdecl_field();
 	    heap[nptr0->ty+2]=tags;
 	    rplacad(type0 = nptr0->ty,disp);
 	} else {
@@ -1090,14 +1110,7 @@
 	type0 = list4(s,disp,tags,(int)nptr0);
     } else if(sym==LC) {
 	if (sdecl_f) conv->lc_();
-	tags = 0;
-	while(getsym() != RC) {
-	    decl();
-	    tags = list3(type,tags,(int)nptr);
-	}
-	if (sdecl_f) conv->rc_();
-	getsym();
-	tags=reverse0(tags);
+	tags = sdecl_field();
 	type0 = list4(s,disp,tags,0);
     }
     else error(DCERR);
@@ -1894,8 +1907,15 @@
 	    type= INT;
 	    return(list4(CASSOP,e1,e2,op));
 	}
+	/*
+	if(t==SHORT) {
+	    type= INT;
+	    return(list4(SASSOP,e1,e2,op));
+	}
+	*/
 	type=t;
 	if(integral(t)) return(list4(ASSOP,e1,e2,op));
+        /* pointer += ... */
 	if((op!=ADD&&op!=SUB)||car(t)!=POINTER) error(TYERR);
 	e2=binop(MUL,e2,list2(CONST,size(cadr(t))),INT,UNSIGNED);
 	type=t;
@@ -1912,7 +1932,7 @@
     int e1,e2,e3,t;
 
     e1=expr3();
-    if(sym==COND) {
+    if(sym==COND) {  // e1?e2:e3
 	conv->cond_();
 	e1=rvalue(e1);
 	getsym();
@@ -1924,10 +1944,7 @@
 	e3=rvalue(expr2());
 	conv->cond_end_();
 	if(car(e1)==CONST) {
-	    if(cadr(e1)) {
-		type=t;return e2;
-	    } else
-		return e3;
+	    if(cadr(e1)) {type=t;return e2;} else return e3;
 	}
 	if(type==DOUBLE||t==DOUBLE) {
 	    e2=double_value(e2,t);
@@ -1955,7 +1972,7 @@
     int e,e1;
 
     e=expr4();
-    while(sym==LOR) {
+    while(sym==LOR) {  /* || */
 	conv->op_(sym);
 	e=rvalue(e);
 	getsym();
@@ -1974,7 +1991,7 @@
     int e,e1;
 
     e=expr5();
-    while(sym==LAND) {
+    while(sym==LAND) { /* && */
 	conv->op_(sym);
 	e=rvalue(e);
 	getsym();
@@ -1993,7 +2010,7 @@
     int e1,e2,t;
 
     e1=expr6();
-    while(sym==BOR) {
+    while(sym==BOR) { /* & */
 	conv->op_(sym);
 	e1=rvalue(e1);
 	t=type;
@@ -2010,7 +2027,7 @@
     int e1,e2,t;
 
     e1=expr7();
-    while(sym==EOR) {
+    while(sym==EOR) { /* ^ */
 	conv->op_(sym);
 	e1=rvalue(e1);
 	t=type;
@@ -2027,7 +2044,7 @@
     int e1,e2,t;
 
     e1=expr8();
-    while(sym==BAND) {
+    while(sym==BAND) { /* & */
 	conv->op_(sym);
 	e1=rvalue(e1);
 	t=type;
@@ -2068,13 +2085,13 @@
 	t=type;
 	getsym();
 	e2=rvalue(expr10());
-	if(t==INT&&type==INT)
-	    e1=binop(op,e1,e2,t,type);
-	else if(t==DOUBLE||type==DOUBLE||
+	if(t==DOUBLE||type==DOUBLE||
 	          t==FLOAT||type==FLOAT)
 	    /* binop will handle op+DOP */
 	    e1=binop(op,e1,e2,t,type);
-	else
+	else if(t==INT&&type==INT) /* signed case */
+	    e1=binop(op,e1,e2,t,type);
+	else /* LONGONG? */
 	    e1=binop(op+US,e1,e2,t,type);
 	type= INT;
     }
@@ -2156,12 +2173,12 @@
 	    error(TYERR);
 	return(list3(PREINC,e,
 	    op==INC?size(cadr(type)):-size(cadr(type)) ));
-    case MUL:
+    case MUL: /* *p */
 	conv->prefix_(sym);
 	getsym();
 	e=rvalue(expr13());
 	return(indop(e));
-    case BAND:
+    case BAND: /* &p */
 	conv->prefix_(sym);
 	getsym();
 	switch(car(e=expr13())) {
@@ -2181,7 +2198,7 @@
 	}
 	type=list2(POINTER,type);
 	return e;
-    case SUB:
+    case SUB:  /* -p */
 	conv->prefix_(sym);
 	getsym();
 	e=rvalue(expr13());
@@ -2192,14 +2209,14 @@
 	if(!integral(type))
 	    error(TYERR);
 	return(car(e)==CONST?list2(CONST,-cadr(e)):list2(MINUS,e));
-    case BNOT:
+    case BNOT: /* ~p */
 	conv->prefix_(sym);
 	getsym();
 	e=rvalue(expr13());
 	if(!integral(type))
 	    error(TYERR);
 	return(car(e)==CONST?list2(CONST,~cadr(e)):list2(BNOT,e));
-    case LNOT:
+    case LNOT: /* !p */
 	conv->prefix_(sym);
 	getsym();
 	e=rvalue(expr13());
@@ -2221,7 +2238,7 @@
 		e=expr0();
 		checksym(RPAR);
 		expr16(e);
-		if(sym==INC||sym==DEC) {
+		if(sym==INC||sym==DEC) {   /* ??? */
 		    getsym();
 		    if(type==CHAR) type=INT;
 		    else if(!scalar(type)&&type!=FLOAT&&type!=DOUBLE)
@@ -2373,7 +2390,7 @@
 	break;
     case LPAR:
 	conv->lpar_();
-	if(typeid(getsym())) {
+	if(typeid(getsym())) { /* cast */
 	    t=typename();
 	    conv->return_type_(t,0,0);
 	    conv->rpar_();
@@ -2405,7 +2422,7 @@
     int e2,t;
 
     while(1) {
-	if(sym==LBRA) {
+       if(sym==LBRA) {  /* a[3] */
 	    conv->lbra_(sym);
 	    e1=rvalue(e1);
 	    t=type;
@@ -2415,7 +2432,7 @@
 	    conv->rbra_(sym);
 	    e1=binop(ADD,e1,e2,t,type);
 	    e1=indop(e1);
-	} else if(sym==LPAR) e1=expr15(e1);
+        } else if(sym==LPAR) e1=expr15(e1); /* f() */
 	else {
 	    if(sym==PERIOD) { conv->op_(sym);e1=strop(e1);
 	    } else if(sym==ARROW) { conv->op_(sym);e1=strop(indop(rvalue(e1)));
@@ -2493,6 +2510,7 @@
 	    return e;
 	} else if(t!=POINTER) error(TYERR);
     }
+    /* int case */
     switch(car(e)) {
     case GVAR:
 	return(list2(RGVAR,cadr(e)));
@@ -2544,7 +2562,7 @@
 strop(int e)
 {
     getsym();
-    if (sym!=IDENT||nptr->sc!=FIELD) error(TYERR);
+    if (sym!=IDENT||nptr->sc!=FIELD) error(TYERR); /* ??? */
     conv->id_(sym,nptr);
     if (integral(type)||(car(type)!=STRUCT && car(type)!=UNION))
 	e=rvalue(e);
@@ -2886,7 +2904,7 @@
 
 	/* pass the pointer as an argument */
 	/* this is recognized by called function declaration */
-	/* but I don't know this sequece is compatible with gcc */
+	/* but I don't know this sequence is compatible with gcc */
 
 	append3(arglist,list2(ADDRESS,e),list2(POINTER,type));
     }