# HG changeset patch # User kono # Date 1073722429 -32400 # Node ID 114e9d64b5cca640f14a9da7694bf7d21c6bbf8e # Parent ce0c38b6c85ec85015ddfa7173c3f051480585ce *** empty log message *** diff -r ce0c38b6c85e -r 114e9d64b5cc Changes --- a/Changes Sun Dec 14 16:53:42 2003 +0900 +++ b/Changes Sat Jan 10 17:13:49 2004 +0900 @@ -3750,3 +3750,65 @@ かぁ。(めんどくさいだけどさ) (本気? どれくらいかかる? 2-3日かなぁ...) + +getsym の数字の扱いはunsingedでするべきだよね。 +で、- があった時にoverflow を検出するのが良いよな。 + +あと、strol とかのoverflowの検出をさぼってるな。 + +Fri Jan 2 09:53:53 JST 2004 + + goto hoge(...,next); + fuagua....; + +みたいな構文をいれる? Fortran みたい.... +(簡単か?) + +Sat Jan 3 17:12:46 JST 2004 + +FEATURE_LONGLONG +FEATURE_FLOAT + +みたいな感じで feature を落せる方が良い? 機能を増やす方向 +とは相性が良くない言語だから。 + +LEとかLTは、GE,GTで置き換えられるんだけど、片方が定数のときには +dual_op で入れ換えられちゃうので、やっぱり必要なみたい。 + +Mon Jan 5 15:55:37 JST 2004 + +byte code format というよりは、やっぱりbyte code encode +された構文木が欲しいんだよね。 + +ついでに interpreter も作るか。byte code interpreter ではなくて、 +(ではなくて?) code 生成が速いんだから、code生成しながら実行する +方が良いね。やっぱり、incore compiler か。 + +inline なんだけど... #define に置き換えられる? + inline int hoge(int hoga1) { hoge2 } +は、 + #define hoge(hoga1_0) { + #define hoga1 ((int) hoga1_0) + int hoga1 = hoga1_0; hoge2 } +でいいわけだよね。で、問題は return だけど... + +うーん、いま6ですな。 + +inline は、そのままstringバッファにしこんで、関数呼び出し時に +処理する方が正しいか。 + + 引数は、#define hoga1 ((int) hoga1_0) していく。 + 展開終了時に元に戻す + +あぁ、でも、大域変数がまずいか。 + +ということは、やっぱり、その場で構文解析してしまうのが良い。 + inlined LVAR (ARG) +の両方が必要。tree のコピーなしに展開することは可能? (できそうだけど...) + +ということは、やっぱり、制御構造にもnodeを割り振るべきだよね。 + +order 1 compiler + JIT + intensive optimizer + +ですかね。 + diff -r ce0c38b6c85e -r 114e9d64b5cc mc-codegen.c --- a/mc-codegen.c Sun Dec 14 16:53:42 2003 +0900 +++ b/mc-codegen.c Sat Jan 10 17:13:49 2004 +0900 @@ -418,10 +418,20 @@ return; case DOP+GT: - drexpr(cadr(e1),caddr(e1),l1,DOP+GT); + case DOP+GE: + case DOP+EQ: + case DOP+NEQ: + case FOP+GT: + case FOP+GE: + case FOP+EQ: + case FOP+NEQ: + drexpr(cadr(e1),caddr(e1),l1,car(e1)); return; - case DOP+GE: - drexpr(cadr(e1),caddr(e1),l1,DOP+GE); + case FOP+LT: + drexpr(caddr(e1),cadr(e1),l1,FOP+GT); + return; + case FOP+LE: + drexpr(caddr(e1),cadr(e1),l1,FOP+GE); return; case DOP+LT: drexpr(caddr(e1),cadr(e1),l1,DOP+GT); @@ -429,32 +439,6 @@ case DOP+LE: drexpr(caddr(e1),cadr(e1),l1,DOP+GE); return; - case DOP+EQ: - drexpr(cadr(e1),caddr(e1),l1,DOP+EQ); - return; - case DOP+NEQ: - drexpr(cadr(e1),caddr(e1),l1,DOP+NEQ); - return; - - case FOP+GT: - drexpr(cadr(e1),caddr(e1),l1,FOP+GT); - return; - case FOP+GE: - drexpr(cadr(e1),caddr(e1),l1,FOP+GE); - return; - case FOP+LT: - drexpr(caddr(e1),cadr(e1),l1,FOP+GT); - return; - case FOP+LE: - drexpr(caddr(e1),cadr(e1),l1,FOP+GE); - return; - case FOP+EQ: - drexpr(cadr(e1),caddr(e1),l1,FOP+EQ); - return; - case FOP+NEQ: - drexpr(cadr(e1),caddr(e1),l1,FOP+NEQ); - return; - case LAND: b_expr(e2,0,cond?(l2=fwdlabel()):l1,0); diff -r ce0c38b6c85e -r 114e9d64b5cc mc-parse.c --- a/mc-parse.c Sun Dec 14 16:53:42 2003 +0900 +++ b/mc-parse.c Sat Jan 10 17:13:49 2004 +0900 @@ -2957,7 +2957,13 @@ if (car(e1)==dop+CONST && (op==ADD||op==MUL)) { return(list3(op+dop,e2,e1)); } - if(op==GT||op==GE||op==LT||op==LE||op==EQ||op==NEQ) { + if(op==LT) { + type=INT; + return(list3(GT+dop,e2,e1)); + } else if(op==LE) { + type=INT; + return(list3(GE+dop,e2,e1)); + } else if(op==GT||op==GE||op==LT||op==LE||op==EQ||op==NEQ) { type=INT; return(list3(op+dop,e1,e2)); } else if(op==ADD||op==SUB||op==MUL||op==DIV) @@ -3059,7 +3065,15 @@ } return list2(CONST,e); } - if(op==GT||op==GE||op==LT||op==LE|| + if(op==LT) { + return(list3(GT,e2,e1)); + } else if(op==LE) { + return(list3(GE,e2,e1)); + } else if(op==ULT) { + return(list3(UGT,e2,e1)); + } else if(op==ULE) { + return(list3(UGE,e2,e1)); + } else if(op==GT||op==GE||op==LT||op==LE|| op==UGT||op==UGE||op==ULT||op==ULE|| op==EQ||op==NEQ ) diff -r ce0c38b6c85e -r 114e9d64b5cc mc.h --- a/mc.h Sun Dec 14 16:53:42 2003 +0900 +++ b/mc.h Sat Jan 10 17:13:49 2004 +0900 @@ -182,7 +182,8 @@ #define SURINDIRECT (SOP+CURINDIRECT) #define FRINDIRECT (FOP+RINDIRECT) #define DRINDIRECT (DOP+RINDIRECT) -#define LRINDIRECT (DOP+CRINDIRECT) +#define LRINDIRECT (LOP+CRINDIRECT) +#define LURINDIRECT (LOP+CURINDIRECT) #define RSTRUCT 34 #define CONV 35 @@ -278,28 +279,59 @@ /* not appeared as tags */ -#define I2D 73 -#define D2I 74 -#define U2D 75 -#define D2U 76 -#define F2D 77 -#define D2F 78 -#define I2F 79 -#define F2I 80 -#define U2F 81 -#define F2U 82 +#define I2I 73 +#define I2U 74 +#define I2D 75 +#define I2F 76 +#define I2LL 77 +#define I2ULL 78 + +#define U2I 79 +#define U2U 80 +#define U2D 81 +#define U2F 82 +#define U2LL 83 +#define U2ULL 84 + +#define D2I (DOP+I2I) +#define D2U (DOP+I2U) +#define D2D (DOP+I2D) +#define D2F (DOP+I2F) +#define D2LL (DOP+I2LL) +#define D2ULL (DOP+I2ULL) -#define LPAR 83 -#define RPAR 84 -#define LBRA 85 -#define RBRA 86 -#define LC 87 -#define RC 88 -#define COLON 89 -#define SM 90 -#define PERIOD 91 -#define ARROW 92 -#define CNAME 93 +#define F2I (FOP+I2I) +#define F2U (FOP+I2U) +#define F2D (FOP+I2D) +#define F2F (FOP+I2F) +#define F2LL (FOP+I2LL) +#define F2ULL (FOP+I2ULL) + +#define LL2I (LOP+I2I) +#define LL2U (LOP+I2U) +#define LL2D (LOP+I2D) +#define LL2F (LOP+I2F) +#define LL2LL (LOP+I2LL) +#define LL2ULL (LOP+I2ULL) + +#define ULL2I (LOP+U2I) +#define ULL2U (LOP+U2U) +#define ULL2D (LOP+U2D) +#define ULL2F (LOP+U2F) +#define ULL2LL (LOP+U2LL) +#define ULL2ULL (LOP+U2ULL) + +#define LPAR 85 +#define RPAR 86 +#define LBRA 87 +#define RBRA 88 +#define LC 89 +#define RC 90 +#define COLON 91 +#define SM 92 +#define PERIOD 93 +#define ARROW 94 +#define CNAME 95 /* tree node tags end */ diff -r ce0c38b6c85e -r 114e9d64b5cc stdio.h --- a/stdio.h Sun Dec 14 16:53:42 2003 +0900 +++ b/stdio.h Sat Jan 10 17:13:49 2004 +0900 @@ -1,4 +1,4 @@ -#ifndef __micro_c__aaa +#ifndef __micro_c__aaa #include "/usr/include/stdio.h" #else