changeset 45:b9266c88495c

*** empty log message ***
author kono
date Thu, 13 Feb 2003 22:14:21 +0900
parents c9293a6e40d2
children b1c8ac8c308d
files Idea mc-nop-386.c mc-parse.c test/tmp7.c
diffstat 4 files changed, 76 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/Idea	Thu Feb 13 18:16:19 2003 +0900
+++ b/Idea	Thu Feb 13 22:14:21 2003 +0900
@@ -1471,7 +1471,12 @@
 
 temproal struct は再利用できるんだけど、dispの変更ができないので
 新しく作るしかない。大きいときだけ新しく作るなんていうセコイ
-技はあるけど。
+技はあるけど。(そうすると、帰って来た値へのポインタを使えなく
+なるが.... 別にいいよね。戻り値それ自身を直接 return する
+時もだいじょうぶなはず)
+
+結局、呼出側で、領域を確保して引き渡すことにしました。この方法だと、
+代入のときに二度コピーする必要もない。
 
 register  を使用しているかだけじゃなくて、実際にcreg/dregに
 値があるかどうかを記憶する必要がある。
@@ -1483,3 +1488,21 @@
 まぁねぇ。register の場所の確保と、寿命は別だから、それで
 いいんだけど、regs flag だけでなんとかならないのかな。
 こういう変更ははまるが虚しい。
+
+Thu Feb 13 18:37:36 JST 2003
+
+さて、そろそろ jump  にとりかかりますか。
+
+構造体の引き渡しのシークエンスに使う局所変数の位置がgccと違う...
+
+そろそろ register は構造体にすべきだね。
+    struct register {
+        int used;
+        int valued;
+        char *name;
+        char *wname;
+        char *bname;
+        int type; /* register variable or not */
+        int number;
+    }
+virtual/real は、どうする。
--- a/mc-nop-386.c	Thu Feb 13 18:16:19 2003 +0900
+++ b/mc-nop-386.c	Thu Feb 13 22:14:21 2003 +0900
@@ -335,16 +335,9 @@
 	return;
     real_v = virtual(real);
     move_op = regs[real_v]?"\txchg %s,%s\n":"\tmovl %s,%s\n";
-#define REGFLOW
-#ifdef REGFLOW
     if (move || (regv[real_v])) {
 	printf(move_op,reg_name[rname[virt]],reg_name[real]);
     } 
-#else
-    if (move || (regs[real_v])) {
-	printf(move_op,reg_name[rname[virt]],reg_name[real]);
-    } 
-#endif
     rname[real_v] = rname[virt];
     rname[virt] = real; 
 }
@@ -889,8 +882,11 @@
     /* otherwise we don't need this */
     if (fix) printf("\tsubl $%d,%s\n",fix,register_name(to,0));
     if(creg!=to) {
-	if (to==dreg) error(-1);
-	free_register(creg); creg=to;
+	if (to==dreg) 
+	    printf("\tmovl %s,%s\n",register_name(to,0),register_name(creg,0));
+	else {
+	    free_register(creg); creg=to;
+	}
     }
     regv[from]=regv[to]=regv[dreg]=0;
     regv[creg]=1;
--- a/mc-parse.c	Thu Feb 13 18:16:19 2003 +0900
+++ b/mc-parse.c	Thu Feb 13 22:14:21 2003 +0900
@@ -1018,6 +1018,8 @@
     code_leave(n->nm,disp-odisp);
 }
 
+static NMTBL *tmp_struct;
+
 void
 fdecl(NMTBL *n)
 {
@@ -1028,17 +1030,19 @@
     fnptr=n;
     retlabel=fwdlabel();
     retcont = 0;
+    tmp_struct = 0;
 
-    args=0;
     reg_var=0;
     fcheck(n);
     mode=ADECL;
+    if (sym!=LC) args=0;
     while (sym!=LC) { /* argument declaration !ANSI */
 	stmode=0;
 	decl(); getsym();
     }
     t=car(fnptr->ty);
     if (!scalar(t) && (car(t)==STRUCT||car(t)==UNION)) {
+	/* extra argument for struct return */
 	/* this extra dummy arguments are set at calling sequence */
 	str_ret.nm = "str_ret"; str_ret.sc = EMPTY;
 	str_ret.dsp = 0; str_ret.ty = 0;
@@ -1052,6 +1056,7 @@
     } else {
 	struct_return = 0;
     }
+    args=0;
     disp=0;
     init_vars=0;
     /* local variable declaration */
@@ -2165,7 +2170,7 @@
 int
 expr15(int e1)
 {
-    int t,arglist,e;
+    int t,arglist,e,sz;
 
     /* function call */
 
@@ -2187,11 +2192,28 @@
     if(type==CHAR) type=INT;
     else if(car(type)==STRUCT||car(type)==UNION) {
 	/* make temporaly struct for return value */
-	e = list2(LVAR,def(0)->dsp);
+	/* but it is better to see we can reuse old one */
+	if (tmp_struct) {
+	    sz = size(tmp_struct->ty);
+	    if (sz>=size(type)) {
+		/* reuse it */
+	    } else if (tmp_struct->dsp-sz==disp) {
+		/* extendable */
+		disp -= tmp_struct->dsp-sz;
+		tmp_struct->dsp = disp;
+	    } else {
+		tmp_struct = def(0);
+	    }
+	} else {
+	    tmp_struct = def(0);
+	}
+	e = list2(LVAR,tmp_struct->dsp);
+
 	/* pass the pointer as an argument */
 	/* this is recognized by called function declaration */
+	/* but I don't know this sequece is compatible with gcc */
+
 	arglist=list3(list2(ADDRESS,e),arglist,list2(POINTER,type));
-	/* return list3(COMMA,list3(FUNCTION,e1,arglist),rvalue(e)); */
     }
     return list3(FUNCTION,e1,arglist);
 }
--- a/test/tmp7.c	Thu Feb 13 18:16:19 2003 +0900
+++ b/test/tmp7.c	Thu Feb 13 22:14:21 2003 +0900
@@ -7,19 +7,26 @@
 void tmp(void);
 
 struct aa
-main0();
+main0(int);
 
 struct aa
-main0()
+main0(int k)
 {
     int i;
     struct aa ccc;
 
     for(i=0;i<100;i++) ccc.a[i]=i;
-    ccc.a[55]=123;
+    ccc.a[55]=k;
     return ccc;
 }
 
+struct aa
+main3(struct aa arg)
+{
+    int j=++arg.a[55];
+    return main0(j);
+}
+
 void
 main2(struct aa a1)
 {
@@ -57,15 +64,23 @@
 
     j = 3;
 
-    bbb = main0();
+    bbb = main0(123);
     printf("copied main0 ccc.a[55] %d==123\n",bbb.a[55]); 
     aap[2] = &bbb;
-    *aap[2] = main0();
+    *aap[2] = main0(123);
     printf("complex copied main0 ccc.a[55] %d==123\n",bbb.a[55]); 
     bbb.a[55]=0;
-    j = main0().a[55];
+    j = main0(123).a[55];
     printf("new main0 ccc.a[55] in temporal copy %d==123\n",j); 
 
+    j = 552;
+    bbb = main3(bbb);
+    printf("main3     bbb.a[55] in temporal copy %d==552 %d==1\n",j,bbb.a[55]); 
+    j = main3(bbb).a[55];
+    printf("main3     bbb.a[55] in temporal copy %d==2 %d\n",j,bbb.a[53]); 
+    j = main3(bbb).a[53];
+    printf("main3     bbb.a[55] in temporal copy %d==2 %d\n",j,bbb.a[53]); 
+
     printf("%d==3\n",q.b);
 /* 3==3 */
     r = q;