Mercurial > hg > CbC > old > device
changeset 78:8418d4b7caa7
*** empty log message ***
author | kono |
---|---|
date | Sun, 02 Mar 2003 23:46:10 +0900 |
parents | 2b8ba655e572 |
children | 82d0e30f61dd |
files | .gdbinit Changes Makefile mc-code-ia32.c mc-codegen.h mc-parse.c mc.h |
diffstat | 7 files changed, 114 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/.gdbinit Fri Feb 28 20:29:21 2003 +0900 +++ b/.gdbinit Sun Mar 02 23:46:10 2003 +0900 @@ -13,5 +13,5 @@ x/1i $eip end b errmsg -r -Cc test/arg.c +r -Cc test/float.c
--- a/Changes Fri Feb 28 20:29:21 2003 +0900 +++ b/Changes Sun Mar 02 23:46:10 2003 +0900 @@ -1768,3 +1768,73 @@ 構文式から生成しないとだめだろうね。 (ってことは、まだ、かなりの作業があるってこと.... むぅ...) tmp2.c は、通らないし... + +Fri Feb 28 20:32:46 JST 2003 + +で、c2cbc は、途中で float の方を先にやるわけ? + +Sat Mar 1 22:05:43 JST 2003 + +creg_destroy は、ぜんぜんだめ。これは基本的なアイデアがだめ。 + +long long はstructでいいんじゃない? だめ? で struct 演算を別に +定義してやる。これは、実装にもよるか。 + +float,long longなんだけど、 + FRGVAR DRGVAR LRGVAR +などを作る。さらに、 + FMUL DMUL LMUL +などもいる。型の変換は binop で解釈する。変換も演算になる。 + D2F, D2I, F2D, F2I, I2D, I2F, U2D, U2F +ぐらいですか? + +emit_pushは、型を必要とするけど? そうだねぇ。emit_fpush, emit_dpush +かな? + +creg にfloat register(or stack) の値を入れればいいんじゃないの? +それを見て、emit_pushの型を決める。creg は、けっこう、いろんあ +ものが見ているので、いじらない方がいいじゃないかなぁ。 +そうね。FMULとかがあるなら、それで判断できそう。 + +構文木には型を含めないってのは不便。型を入れれば? そうすれば、 + RGVAR CRGVAR FRGVAR DRGVAR LRGVAR +ではなく、 + RGVAR +ですむし。その方が変形も楽だしね。型は、 + CHAR,UNSIGNED, UNSIGNED CHAR, INT, FLOAT, DOUBLE, LONGLONG +ぐらいですか。 + +emit_data + +とすると、書き換えが結構あるけど。 + +Sun Mar 2 12:58:38 JST 2003 + +あとはconstantだね。FCONT,DCONSTかな。binopでは +変換とかも必要なわけだけど。 + +そういえば、shot のload/storeもないね。SRGVAR,SASSとかですか? SASS +は、すでにあるなぁ。 + +Sun Mar 2 22:01:58 JST 2003 + +あれ? + conv->_sm(); + (*conv->_sm)(); +の場合は、 + *conv->_sm の値へcallする +んだけど、 + goto exit1(); + goto (*exit1)(); +の場合は、 + exit1 +の値へjumpするんだよね? およ? なんか勘違いしてる? なんでexit1() +だとindirectが出て、(*exit1)だと出ないんだろう? + +この宣言は、 + void (*_sm)(); +であって、 + void _sm(); +はできない? なんで? + +あぁ、まぁ、いろいろ、めんどくさい。
--- a/Makefile Fri Feb 28 20:29:21 2003 +0900 +++ b/Makefile Sun Mar 02 23:46:10 2003 +0900 @@ -30,10 +30,10 @@ conv/cbc2c.h conv/conv.h conv/convdef.h conv/null.c conv/null.h clean : - -rm -f *.s *.o mc mc1 a.out *~ core* */*.o *.bak + -rm -f *.s *.o *.cc mc mc1 a.out *~ core* */*.o *.bak test/*.s test/*.cc test/*.o -mc1 : b00.s b01.s mc-codegen.o mc-tree.o $CONVERTER - $(CC) -g -o $@ $(PRINTF) b00.s b01.s mc-codegen.o mc-tree.o $CONVERTER +mc1 : b00.s b01.s mc-codegen.o mc-tree.o $(CONVERTER) + $(CC) -g -o $@ $(PRINTF) b00.s b01.s mc-codegen.o mc-tree.o $(CONVERTER) b00.s : mc-parse.c mc ./mc -s -ob00.s mc-parse.c b01.s : mc-code-ia32.c mc
--- a/mc-code-ia32.c Fri Feb 28 20:29:21 2003 +0900 +++ b/mc-code-ia32.c Sun Mar 02 23:46:10 2003 +0900 @@ -110,6 +110,7 @@ void code_closing(); void code_leave(char *name); int lvar(int l); +void global_table(void); void code_init(void) @@ -731,15 +732,17 @@ } if (car(e2) == FNAME) { n=(NMTBL *)cadr(e2); + regv[creg]=0; + use_register(creg,REG_EAX,0); /* will be destroyed */ } else { - use_register(creg,REG_EAX,0); g_expr(e2); + regv[creg]=1; + use_register(creg,REG_EAX,1); /* will be destroyed */ } /* we don't have to save creg nor dreg */ regs[creg]=0; regs[dreg]=0; - regv[creg]= regv[dreg]= regv[save]= 0; - use_register(creg,REG_EAX,0); + regv[dreg]= regv[save]= 0; use_register(dreg,REG_EDX,0); /* will be destroyed */ use_register(save,REG_ECX,0); /* will be destroyed */ regs[creg]=1; regs[dreg]=1; @@ -1005,6 +1008,7 @@ void code_closing() { + global_table(); printf("\t.ident \"Micro-C compiled\"\n"); }
--- a/mc-codegen.h Fri Feb 28 20:29:21 2003 +0900 +++ b/mc-codegen.h Sun Mar 02 23:46:10 2003 +0900 @@ -59,6 +59,8 @@ extern void ret(void); extern void use_register_var(int); extern void arg_register(int); +extern void creg_destroy(); +extern void regvar_creg(int); /* end */
--- a/mc-parse.c Fri Feb 28 20:29:21 2003 +0900 +++ b/mc-parse.c Sun Mar 02 23:46:10 2003 +0900 @@ -272,6 +272,8 @@ reserve("register",REGISTER); reserve("code",CODE); reserve("environment",ENVIRONMENT); + reserve("float",FLOAT); + reserve("double",DOUBLE); gpc=glineno=0; gfree=ilabel=1; @@ -448,6 +450,8 @@ case INT: case CHAR: case CODE: + case FLOAT: + case DOUBLE: t= sym; getsym(); break; @@ -460,12 +464,17 @@ if(getsym()==INT) getsym(); break; case SHORT: - t=CHAR; + t=INT; if(getsym()==INT) getsym(); break; case LONG: t=INT; - if(getsym()==INT) getsym(); + getsym(); + if(sym==LONG) { + getsym(); + t=LONGLONG; + } + if(sym==INT) getsym(); break; default: if(sym==IDENT) { @@ -2183,6 +2192,8 @@ } if(!integral(type)&&type!=VOID) { if(type==CODE) { return(e); + } else if(type==FUNCTION) { + return e; } else if((t=car(type))==ARRAY) { type=list2(POINTER,cadr(type)); if(car(e)==INDIRECT) return cadr(e); @@ -2190,8 +2201,6 @@ } else if(t==STRUCT || t==UNION) { t = cadr(type); /* size */ return list3(RSTRUCT,e,t); - } else if(t==FUNCTION) { - return e; } else if(t!=POINTER) error(TYERR); } switch(car(e)) { @@ -2407,7 +2416,7 @@ if(car(type)==POINTER) if (car(cadr(type))==FUNCTION||car(cadr(type))==CODE) - e1=indop(e1); + e1=list2(RINDIRECT,indop(e1)); t=type; if(integral(t)|| ((car(t)!=FUNCTION)&&(car(t)!=CODE))) error(TYERR);
--- a/mc.h Fri Feb 28 20:29:21 2003 +0900 +++ b/mc.h Sun Mar 02 23:46:10 2003 +0900 @@ -58,6 +58,10 @@ #define LMACRO (-44) #define DOTS (-45) +#define FLOAT (-46) +#define DOUBLE (-47) +#define LONGLONG (-48) + #define TOP 0 #define GDECL 1 #define GSDECL 2 @@ -143,6 +147,19 @@ #define SASS 68 #define RSTRUCT 69 +#define FMUL 70 +#define FDIV 71 +#define FADD 72 +#define FSUB 73 +#define DMUL 74 +#define DDIV 75 +#define DADD 76 +#define DSUB 77 +#define LMUL 78 +#define LDIV 79 +#define LADD 80 +#define LSUB 81 + #define US 1 #define AS 100