changeset 196:5f70abd9453d

*** empty log message ***
author kono
date Wed, 07 Apr 2004 21:14:19 +0900
parents c193120ee2a6
children b5f49f32c2ee
files Changes mc-code-ia32.c mc-code-mips.c mc-code-powerpc.c mc-code.h mc-codegen.c mc-parse.c mc.h test/code-gen.c
diffstat 9 files changed, 568 insertions(+), 277 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sun Apr 04 21:17:10 2004 +0900
+++ b/Changes	Wed Apr 07 21:14:19 2004 +0900
@@ -3859,3 +3859,13 @@
 コンパイラをCbCで書くと言う作業が残っているんだよな...
 
 う、やっぱり、long long は、遠い... できんの?
+
+
+Mon Apr  5 00:20:13 JST 2004
+
+間違えて3日分消しちゃったい。
+
+int でも RLVAR とかの unsigned/singned の区別がないとまずいよね。
+
+包括的なテストルーチンがあった方が便利。long.c を消しちゃったし。
+
--- a/mc-code-ia32.c	Sun Apr 04 21:17:10 2004 +0900
+++ b/mc-code-ia32.c	Wed Apr 07 21:14:19 2004 +0900
@@ -1085,38 +1085,57 @@
 }
 
 int
-rindirect(int e1)   /* *(p +5 ) */
+code_rindirect(int e1, int offset, int us)
+{
+    char *crn,*op;
+    int byte;
+    g_expr(e1);
+    byte = 0; op="movl";
+    crn = register_name(creg,0);
+    printf("\t%s %d(%s),%s\n",op,offset,crn,crn);
+    return us?UNSIGNED:INT;
+}
+
+int
+code_crindirect(int e1, int offset, int us)
 {
-    char *op;
-    int e2,e3,byte,t;
-    e3 = cadr(e2 = cadr(e1));
-    g_expr(e2);
-    switch (car(e1)) {
+    char *crn,*op;
+    int byte;
+    g_expr(e1);
+    byte = 0; op=us?"movzbl":"movsbl";
+    crn = register_name(creg,0);
+    printf("\t%s %d(%s),%s\n",op,offset,crn,crn);
+    return us?UCHAR:CHAR;
+}
+
+int
+code_srindirect(int e1, int offset, int us)
+{
+    char *crn,*op;
+    int byte;
+    g_expr(e1);
+    byte = 0; op=us?"movzwl":"movswl";
+    crn = register_name(creg,0);
+    printf("\t%s %d(%s),%s\n",op,offset,crn,crn);
+    return us?USHORT:SHORT;
+}
+
 #if FLOAT_CODE
-    case FRINDIRECT: case DRINDIRECT:
-	printf("\t%s (%s)\n",fload(car(e1)==DRINDIRECT),register_name(creg,0));
-	t=DOUBLE;
-	return t;
-	break;
+int
+code_drindirect(int e1, int offset, int d)
+{
+    g_expr(e1);
+    printf("\t%s (%s)\n",fload(d),register_name(creg,0));
+    return DOUBLE;
+}
 #endif
-    case CRINDIRECT: 
-	byte = 1; op="movsbl";t=CHAR;
-	break;
-    case CURINDIRECT: 
-	byte = 1; op="movzbl";t=UCHAR;
-	break;
-    case SRINDIRECT: 
-	byte = 1; op="movswl";t=SHORT;
-	break;
-    case SURINDIRECT: 
-	byte = 1; op="movzwl";t=USHORT;
-	break;
-    case RINDIRECT: default:
-	byte = 0; op="movl";t=INT;
-    }
-    printf("\t%s (%s),%s\n",op,register_name(creg,0),register_name(creg,0));
-    return t;
+
+#if LONGLONG_CODE
+int
+code_lrindirect(int e1, int offset, int us)
+{
 }
+#endif
 
 char *
 move(int byte)
--- a/mc-code-mips.c	Sun Apr 04 21:17:10 2004 +0900
+++ b/mc-code-mips.c	Wed Apr 07 21:14:19 2004 +0900
@@ -1513,29 +1513,53 @@
 }
 
 int
-rindirect(int e1)   /* *(p +5 ) */
+code_rindirect(int e1, int offset, int us)
+{
+    char *crn;
+    g_expr(e1);
+    crn=register_name(creg);
+    printf("\tlw %s,%d(%s)\n",crn,offset,crn);
+    return INT;
+}
+
+int
+code_crindirect(int e1, int offset, int us)
 {
     char *crn;
-    int e2,e3,e4,offset;
-
-    offset=0;
-    e3 = cadr(e2 = cadr(e1));
-    if (car(e2)==ADD) {
-        e4=caddr(e2);
-	if (car(e4)==CONST) {
-	    offset=cadr(e4);
-	    e2=e3;
-	}
+    g_expr(e1);
+    crn=register_name(creg);
+    if (us) {
+        printf("\tlbu %s,%d(%s)\n",crn,offset,crn);
+        return UCHAR;
+    } else {
+        printf("\tlb %s,%d(%s)\n",crn,offset,crn);
+        return CHAR;
     }
-    g_expr(e2);
+}
+
+int
+code_srindirect(int e1, int offset, int us)
+{
+    char *crn;
+    g_expr(e1);
     crn=register_name(creg);
-    switch (car(e1)) {
-    case FRINDIRECT: 
-        printf("\tl.s %s,%d(%s)\n", fregister_name(freg),offset,crn);
-        regv[creg]=0; regv[freg]=1;
-	creg = freg;
-        return FLOAT;
-    case DRINDIRECT: 
+    if (us) {
+        printf("\tlhu %s,%d(%s)\n",crn,offset,crn);
+        return USHORT;
+    } else {
+        printf("\tlh %s,%d(%s)\n",crn,offset,crn);
+        return SHORT;
+    }
+}
+
+#if FLOAT_CODE
+int
+code_drindirect(int e1, int offset, int d)
+{
+    char *crn;
+    g_expr(e1);
+    crn=register_name(creg);
+    if (d) {
         printf("\tlw %s,%d(%s)\n",
             dregister_name0(dreg),offset,crn);
         printf("\tlw %s,%d(%s)\n",
@@ -1543,24 +1567,24 @@
         regv[creg]=0; regv[dreg]=1;
 	creg = dreg;
         return DOUBLE;
-    case CRINDIRECT: 
-        printf("\tlb %s,%d(%s)\n",crn,offset,crn);
-        return CHAR;
-    case CURINDIRECT: 
-        printf("\tlbu %s,%d(%s)\n",crn,offset,crn);
-        return UCHAR;
-    case SRINDIRECT: 
-        printf("\tlh %s,%d(%s)\n",crn,offset,crn);
-        return SHORT;
-    case SURINDIRECT: 
-        printf("\tlhu %s,%d(%s)\n",crn,offset,crn);
-        return USHORT;
-    case RINDIRECT:
-        printf("\tlw %s,%d(%s)\n",crn,offset,crn);
-        return INT;
+    } else {
+        printf("\tl.s %s,%d(%s)\n", fregister_name(freg),offset,crn);
+        regv[creg]=0; regv[freg]=1;
+	creg = freg;
+        return FLOAT;
     }
-    error(-1); return INT;
 }
+#endif
+
+#if LONGLONG_CODE
+int
+code_lrindirect(int e1, int offset, int us)
+{
+    char *crn;
+    g_expr(e1);
+    crn=register_name(creg);
+}
+#endif
 
 void
 code_assign_gvar(int e2,int creg,int byte) {
--- a/mc-code-powerpc.c	Sun Apr 04 21:17:10 2004 +0900
+++ b/mc-code-powerpc.c	Wed Apr 07 21:14:19 2004 +0900
@@ -1558,52 +1558,74 @@
 }
 
 int
-rindirect(int e1)   /* *(p +5 ) */
+code_rindirect(int e1, int offset, int us)
 {
     char *crn;
-    int e2,e3,e4,offset;
-
-    offset=0;
-    e3 = cadr(e2 = cadr(e1));
-    if (car(e2)==ADD) {
-        e4=caddr(e2);
-	if (car(e4)==CONST) {
-	    offset=cadr(e4);
-	    e2=e3;
-	}
-    }
-    g_expr(e2);
+    g_expr(e1);
     crn=register_name(creg);
-    switch (car(e1)) {
-#if FLOAT_CODE
-    case FRINDIRECT: case DRINDIRECT:
-	printf("\t%s %s,%d(%s)\n",fload(car(e1)==DRINDIRECT),
-	    fregister_name(freg),offset,crn);
-	regv[creg]=0; regv[freg]=1;
-	creg = freg;
-	return DOUBLE;
-#endif
-    case CRINDIRECT: 
+    printf("\tlwz %s,%d(%s)\n",crn,offset,crn);
+    return INT;
+}
+
+int
+code_crindirect(int e1, int offset, int us)
+{
+    char *crn;
+    g_expr(e1);
+    crn=register_name(creg);
+    if (us) {
+	printf("\tlbz %s,%d(%s)\n",crn,offset,crn);
+	return UCHAR;
+    } else {
 	printf("\tlbz %s,%d(%s)\n",crn,offset,crn);
 	printf("\textsb %s,%s\n",crn,crn);
 	return CHAR;
-    case CURINDIRECT: 
-	printf("\tlbz %s,%d(%s)\n",crn,offset,crn);
-	return UCHAR;
-    case SRINDIRECT: 
+    }
+}
+
+int
+code_srindirect(int e1, int offset, int us)
+{
+    char *crn;
+    g_expr(e1);
+    crn=register_name(creg);
+    if (us) {
+	printf("\tlhz %s,%d(%s)\n",crn,offset,crn);
+	return USHORT;
+    } else {
 	printf("\tlhz %s,%d(%s)\n",crn,offset,crn);
 	printf("\textsh %s,%s\n",crn,crn);
 	return SHORT;
-    case SURINDIRECT: 
-	printf("\tlhz %s,%d(%s)\n",crn,offset,crn);
-	return USHORT;
-    case RINDIRECT:
-	printf("\tlwz %s,%d(%s)\n",crn,offset,crn);
-	return INT;
     }
-    error(-1); return INT;
 }
 
+#if FLOAT_CODE
+int
+code_drindirect(int e1, int offset, int d)
+{
+    char *crn;
+    g_expr(e1);
+    crn=register_name(creg);
+    printf("\t%s %s,%d(%s)\n",fload(d),
+	fregister_name(freg),offset,crn);
+    regv[creg]=0; regv[freg]=1;
+    creg = freg;
+    return DOUBLE;
+}
+#endif
+
+#if LONGLONG_CODE
+int
+code_lrindirect(int e1, int offset, int us)
+{
+    char *crn;
+    g_expr(e1);
+    crn=register_name(creg);
+    return LONGLONG;
+}
+#endif
+
+
 void
 code_assign_gvar(int e2,int creg,int byte) {
     int r;
--- a/mc-code.h	Sun Apr 04 21:17:10 2004 +0900
+++ b/mc-code.h	Wed Apr 07 21:14:19 2004 +0900
@@ -76,7 +76,17 @@
 extern void code_fix_frame_pointer(int disp_offset);
 extern void code_jmp(char *s);
 extern void code_indirect_jmp(int e2);
-extern int rindirect(int e1);
+
+extern int code_rindirect(int e1, int offset, int us);
+extern int code_crindirect(int e1, int offset, int us);
+extern int code_srindirect(int e1, int offset, int us);
+#if FLOAT_CODE
+extern int code_drindirect(int e1, int offset, int d);
+#endif
+#if LONGLONG_CODE
+extern int code_lrindirect(int e1, int offset, int us);
+#endif
+
 extern void code_assign_gvar(int e2,int reg,int byte);
 extern void code_assign_lvar(int e2,int reg,int byte);
 extern void code_assign_register(int e2,int byte,int reg);
--- a/mc-codegen.c	Sun Apr 04 21:17:10 2004 +0900
+++ b/mc-codegen.c	Wed Apr 07 21:14:19 2004 +0900
@@ -211,12 +211,30 @@
 	return VOID;
     case INDIRECT:
 	return g_expr0(e2);
-    case RINDIRECT:  case CRINDIRECT: case CURINDIRECT:
-    case SRINDIRECT: case SURINDIRECT:
+    case RINDIRECT:  
+	return code_rindirect(e2,caddr(e1),0);
+    case URINDIRECT:  
+	return code_rindirect(e2,caddr(e1),1);
+    case CRINDIRECT: 
+	return code_crindirect(e2,caddr(e1),0);
+    case CURINDIRECT:
+	return code_crindirect(e2,caddr(e1),1);
+    case SRINDIRECT: 
+	return code_srindirect(e2,caddr(e1),0);
+    case SURINDIRECT:
+	return code_srindirect(e2,caddr(e1),1);
 #if FLOAT_CODE
-    case DRINDIRECT: case FRINDIRECT:
+    case DRINDIRECT: 
+	return code_drindirect(e2,caddr(e1),1);
+    case FRINDIRECT:
+	return code_drindirect(e2,caddr(e1),0);
 #endif
-	return rindirect(e1);
+#if LONGLONG_CODE
+    case LRINDIRECT: 
+	return code_lrindirect(e2,caddr(e1),0);
+    case LURINDIRECT:
+	return code_lrindirect(e2,caddr(e1),1);
+#endif
     case ADDRESS:
 	if (car(e2)==REGISTER||car(e2)==DREGISTER||car(e2)==FREGISTER)
 	    return register_to_lvar(e2); /* too late? */
--- a/mc-parse.c	Sun Apr 04 21:17:10 2004 +0900
+++ b/mc-parse.c	Wed Apr 07 21:14:19 2004 +0900
@@ -2888,74 +2888,70 @@
 /* right value , get the value of the variable */
 
 static int
+indirect(int t,int e1)
+{
+    int e2,e3,e4,offset;
+    e2 = e1;
+    offset = 0;
+    e3 = cadr(e2);
+    if (car(e2)==ADD) {
+        e4=caddr(e2);
+        if (car(e4)==CONST) {
+            offset=cadr(e4);
+            e1=e3;
+        }
+    }
+    return list3(t,e1,offset);
+}
+
+static int
 rvalue(int e)
 {
-    int t,op;
-    if(type==CHAR||type==SHORT||type==LONGLONG) {
-        op = (type==SHORT?SOP:type==LONGLONG?LOP:0);
-	if(type!=LONGLONG) type= INT;
-	switch(car(e)) {
-	case GVAR:
-	    return(list2(CRGVAR+op,cadr(e)));
-	case LVAR:
-	    return(list2(CRLVAR+op,cadr(e)));
-	case INDIRECT:
-	    return(list2(CRINDIRECT+op,cadr(e)));
-	default:return(e);
-	}
-    }
-    if(type==UCHAR||type==USHORT||type==ULONGLONG) {
-        op = (type==USHORT?SOP:type==ULONGLONG?LOP:0);
-	if(type!=LONGLONG) type= UNSIGNED;
-	switch(car(e)) {
-	case GVAR:
-	    return(list2(CURGVAR+op,cadr(e)));
-	case LVAR:
-	    return(list2(CURLVAR+op,cadr(e)));
-	case INDIRECT:
-	    return(list2(CURINDIRECT+op,cadr(e)));
-	default:return(e);
-	}
-    }
-    if(type==FLOAT||type==DOUBLE) {
-        op = type==FLOAT?FOP:type==DOUBLE?DOP:0;
-	switch(car(e)) {
-	case GVAR:
-	    return(list2(RGVAR+op,cadr(e)));
-	case LVAR:
-	    return(list2(RLVAR+op,cadr(e)));
-	case INDIRECT:
-	    return(list2(RINDIRECT+op,cadr(e)));
-	default:return(e);
-	}
-    }
-    if(!integral(type)&&type!=VOID) {
-	if(type==CODE) {
-	    return e;
-	} if((t=car(type))==ARRAY) {
+    int op;
+
+    op = 0;
+    switch(type) {
+    case INT: break;
+    case UNSIGNED: break;
+    case VOID:	break;
+    case CHAR:	op=COP; type=INT; break;
+    case UCHAR:	op=COP+US; type=INT; break;
+    case SHORT:	op=SOP; type=UNSIGNED; break;
+    case USHORT:	op=SOP+US; type=UNSIGNED; break;
+    case LONGLONG:	op=LOP; break;
+    case ULONGLONG:	op=LOP+US; break;
+    case FLOAT:	op=FOP; break;
+    case DOUBLE:	op=DOP; break;
+    case CODE:	return e;
+    default:
+	if (integral(type)) break;
+	switch(car(type)) {
+	case ARRAY:
 	    type=list2(POINTER,cadr(type));
 	    if(car(e)==INDIRECT) return cadr(e);
 	    return list2(ADDRESS,e);
-	} else if(t==STRUCT || t==UNION) {
+	case STRUCT: case UNION:
 	    if(car(e)==RSTRUCT) return e; /* ??? */
-	    t = cadr(type); /* size */
-	    return list3(RSTRUCT,e,t);
-	} else if(t==FUNCTION) {
+	    return list3(RSTRUCT,e,cadr(type) /* size */);
+	case FUNCTION:
 	    type=cadr(type);
 	    return e;
-	} else if(t==CODE) {
+	case CODE:
 	    return e;
-	} else if(t!=POINTER) error(TYERR);
+	case POINTER:
+	    break;
+	default:
+	    error(TYERR);
+	}
     }
-    /* int case */
     switch(car(e)) {
     case GVAR:
-	return(list2(RGVAR,cadr(e)));
+	return(list2(RGVAR+op,cadr(e)));
     case LVAR:
-	return(list2(RLVAR,cadr(e)));
+	return(list2(RLVAR+op,cadr(e)));
     case INDIRECT:
-	return(list2(RINDIRECT,cadr(e)));
-    default:return(e);
+	return(indirect(RINDIRECT+op,cadr(e)));
+    default:return(e); /* idempotent case? */
     }
 }
 
--- a/mc.h	Sun Apr 04 21:17:10 2004 +0900
+++ b/mc.h	Wed Apr 07 21:14:19 2004 +0900
@@ -11,7 +11,7 @@
 #endif
 
 #define FLOAT_CODE 1
-#define LONGLONG_CODE 1
+#define LONGLONG_CODE 0
 
 #define SIZE_INT   4
 
@@ -101,11 +101,12 @@
 /* mode end */
 
 #define US	1
-#define AS	1000
+#define AS	10000
 #define SOP	200
-#define DOP	400
-#define FOP	600
-#define LOP	800
+#define COP	400
+#define DOP	600
+#define FOP	800
+#define LOP	1000
 
 /* tree node tags start */
 
@@ -115,123 +116,130 @@
 
 #define GVAR	1
 #define RGVAR	2
-#define CRGVAR	3
-#define CURGVAR	4
-#define LVAR	5
-#define RLVAR	6
-#define CRLVAR	7
-#define CURLVAR	8
+#define URGVAR	3
+#define LVAR	4
+#define RLVAR	5
+#define URLVAR	6
+#define CRGVAR	(COP+RGVAR)
+#define CURGVAR	(COP+URGVAR)
+#define CRLVAR	(COP+RLVAR)
+#define CURLVAR	(COP+URLVAR)
 #define FRGVAR	(FOP+RGVAR)
 #define FRLVAR	(FOP+RLVAR)
 #define DRGVAR	(DOP+RGVAR)
 #define DRLVAR	(DOP+RLVAR)
-#define SRGVAR	(SOP+CRGVAR)
-#define SRLVAR	(SOP+CRLVAR)
-#define SURGVAR	(SOP+CURGVAR)
-#define SURLVAR	(SOP+CURLVAR)
-#define LRGVAR	(LOP+CRGVAR)
-#define LRLVAR	(LOP+CRLVAR)
-#define LURGVAR	(LOP+CURGVAR)
-#define LURLVAR	(LOP+CURLVAR)
+#define SRGVAR	(SOP+RGVAR)
+#define SURGVAR	(SOP+URGVAR)
+#define SRLVAR	(SOP+RLVAR)
+#define SURLVAR	(SOP+URLVAR)
+#define LRGVAR	(LOP+RGVAR)
+#define LURGVAR	(LOP+URGVAR)
+#define LRLVAR	(LOP+RLVAR)
+#define LURLVAR	(LOP+URLVAR)
 
-#define CONST	9
+#define CONST	7
 #define DCONST	(DOP+CONST)
 #define FCONST	(FOP+CONST)
 #define LCONST	(LOP+CONST)
-#define STRING	10
-#define FNAME	11
+#define STRING	8
+#define FNAME	9
 
 #define NULLARY_ARGS(i) (i==REGISTER||i==DREGISTER||i==FREGISTER||(GVAR<=(i%SOP)&&(i%SOP)<=FNAME))
 
 /* unary  argments */
 
-#define ADDRESS	12
-#define MINUS	13
-#define LNOT	14
-#define BNOT	15
-#define INC	16
-#define POSTINC	17
-#define UPOSTINC	18
-#define PREINC	19
-#define UPREINC	20
-#define DEC	21
-#define CPOSTINC	22
-#define CPREINC	23
-#define CPOSTDEC	24
-#define CPREDEC	25
-#define CUPOSTINC	26
-#define CUPREINC	27
-#define CUPOSTDEC	28
-#define CUPREDEC	29
-#define SPOSTINC (SOP+CPOSTINC)
-#define SPREINC (SOP+CPREINC)
-#define SPOSTDEC (SOP+CPOSTDEC)
-#define SPREDEC (SOP+CPREDEC)
-#define SUPOSTINC (SOP+CUPOSTINC)
-#define SUPREINC (SOP+CUPREINC)
-#define SUPOSTDEC (SOP+CUPOSTDEC)
-#define SUPREDEC (SOP+CUPREDEC)
+#define ADDRESS	10
+#define MINUS	11
+#define LNOT	12
+#define BNOT	13
+#define INC	14
+#define POSTINC	15
+#define UPOSTINC	16
+#define PREINC	17
+#define UPREINC	18
+#define POSTDEC	19
+#define UPOSTDEC	20
+#define PREDEC	21
+#define UPREDEC	22
+#define DEC	23
+#define CPOSTINC (COP+POSTINC)
+#define CUPOSTINC (COP+UPOSTINC)
+#define CPREINC (COP+PREINC)
+#define CUPREINC (COP+UPREINC)
+#define CPOSTDEC (COP+POSTDEC)
+#define CUPOSTDEC (COP+UPOSTDEC)
+#define CPREDEC (COP+CPREDEC)
+#define CUPREDEC (COP+UPREDEC)
+#define SPOSTINC (SOP+POSTINC)
+#define SUPOSTINC (SOP+UPOSTINC)
+#define SPREINC (SOP+PREINC)
+#define SUPREINC (SOP+UPREINC)
+#define SPOSTDEC (SOP+POSTDEC)
+#define SUPOSTDEC (SOP+UPOSTDEC)
+#define SPREDEC (SOP+PREDEC)
+#define SUPREDEC (SOP+UPREDEC)
 #define FPOSTINC	(FOP+POSTINC)
 #define FPREINC	(FOP+PREINC)
 #define DPOSTINC	(DOP+POSTINC)
 #define DPREINC	(DOP+PREINC)
-#define LPOSTINC	(LOP+CPOSTINC)
-#define LPREINC	(LOP+CPREINC)
-#define LUPOSTINC	(LOP+CUPOSTINC)
-#define LUPREINC	(LOP+CUPREINC)
-#define INDIRECT	30
-#define RINDIRECT	31
-#define CRINDIRECT	32
-#define CURINDIRECT	33
-#define SRINDIRECT	(SOP+CRINDIRECT)
-#define SURINDIRECT	(SOP+CURINDIRECT)
+#define LPOSTINC	(LOP+POSTINC)
+#define LPREINC	(LOP+PREINC)
+#define LUPOSTINC	(LOP+UPOSTINC)
+#define LUPREINC	(LOP+UPREINC)
+#define INDIRECT	24
+#define RINDIRECT	25
+#define URINDIRECT	26
+#define CRINDIRECT	(COP+RINDIRECT)
+#define CURINDIRECT	(COP+URINDIRECT)
+#define SRINDIRECT	(SOP+RINDIRECT)
+#define SURINDIRECT	(SOP+URINDIRECT)
 #define FRINDIRECT	(FOP+RINDIRECT)
 #define DRINDIRECT	(DOP+RINDIRECT)
-#define LRINDIRECT	(LOP+CRINDIRECT)
+#define LRINDIRECT	(LOP+RINDIRECT)
 #define LURINDIRECT	(LOP+CURINDIRECT)
-#define RSTRUCT	34
-#define CONV	35
+#define RSTRUCT	27
+#define CONV	28
 
 #define UNARY_ARGS(i) (ADDRESS<=(i%SOP)&&(i%SOP)<=CONV)
 
 /* binary  argments */
 
-#define MUL	36
-#define UMUL	37
-#define DIV	38
-#define UDIV	39
-#define MOD	40
-#define UMOD	41
-#define ADD	42
-#define SUB	43
-#define CMP    	44	
-#define RSHIFT	45
-#define URSHIFT	46
-#define LSHIFT	47
-#define ULSHIFT	48
-#define GT	49
-#define UGT	50
-#define GE	51
-#define UGE	52
-#define LT	53
-#define ULT	54
-#define LE	55
-#define ULE	56
-#define EQ	57
-#define NEQ	58
-#define BAND	59
-#define EOR	60
-#define BOR	61
-#define LAND	62
-#define LOR	63
-#define ASS	64
-#define CMPGE	65
-#define ASSOP	66
-#define COMMA	67
+#define MUL	29
+#define UMUL	30
+#define DIV	31
+#define UDIV	32
+#define MOD	33
+#define UMOD	34
+#define ADD	35
+#define SUB	36
+#define CMP    	37	
+#define RSHIFT	38
+#define URSHIFT	39
+#define LSHIFT	40
+#define ULSHIFT	41
+#define GT	42
+#define UGT	43
+#define GE	44
+#define UGE	45
+#define LT	46
+#define ULT	47
+#define LE	48
+#define ULE	49
+#define EQ	50
+#define NEQ	51
+#define BAND	52
+#define EOR	53
+#define BOR	54
+#define LAND	55
+#define LOR	56
+#define ASS	57
+#define CMPGE	58
+#define ASSOP	59
+#define COMMA	60
 
-#define CASS	68
-#define CASSOP	69
-#define CUASSOP	70
+#define CASS	61
+#define CASSOP	62
+#define CUASSOP	63
 
 #define SASS	(SOP+CASS)
 #define SASSOP (SOP+CASSOP)
@@ -282,13 +290,13 @@
 #define LBOR	(LOP+BOR)
 
 
-#define STASS	71
+#define STASS	64
 
 #define BINARY_ARGS(i) (MUL<=(i%SOP)&&(i%SOP)<=STASS)
 
 /* tarnary  argments */
 
-#define COND	72
+#define COND	65
 #define SCOND	(SOP+COND)
 #define DCOND	(DOP+COND)
 #define FCOND	(FOP+COND)
@@ -298,19 +306,19 @@
 
 /* not appeared as tags */
 
-#define I2I	73
-#define I2U	74
-#define I2D	75
-#define I2F	76
-#define I2LL	77
-#define I2ULL	78
+#define I2I	66
+#define I2U	67
+#define I2D	68
+#define I2F	69
+#define I2LL	70
+#define I2ULL	71
 
-#define U2I	79
-#define U2U	80
-#define U2D	81
-#define U2F	82
-#define U2LL	83
-#define U2ULL	84
+#define U2I	72
+#define U2U	73
+#define U2D	74
+#define U2F	75
+#define U2LL	76
+#define U2ULL	77
 
 #define D2I	(DOP+I2I)
 #define D2U	(DOP+I2U)
@@ -340,17 +348,17 @@
 #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
+#define LPAR	78
+#define RPAR	79
+#define LBRA	80
+#define RBRA	81
+#define LC	82
+#define RC	83
+#define COLON	84
+#define SM	85
+#define PERIOD	86
+#define ARROW	87
+#define CNAME	88
 
 /* tree node tags end */
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/code-gen.c	Wed Apr 07 21:14:19 2004 +0900
@@ -0,0 +1,184 @@
+/* Micro-C Code Generator Checker */
+/* $Id$ */
+
+#define FLOAT_CODE 1
+#define LONGLONG_CODE 1
+
+// code_lvar(int e2,int creg) 
+// code_label(int labelno)
+// code_gvar(int e1,int creg) 
+// code_rgvar(int e1,int creg) 
+// code_crgvar(int e1,int creg,int sign,int sz)
+// code_register(int e2,int creg) 
+// code_rlvar(int e2,int reg) 
+// code_crlvar(int e2,int reg,int sign,int sz) 
+// code_fname(NMTBL *n,int creg) 
+// code_const(int e2,int creg) 
+// code_neg(int creg) 
+// code_not(int creg) 
+// code_lnot(int creg) 
+// code_preinc(int e1,int e2,int dir,int sign,int sz,int reg) 
+// code_postinc(int e1,int e2,int dir,int sign,int sz,int reg) 
+// code_return(int creg) 
+// code_bool(int e1) 
+// code_gt(int cond) 
+// code_ugt(int cond) 
+// code_ge(int cond) 
+// code_uge(int cond) 
+// code_eq(int cond) 
+// code_cmp_crgvar(int e1,int sz) 
+// code_cmp_crlvar(int e2,int sz) 
+// code_cmp_rgvar(int e1) 
+// code_cmp_rlvar(int e2) 
+// code_cmp_register(int e2) 
+// ascii(char *s)
+// code_string(int e1,int creg)
+// struct_push(int e4,int t,int arg) 
+// function(int e1)
+// code_jmp(char *s) 
+// code_indirect_jmp(int e2) 
+// code_rindirect(int e1, int offset, int us);
+// code_crindirect(int e1, int offset, int us);
+// code_srindirect(int e1, int offset, int us);
+#if FLOAT_CODE
+// code_drindirect(int e1, int offset, int d);
+#endif
+#if LONGLONG_CODE
+// code_lrindirect(int e1, int offset, int us);
+#endif
+
+
+// code_assign_gvar(int e2,int creg,int byte) 
+// code_assign_lvar(int e2,int creg,int byte) 
+// code_assign_register(int e2,int byte,int creg) 
+// code_assign(int e2,int byte,int creg) 
+// code_register_assop(int e2,int op,int byte) 
+// code_assop(int op,int byte,int sign) 
+// tosop(int op,int oreg)
+//     case LSHIFT:
+//     case ULSHIFT:
+//     case RSHIFT:
+//     case URSHIFT:
+//     case ADD:
+//     case SUB:
+//     case CMP:
+//     case BAND: 
+//     case EOR: 
+//     case BOR:
+//     case MUL:
+//     case UMUL:
+//     case DIV:
+//     case UDIV:
+//     case MOD:
+//     case UMOD:
+
+// oprtc(int op,int v)
+
+// ld_indexx(int byte, int n, int xreg,int sign)
+
+// rexpr(int e1, int l1, char *s,int t)
+
+// jcond(int l, char cond)
+
+// jmp(int l)
+// code_enter(char *name)
+
+#if FLOAT_CODE
+// code_cmp_dregister(int e2,int d)
+// code_dregister(int e2,int freg,int d)
+// code_dassign_gvar(int e2,int freg,int d)
+// code_dassign_lvar(int e2,int freg,int d)
+// code_dassign(int e2,int freg,int d)
+// code_dassign_dregister(int e2,int d,int freg) 
+// code_dconst(int e2,int freg,int d)
+// code_dneg(int freg,int d)
+// code_d2i(int freg0)
+// code_i2d(int creg0)
+// code_d2u(int freg0)
+// code_u2d(int creg0)
+// code_d2f(int freg)  
+// code_f2d(int freg)  
+// code_f2i(int freg)  code_d2i(freg); 
+// code_f2u(int freg)  code_d2u(freg); 
+// code_i2f(int creg)  code_i2d(creg); 
+// code_u2f(int creg)  code_u2d(creg); 
+
+// code_drgvar(int e2,int d,int freg)
+// code_drlvar(int e2,int d,int freg)
+// code_cmp_drgvar(int e2,int d)
+// code_cmp_drlvar(int e2,int d)
+// dtosop(int op,int e1)
+//     case FADD:
+//     case DADD: opn="fadd"; break;
+//     case FSUB:
+//     case DSUB: opn="fsub"; break;
+//     case FDIV:
+//     case DDIV: opn="fdiv"; break;
+//     case FMUL:
+//     case DMUL: opn="fmul"; break;
+//     case FCMP:
+//     case DCMP: 
+//     case FCMPGE: 
+//     case DCMPGE: 
+
+// code_dassop(int op,int d) 
+// code_dpreinc(int e1,int e2,int d,int reg) 
+// code_dpostinc(int e1,int e2,int d,int reg) 
+// drexpr(int e1, int e2,int l1, int op)
+
+// 	case DOP+GE:
+// 	case FOP+GE:
+// 	case DOP+GT:
+// 	case FOP+GT:
+// 	case DOP+EQ:
+// 	case FOP+EQ:
+// 	case DOP+NEQ:
+// 	case FOP+NEQ:
+#endif
+
+#if LONGLONG_CODE
+// lrexpr(int e1, int e2,int l1, int op)
+// int lpop_register()
+// code_lregister(int e2,int reg)
+// code_cmp_lregister(int reg)
+// code_cmp_lrgvar(int e1,int e2)
+// code_cmp_lrlvar(int e1,int e2)
+// code_lassign(int e1,int e2)
+// code_lassign_gvar(int e1,int e2)
+// code_lassign_lvar(int e1,int e2)
+// code_lassign_lregister(int e2,int reg)
+// code_lconst(int e1,int e2)
+// code_lneg(int e1,int e2)
+// code_lrgvar(int e1,int e2)
+// code_lrlvar(int e1,int e2)
+// ltosop(int e1,int e2)
+// code_i2ll(int creg)
+// code_i2ull(int creg)
+// code_u2ll(int creg)
+// code_u2ull(int creg)
+// code_ll2i(int creg)
+// code_ll2u(int creg)
+// code_ull2i(int creg)
+// code_ull2u(int creg)
+#if FLOAT_CODE
+// code_d2ll(int creg)
+// code_d2ull(int creg)
+// code_f2ll(int creg)
+// code_f2ull(int creg)
+// code_ll2d(int creg)
+// code_ll2f(int creg)
+// code_ull2d(int creg)
+// code_ull2f(int creg)
+// code_ull2ll(int creg)
+// code_ull2ull(int creg)
+#endif
+
+#if LONGLONG_CODE
+
+// code_lpreinc(int e1,int e2,int reg)
+// code_lpostinc(int e1,int e2,int reg)
+// code_lassop(int op)
+
+#endif
+/* end */
+