changeset 646:0d7baf338fc2

array argument continue...
author kono
date Mon, 06 Nov 2006 20:15:54 +0900
parents 595763d38ee7
children fe23fe842b82
files Changes mc-codegen.c mc-parse.c mc.h test/ps2.c
diffstat 5 files changed, 118 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sat Nov 04 22:38:18 2006 +0900
+++ b/Changes	Mon Nov 06 20:15:54 2006 +0900
@@ -9057,3 +9057,48 @@
 
 なんか、i3 のエラーを直してないね。見送りにしたわけ?
 
+Sat Nov  4 22:47:13 JST 2006
+
+      | frame pointer                     | stack pointer
+      v----> argument      local <--------v
+
+なんだけど、これだと、local variable のoffsetが、その場で
+定数にならないという問題があるんじゃないの?
+
+いや逆か。sp からなら、必ず定数になるわけね。
+
+subroutineから、code を呼び出す時に、parallel assignment
+が使えないが、この場合は、sp の値は決まっているはず。
+というか後で合わせれば良い。caller_arg を sp からの
+オフセットで書き込む必要がある。
+
+      | frame pointer                     | stack pointer
+      v----> argument      local <--|-----v
+                                    caller_arg
+
+というわけかな。
+
+caller_arg は、関数の最後でないと決まらないので、large offset
+では、やっぱり、困る。(だから、local var を fp からにしたの
+だったが...)
+
+      | frame pointer               | stack pointer
+      v----> argument      local <--|-----v
+                                    caller_arg
+
+にすればいいんだろうけど... 許されるのか? いくつかのアーキテクチャ
+では、そうなっているらしいが。
+
+まぁ、MAX caller arg を決めるっていう手もあるけどね。その方が
+楽か....
+
+Sun Nov  5 14:21:19 JST 2006
+
+expr16 で statement expression をparseしようと思うと、
+IVARが生成されてしまうので気まずい。pexpr するのは、
+少しおかしい。
+
+やっぱり parse してからcompileするモード作る?   そうすると、
+いろいろ出来るようになる。inmode=PARSE とかいうのを作るか。
+
+細かい問題があるみたいだね。
--- a/mc-codegen.c	Sat Nov 04 22:38:18 2006 +0900
+++ b/mc-codegen.c	Mon Nov 06 20:15:54 2006 +0900
@@ -616,6 +616,10 @@
     case ST_ASM:          st_asm(e1);	break;
     case ST_LABEL:        st_label(e1);	break;
     case ST_COMMENT:      st_comment(e1);	break;
+    case ST_OP:
+        e3=caddr(e1);
+        e1=binop(e2,car(e1),cadr(e3),caddr(e3),cadddr(e3));
+	return g_expr0(e1);
     case IVAR:      	  error(-1);	break;
     case 0:               break; // empty case
     default:
@@ -3299,7 +3303,7 @@
 	return n;
     case STAT: /* return (struct hoge)f() case? */
     case LDECL:    // local variable
-	if (stmode==REGISTER && !inmode) {
+	if (stmode==REGISTER && !(inmode==INLINE)) {
 	    if(scalar(type0)) {
 		ndsp = get_register_var(n);
 #if FLOAT_CODE
@@ -3315,7 +3319,7 @@
 	    } else error(DCERR);
 	    nsc = car(ndsp);
 	    ndsp = cadr(ndsp);
-	} else if (inmode) {
+	} else if (inmode==INLINE) {
 	    nsc = IVAR;
 	    ndsp = --disp;
 	} else {
@@ -4560,6 +4564,7 @@
 	else if (type==SHORT) t=INT;
 	else if (type==USHORT) t=UNSIGNED;
     }
+    // is this correct?
     if ((t1=type_value(type))>0 && 
 	    car(type_value(type))==ARRAY && car(e)==GVAR) {
 	if (!chk)
--- a/mc-parse.c	Sat Nov 04 22:38:18 2006 +0900
+++ b/mc-parse.c	Mon Nov 06 20:15:54 2006 +0900
@@ -1,4 +1,4 @@
-/* Micro-C Parser Part */ 
+
 
 
 /************************************************************************
@@ -3603,7 +3603,7 @@
             nptr1->sc=EMPTY;
             nptr1=l_top_search(nptr->nm,0);
             nptr1->sc = FLABEL;
-	    if (!inmode)
+	    if (inmode!=INLINE)
 		nptr1->dsp = fwdlabel();
 	    else
 		nptr1->dsp = --disp;
@@ -3611,7 +3611,7 @@
 	type = list2(POINTER,VOID);
 	// can be global?!
 	return list2(LABEL,
-	    list3(inmode?IVAR:LVAR,nptr1->dsp,(int)nptr1));
+	    list3(inmode==INLINE?IVAR:LVAR,nptr1->dsp,(int)nptr1));
     }
     e=expr14();
 
@@ -3887,6 +3887,7 @@
 		parse = sparse;
 		lastexp = 0;
 	    } else {
+#if 1
 		int l,b,l2,cntl=control;
 		// if COMMA expr is not gexpred by !control, 
 		// l2 is not defined and generates undefined error.
@@ -3905,6 +3906,17 @@
 		lastexp = 0;
 		if (l) fwddef(l);
 		control=cntl;
+#else
+		// we already have parse tree mode, why don't we?
+		int sparse = parse; parse=0;
+		inmode = INLINE+1;
+		// this does not work well... we need some work later
+		docomp(1);
+		e1 = list3(COMMA,reverse0(parse),lastexp);
+		parse = sparse;
+		lastexp = 0;
+		inmode = 0;
+#endif
 	    }
 	} else {
 	    e1=expr0();
@@ -4044,6 +4056,7 @@
 	    }
 	} else if(car(argtypes)==DOTS) at=DOTS;
         else { at=car(argtypes); argtypes=cadr(argtypes); }
+	if (at>0&&car(at)==ARRAY) at = list2(POINTER,cadr(at));
 	e = correct_type(e,at);
 	arglist=list3(e,arglist,type);
 	if(sym!=COMMA) break;
--- a/mc.h	Sat Nov 04 22:38:18 2006 +0900
+++ b/mc.h	Mon Nov 06 20:15:54 2006 +0900
@@ -566,7 +566,7 @@
 
 extern void print_expr(int e, FILE *vout);
 
-#if 1
+#if 0
 extern int heapsize;
 #define CHECK_HEAP(b) ({int _k=(int)(b);if(_k>heapsize||_k<0)error(-1);_k;})
 #else
--- a/test/ps2.c	Sat Nov 04 22:38:18 2006 +0900
+++ b/test/ps2.c	Mon Nov 06 20:15:54 2006 +0900
@@ -3,11 +3,53 @@
 #endif
 
 int printf(const char *,...);
+void bzero(void *b, unsigned int len);
+
+
 
 typedef float        ps2_vu0_fmatrix[4][4] __attribute__((aligned (16)));
 typedef ps2_vu0_fmatrix FMATRIX;
 
+typedef struct objNode {
+    void* object;
+    void (*mtd)(struct objNode*);
+    void (*draw)(struct objNode*, FMATRIX, FMATRIX);
+    struct objNode *next;
+    struct objNode *parent;
+    struct objNode *child;
+} ObjNode, *ObjNodePtr;
 
+INLINE void  draw(ObjNode *this, FMATRIX m, FMATRIX n)
+{
+    printf("work %g ",m[1][1]);
+    printf("base %g\n",n[1][1]);
+    m[1][1] += -0.7;
+    n[1][1] += 0.7;
+}
+
+ObjNode c = {
+    0, 0, draw, 0, 0, 0
+};
+
+ObjNode p = {
+    0, 0, draw, &c, 0, &c
+};
+
+
+INLINE void
+graphic_ObjNode_draw( ObjNode *this, FMATRIX base )
+{
+    FMATRIX work;
+    bzero(&work,sizeof(work)); work[1][1] = 0.33;
+
+    if(!this) return;
+    if(this->mtd)  this->mtd( this );
+    if(this->draw) this->draw( this, work, base );
+
+    if(this->child) graphic_ObjNode_draw( this->child, work );
+    if(this->next)  graphic_ObjNode_draw( this->next,  base );
+    return;
+}
 
 
 INLINE void  ps2_vu0_unit_matrix(ps2_vu0_fmatrix m)
@@ -16,6 +58,7 @@
     m[1][1] = -0.5;
 }
 
+
 int
 main(int ac, char *av[])
 {
@@ -24,4 +67,10 @@
     m[1][1] = 0.5;
     ps2_vu0_unit_matrix(m);
     printf("%g\n",m[1][1]);
+
+    graphic_ObjNode_draw(&p, m);
+    printf("%g\n",m[1][1]);
+    
 }
+
+/* end */