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