Mercurial > hg > CbC > old > device
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 */