changeset 558:528fed826f17 partial-evaluation

const value switch statement prune.
author kono
date Sat, 07 Jan 2006 12:46:38 +0900
parents c3053086f790
children c55b51d51f8f
files Changes mc-codegen.c mc-inline.c mc-parse.c mc.h test/bitfield1.c test/inline.c test/offset.c test/putenemy.c test/stralign.c
diffstat 10 files changed, 367 insertions(+), 187 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sat Jan 07 02:00:06 2006 +0900
+++ b/Changes	Sat Jan 07 12:46:38 2006 +0900
@@ -7962,4 +7962,25 @@
 ないね。flow 解析しないと。
 
 
-
+えーと、volatile const ってのは、
+    自分では書かないが、
+    誰かが変更する可能性があるので、
+    常に読みにいかないとだめ
+ってことだよね。is_readony==1 だけど、is_const はfalse なのか。
+inline local の場合でもそうなの?
+
+    const int i = 3;
+    switch(i) {
+    case 1: printf("#0035:1\n"); break;
+    default:
+    case 2: printf("#0036:2\n"); break;
+    case 3: printf("#0037:3\n"); break;
+
+これで、case 2(=default) が選択されるのか。ってことは、
+default が来たら、残りは全部無視して良いわけ?
+
+
+
+
+
+
--- a/mc-codegen.c	Sat Jan 07 02:00:06 2006 +0900
+++ b/mc-codegen.c	Sat Jan 07 12:46:38 2006 +0900
@@ -3431,7 +3431,7 @@
     int lastexp0;
     if (!inmode) {
 	if (cslabel==0) {
-	    if (!control) error(-1); // no execute code in switch
+	    if (!control) error(CSERR); // no execute code in switch
 	    checkjmp(0);
 	    control=0;
 	    jmp(cslabel=fwdlabel());
@@ -3535,12 +3535,14 @@
     case GVAR:
 	n = (NMTBL*)caddr(e);
 	if (cadr(e)==0 && (c=attr_value(n,KONST))) {
+	    if (!has_attr(n,VOLATILE))
 	    return c;
 	}
 	return(list3(RGVAR+op,cadr(e),caddr(e)));
     case LVAR:
 	n = (NMTBL*)caddr(e);
-	if (n && (c=attr_value(n,KONST))) {
+	if (cadr(e)==0 && n && (c=attr_value(n,KONST))) {
+	    if (!has_attr(n,VOLATILE))
 	    return c;
 	}
 	return(list3(RLVAR+op,cadr(e),caddr(e)));
--- a/mc-inline.c	Sat Jan 07 02:00:06 2006 +0900
+++ b/mc-inline.c	Sat Jan 07 12:46:38 2006 +0900
@@ -151,6 +151,7 @@
 extern void
 st_switch(int e1){
     int sbreak,scase,sdefault,slfree,svalue,slist;
+    int cst,e;
 
     checkret();
     slist = cslist;
@@ -163,24 +164,45 @@
     // conv->switch_();
     slfree=lfree;
     svalue=csvalue1;      /* save parents switch value */
-    gexpr(caddr(e1),1);   /* switch value */
-    csvalue1=csvalue() ;
+    e =caddr(e1);         /* switch value */
+    if (car(e)==CONST) {
+	cst = 1;
+	csvalue1=glist2(CONST,cadr(e));
+	gen_jmp( cslabel=fwdlabel());
+    } else {
+	cst = 0;
+	gexpr(e,1);       /* switch value */
+	csvalue1=csvalue() ;
+	cslabel = control = 0;
+    }
     // conv->switch_body_();
-    cslabel = control = 0;
     g_expr_u(cadddr(e1));
     // conv->switch_end_();
     checkret();
 #if CASE_CODE
-    if (control) gen_jmp(blabel);
-    genswitch(cslist,cslabel);
+    if (!cst) {
+	if (control) gen_jmp(blabel);
+	genswitch(cslist,cslabel);
+    } else if (!cslist) {
+	if(dlabel) def_label(cslabel,dlabel);
+	else fwddef(cslabel);
+    }
 #else
-    if(dlabel) def_label(cslabel,dlabel);
-    else fwddef(cslabel);
+    if (!(cst && cslist)) {
+	if(dlabel) def_label(cslabel,dlabel);
+	else fwddef(cslabel);
+    }
 #endif
+    free_glist2(csvalue1);
+    if (cst && !cslist) {
+	if(pending_jmp!=cslabel)
+	    fwddef(cslabel);
+	else pending_jmp = 0; // cslabel is here
+    }
+    fwddef(blabel);
     csvalue1=svalue;
     cslabel=scase;
     dlabel=sdefault;
-    fwddef(blabel);
     blabel=sbreak;
     cslist = slist;
 }
@@ -213,12 +235,26 @@
 st_case(int e1){
 #if CASE_CODE
     int l,clist=caddr(e1),c;
-    l = fwdlabel();
-    // conv->case_begin_(0,0);
-    // conv->case_(0,0);
+    int cst = (car(csvalue1)==CONST);
+    if (cst) {
+	c=cadr(csvalue1);
+	for(;clist;clist=cadr(clist)) {
+	    if (car(clist)==c) break;
+	}
+	if (!clist) return; // no match
+    } else
+	l = fwdlabel();
     if (retpending) {
         ret(); retpending=0;
     }
+    if (cst) {
+	if (cslist) { // may duplicat csvalue
+	    return;
+	}
+	cslist=1;
+	fwddef(cslabel);
+	return;
+    }
     if (!cslabel) {
         if (!control) {
             cmpdimm(car(clist),csvalue1,cslabel=fwdlabel(),1);
@@ -235,25 +271,40 @@
     fwddef(l);
     control=1;
 #else
-    /* casading branch implementation */
-    int c,l;
-    c = caddr(e1);
+    int c,clist,l;
+    int cst = (car(csvalue1)==CONST);
+    clist = caddr(e1);
+    if (cst) {
+	c=cadr(csvalue1);
+	for(;clist;clist=cadr(clist)) {
+	    if (car(clist)==c) break; // no match
+	}
+	if (!clist) return;
+    }
+    if (cst) {
+	if (!cslist) {
+	    if (retpending) {
+		ret(); retpending=0;
+	    }
+	    fwddef(cslabel);
+	    cslist = 1;
+	} // else error(CSERR);
+	return;
+    }
     if (retpending) {
 	ret(); retpending=0;
     }
-    // conv->case_begin_(0,0);
-    // conv->case_(0,0);
     l=fwdlabel();
     if (control) {
         control=0;
         gen_jmp(l);
     }
     if (cslabel) fwddef(cslabel);
-    while(cadr(c)) {
-        cmpdimm(car(c),csvalue1,l,0);
-        c=cadr(c);
+    while(cadr(clist)) {
+        cmpdimm(car(clist),csvalue1,l,0);
+        clist=cadr(clist);
     }
-    cmpdimm(car(c),csvalue1,cslabel=fwdlabel(),1);
+    cmpdimm(car(clist),csvalue1,cslabel=fwdlabel(),1);
     if (l) fwddef(l);
 #endif
 }
@@ -261,6 +312,7 @@
  
 extern void
 st_default(int e1){
+    // int cst = (car(csvalue1)==CONST);
     control=1;
     checkret();
     if (dlabel) error(STERR);  // double default:
@@ -712,6 +764,7 @@
 static int
 p_default(int e)
 {
+    // should be removed if constant case value
     return list2(ST_DEFAULT,pexpr(cadr(e)));
 }
 
--- a/mc-parse.c	Sat Jan 07 02:00:06 2006 +0900
+++ b/mc-parse.c	Sat Jan 07 12:46:38 2006 +0900
@@ -366,6 +366,7 @@
 	(n==AGERR) ? "wrong number of arguments" :
 	(n==CODE_ERR) ? "goto is necessary" :
 	(n==ILERR) ? "inline error" :
+	(n==CSERR) ? "no excutable code in switch" :
 	"Bug of compiler");
     errmsg();
     if (serious(n))
@@ -1968,7 +1969,7 @@
 statement(int use)
 {
     int slfree,e;
-
+loop:
     if(sym==SM) {
 	conv->sm_();
 	getsym(0); return;
@@ -2015,11 +2016,9 @@
 	checksym(SM);
 	return;
     case CASE:
-	docase();
-	statement(use); return;
+	docase(); goto loop;
     case DEFAULT:
-	dodefault();
-	statement(use); return;
+	dodefault(); goto loop;
     case RETURN:
 	doreturn();
 	return;
@@ -2350,7 +2349,7 @@
 doswitch(void)
 {
     int sbreak,scase,sdefault,slfree,svalue,slist;
-    int pparse = parse,v;
+    int pparse = parse,v,cst=0;
 
     checkret();
     if (inmode) {
@@ -2369,20 +2368,28 @@
 	checksym(LPAR);
 	slfree=lfree;
 	svalue=csvalue1;      /* save parents switch value */
-	gexpr(expr(0),1);
+	v = expr(0);
+	if (!scalar(type)) error(EXERR);
+	if (car(v)!=CONST)
+	    gexpr(v,1);
     } else {
 	conv->switch_();
 	getsym(0);
 	checksym(LPAR);
 	v = expr(0);
+	if (!scalar(type)) error(EXERR);
     }
-    if (!scalar(type)) error(EXERR);
+    cst = (car(v)==CONST);
     if (!inmode) {
-	csvalue1=csvalue() ;
+	csvalue1=cst ? glist2(CONST,cadr(v)): csvalue() ;
 	set_lfree(slfree);
 	checksym(RPAR);
 	conv->switch_body_();
-	cslabel = control = 0;
+	if (cst) {
+	    gen_jmp( cslabel = fwdlabel());
+	} else {
+	    cslabel = control = 0;
+	}
     } else {
 	conv->switch_body_();
 	checksym(RPAR);
@@ -2407,19 +2414,33 @@
 	parse = list4(ST_SWITCH,pparse,v,reverse0(parse));
     } else {
 #if CASE_CODE
-	if (control) gen_jmp(blabel);
-	genswitch(cslist,cslabel);
+	if (!cst) {
+	    if (control) gen_jmp(blabel);
+	    genswitch(cslist,cslabel);
+	} else if (!cslist) {
+	    if(dlabel) {
+		def_label(cslabel,dlabel);
+		cslist=1;
+	    } else {
+	    // no matched value, but some statement may haave control
+	    if(pending_jmp!=cslabel)
+		fwddef(cslabel);
+	    else pending_jmp=0; // cslabel is here
+	    }
+	}
 #else
-	if(dlabel) def_label(cslabel,dlabel);
-	else fwddef(cslabel);
+	if (!(cst && cslit)) {
+	    if(dlabel) def_label(cslabel,dlabel);
+	    else fwddef(cslabel);
+	}
 #endif
 	free_glist2(csvalue1);
     }
     if (!inmode) {
+	fwddef(blabel);
 	csvalue1=svalue;
 	cslabel=scase;
 	dlabel=sdefault;
-	fwddef(blabel);
 	blabel=sbreak;
 	cslist = slist;
     }
@@ -2439,18 +2460,22 @@
 docase(void)
 {
 #if CASE_CODE
-    int l,clist=0,c;
-    if (!inmode)
+    int l,clist=0,c,cst = (car(csvalue1)==CONST);
+    if (!inmode && !cst)
 	l = fwdlabel();
     while(sym==CASE) {
 	conv->case_begin_(0,0);
 	getsym(0);
 	// we have to make it global?
 	c = cexpr(expr(1));
-	clist=glist3(c,clist,inmode?0:l);
+	if (!inmode && cst) 
+	    clist |= (cadr(csvalue1)==c);
+	else
+	    clist=glist3(c,clist,inmode?0:l);
 	conv->case_(0,0);
 	checksym(COLON);
     }
+    if (cst && !clist) return;
     if (inmode) {
 	parse = glist3(ST_CASE,parse,clist);
 	control=1;
@@ -2459,6 +2484,15 @@
     if (retpending) {
 	ret(); retpending=0;
     }
+    if (cst) {
+	if (cslist) {
+	    // error(CSERR);
+	    return; // duplicate value
+	}
+	cslist=1;
+	fwddef(cslabel);
+	return;
+    }
     if (!cslabel) {
 	if (!control) {
 	    // immediate after switch(i) (usual case)
@@ -2487,8 +2521,9 @@
     control=1;
 #else
     /* casading branch implementation */
-    int c,l,slfree;
-    if (!inmode) {
+    int c,clist,l,slfree;
+    int cst = (car(csvalue1)==CONST);
+    if (!inmode && !cst) {
 	if (retpending) { 
 	    ret(); retpending=0;
 	}
@@ -2500,27 +2535,48 @@
     while(sym==CASE) {
 	conv->case_begin_(c,0);
 	getsym(0);
-	c=list2(cexpr(expr(1)),c);
-	conv->case_(c,0);
+	c=cexpr(expr(1));
+	if (!inmode && cst)
+	    clist |= (c==cadr(csvalue1));
+	else
+	    clist=list2(c,clist);
+	conv->case_(clist,0);
 	checksym(COLON);
     }
     if (inmode) {
 	parse = list3(ST_CASE,parse,clist);
 	control=1;
 	return;
-    } else {
-	l=fwdlabel();
+    } 
+    if (cst && ! clist) {
+	set_lfree(slfree);
+	return;
     }
+    if (cst) {
+	if (!cslist) {
+	    if (retpending) { 
+		ret(); retpending=0;
+	    }
+	    fwddef(cslabel);
+	    cslist=1;
+	}
+	set_lfree(slfree);
+	return;
+    }
+    if (retpending) { 
+	ret(); retpending=0;
+    }
+    l=fwdlabel();
     if (control) {
 	control=0;
 	gen_jmp(l);
     }
     if (cslabel) fwddef(cslabel);
-    while(cadr(c)) {
-	cmpdimm(car(c),csvalue1,l,0);
-	c=cadr(c);
+    while(cadr(clist)) {
+	cmpdimm(car(clist),csvalue1,l,0);
+	clist=cadr(clist);
     }
-    cmpdimm(car(c),csvalue1,cslabel=fwdlabel(),1);
+    cmpdimm(car(clist),csvalue1,cslabel=fwdlabel(),1);
     if (l) fwddef(l);
     set_lfree(slfree);
     /* control==1? */
@@ -2530,6 +2586,7 @@
 static void
 dodefault(void)
 {
+    // int cst = (car(csvalue1)==CONST); we cannot ommit this...
     control=1;
     checkret();
     getsym(0);
--- a/mc.h	Sat Jan 07 02:00:06 2006 +0900
+++ b/mc.h	Sat Jan 07 12:46:38 2006 +0900
@@ -467,6 +467,7 @@
 #define INERR   28
 #define AGERR   29
 #define ILERR   30
+#define CSERR   31
 
 /* error number end */
 
--- a/test/bitfield1.c	Sat Jan 07 02:00:06 2006 +0900
+++ b/test/bitfield1.c	Sat Jan 07 12:46:38 2006 +0900
@@ -81,103 +81,103 @@
 main1()
 {
     int i;
-    printf("#0079:%d\n",a.i);
+    printf("#0083:%d\n",a.i);
 
      ll1.b.v = -1;
-     printf("#0082:01:%llx\n",ll1.b.v);
-     printf("#0083:02:"); for(i=0;i<32;i++) printf("#0082:%02x",ll1.a[i]); printf("#0082:\n");
+     printf("#0086:01:%llx\n",ll1.b.v);
+     printf("#0087:02:"); for(i=0;i<32;i++) printf("#0082:%02x",ll1.a[i]); printf("#0082:\n");
      ll1.b.v = 0;
      ll1.b.w = -1;
-     printf("#0086:02:"); for(i=0;i<32;i++) printf("#0085:%02x",ll1.a[i]); printf("#0085:\n");
+     printf("#0090:02:"); for(i=0;i<32;i++) printf("#0085:%02x",ll1.a[i]); printf("#0085:\n");
      ll1.b.w = 0;
      ll1.b.x = -1;
-     printf("#0089:02:"); for(i=0;i<32;i++) printf("#0088:%02x",ll1.a[i]); printf("#0088:\n");
+     printf("#0093:02:"); for(i=0;i<32;i++) printf("#0088:%02x",ll1.a[i]); printf("#0088:\n");
 
      ll0.b.v = -1;
-     printf("#0092:01:%llx\n",ll0.b.v);
-     printf("#0093:02:"); for(i=0;i<32;i++) printf("#0092:%02x",ll0.a[i]); printf("#0092:\n");
+     printf("#0096:01:%llx\n",ll0.b.v);
+     printf("#0097:02:"); for(i=0;i<32;i++) printf("#0092:%02x",ll0.a[i]); printf("#0092:\n");
      ll0.b.v = 0;
      ll0.b.w = -1;
-     printf("#0096:02:"); for(i=0;i<32;i++) printf("#0095:%02x",ll0.a[i]); printf("#0095:\n");
+     printf("#0100:02:"); for(i=0;i<32;i++) printf("#0095:%02x",ll0.a[i]); printf("#0095:\n");
      ll0.b.w = 0;
      ll0.b.x = -1;
-     printf("#0099:02:"); for(i=0;i<32;i++) printf("#0098:%02x",ll0.a[i]); printf("#0098:\n");
+     printf("#0103:02:"); for(i=0;i<32;i++) printf("#0098:%02x",ll0.a[i]); printf("#0098:\n");
 
      ll.b.v = -1;
-     printf("#0102:1:%llx\n",ll.b.v);
-     printf("#0103:02:"); for(i=0;i<32;i++) printf("#0102:%02x",ll.a[i]); printf("#0102:\n");
+     printf("#0106:1:%llx\n",ll.b.v);
+     printf("#0107:02:"); for(i=0;i<32;i++) printf("#0102:%02x",ll.a[i]); printf("#0102:\n");
      ll.b.v = 0;
      ll.b.w = -1;
-     printf("#0106:02:"); for(i=0;i<32;i++) printf("#0105:%02x",ll.a[i]); printf("#0105:\n");
+     printf("#0110:02:"); for(i=0;i<32;i++) printf("#0105:%02x",ll.a[i]); printf("#0105:\n");
      ll.b.w = 0;
      ll.b.x = -1;
-     printf("#0109:02:"); for(i=0;i<32;i++) printf("#0108:%02x",ll.a[i]); printf("#0108:\n");
+     printf("#0113:02:"); for(i=0;i<32;i++) printf("#0108:%02x",ll.a[i]); printf("#0108:\n");
 
-     printf("#0111:char a:1; char b:4; char c:7; char d:4; char e:4; char f:4;\n");
+     printf("#0115:char a:1; char b:4; char c:7; char d:4; char e:4; char f:4;\n");
      cc.b.a = -1;
-     printf("#0113:a:%08x\n",cc.a);
+     printf("#0117:a:%08x\n",cc.a);
      cc.b.b = -1;
-     printf("#0115:b:%08x\n",cc.a);
+     printf("#0119:b:%08x\n",cc.a);
      cc.b.c = -1;
-     printf("#0117:c:%08x\n",cc.a);
+     printf("#0121:c:%08x\n",cc.a);
      cc.b.d = -1;
-     printf("#0119:d:%08x\n",cc.a);
+     printf("#0123:d:%08x\n",cc.a);
      cc.b.e = -1;
-     printf("#0121:e:%08x\n",cc.a);
+     printf("#0125:e:%08x\n",cc.a);
      cc.b.f = -1;
-     printf("#0123:f:%08x\n",cc.a);
-     printf("#0124:3:%d %d\n",cc.b.c,cc.b.d);
+     printf("#0127:f:%08x\n",cc.a);
+     printf("#0128:3:%d %d\n",cc.b.c,cc.b.d);
      cc.a = -1;
-     printf("#0126:f:%08x\n",cc.a);
+     printf("#0130:f:%08x\n",cc.a);
      cc.b.a = 0;
-     printf("#0128:a:%08x\n",cc.a);
+     printf("#0132:a:%08x\n",cc.a);
      cc.b.b = 0;
-     printf("#0130:b:%08x\n",cc.a);
+     printf("#0134:b:%08x\n",cc.a);
      cc.b.c = 0;
-     printf("#0132:c:%08x\n",cc.a);
+     printf("#0136:c:%08x\n",cc.a);
      cc.b.d = 0;
-     printf("#0134:d:%08x\n",cc.a);
+     printf("#0138:d:%08x\n",cc.a);
      cc.b.e = 0;
-     printf("#0136:e:%08x\n",cc.a);
+     printf("#0140:e:%08x\n",cc.a);
      cc.b.f = 0;
-     printf("#0138:f:%08x\n",cc.a);
-     printf("#0139:3:%d %d\n",cc.b.c,cc.b.d);
+     printf("#0142:f:%08x\n",cc.a);
+     printf("#0143:3:%d %d\n",cc.b.c,cc.b.d);
      cc.a = 0;
-     printf("#0141:f:%08x\n",cc.a);
+     printf("#0145:f:%08x\n",cc.a);
      cc.b.a = 1;
-     printf("#0143:a:%08x\n",cc.a);
+     printf("#0147:a:%08x\n",cc.a);
      cc.b.b = 1;
-     printf("#0145:b:%08x\n",cc.a);
+     printf("#0149:b:%08x\n",cc.a);
      cc.b.c = 1;
-     printf("#0147:c:%08x\n",cc.a);
+     printf("#0151:c:%08x\n",cc.a);
      cc.b.d = 1;
-     printf("#0149:d:%08x\n",cc.a);
+     printf("#0153:d:%08x\n",cc.a);
      cc.b.e = 1;
-     printf("#0151:e:%08x\n",cc.a);
+     printf("#0155:e:%08x\n",cc.a);
      cc.b.f = 1;
-     printf("#0153:f:%08x\n",cc.a);
-     printf("#0154:3:%d %d\n",cc.b.c,cc.b.d);
+     printf("#0157:f:%08x\n",cc.a);
+     printf("#0158:3:%d %d\n",cc.b.c,cc.b.d);
      cc.a = -1;
-     printf("#0156:f:%08x\n",cc.a);
+     printf("#0160:f:%08x\n",cc.a);
      cc.b.a = 1;
-     printf("#0158:a:%08x\n",cc.a);
+     printf("#0162:a:%08x\n",cc.a);
      cc.b.b = 1;
-     printf("#0160:b:%08x\n",cc.a);
+     printf("#0164:b:%08x\n",cc.a);
      cc.b.c = 1;
-     printf("#0162:c:%08x\n",cc.a);
+     printf("#0166:c:%08x\n",cc.a);
      cc.b.d = 1;
-     printf("#0164:d:%08x\n",cc.a);
+     printf("#0168:d:%08x\n",cc.a);
      cc.b.e = 1;
-     printf("#0166:e:%08x\n",cc.a);
+     printf("#0170:e:%08x\n",cc.a);
      cc.b.f = 1;
-     printf("#0168:f:%08x\n",cc.a);
-     printf("#0169:3:%d %d\n",cc.b.c,cc.b.d);
+     printf("#0172:f:%08x\n",cc.a);
+     printf("#0173:3:%d %d\n",cc.b.c,cc.b.d);
 
      ii.b.a = -1;
-     printf("#0172:6:%08x\n",ii.a);
+     printf("#0176:6:%08x\n",ii.a);
      ii.b.d = -1;
-     printf("#0174:6:%08x\n",ii.a);
-     printf("#0175:5:%d %d\n",ii.b.a,ii.b.d);
+     printf("#0178:6:%08x\n",ii.a);
+     printf("#0179:5:%d %d\n",ii.b.a,ii.b.d);
 
     main5();
     return 0;
@@ -189,13 +189,13 @@
     int i,j,bit=1;
     for(i=0;i<32;i++,bit<<=1) {
 	ii.a = bit;
-	printf("#0187:%08x:ii.b.a=%d ii.b.b=%d ii.b.c=%d ii.b.d=%d ii.b.e=%d ii.b.f=%d\n",bit,
+	printf("#0191:%08x:ii.b.a=%d ii.b.b=%d ii.b.c=%d ii.b.d=%d ii.b.e=%d ii.b.f=%d\n",bit,
 		ii.b.a,ii.b.b,ii.b.c,ii.b.d,ii.b.e,ii.b.f);
     }
     bit=1;
     for(i=0;i<32;i++,bit<<=1) {
 	cc.a = bit;
-	printf("#0193:%08x:cc.b.a=%d cc.b.b=%d cc.b.c=%d cc.b.d=%d cc.b.e=%d cc.b.f=%d\n",bit,
+	printf("#0197:%08x:cc.b.a=%d cc.b.b=%d cc.b.c=%d cc.b.d=%d cc.b.e=%d cc.b.f=%d\n",bit,
 		cc.b.a,cc.b.b,cc.b.c,cc.b.d,cc.b.e,cc.b.f);
     }
     ll.a[0]=ll.a[1]=ll.a[2]=ll.a[3]= ll.a[4]=ll.a[5]=ll.a[6]=ll.a[7]=0;
@@ -204,11 +204,11 @@
     bit=1;
 	for(j=0;j<32;j++,bit<<=1) {
 	    ll.a[i] = bit;
-	     printf("#0202:02:%02x %02x %02x %02x %02x %02x %02x %02x\n",
+	     printf("#0206:02:%02x %02x %02x %02x %02x %02x %02x %02x\n",
 		ll.a[0],ll.a[1],ll.a[2],ll.a[3],
 		ll.a[4],ll.a[5],ll.a[6],ll.a[7]
 	      );
-	    printf("#0206: ll.b.v=%lld ll.b.w=%lld ll.b.x=%lld\n",ll.b.v,ll.b.w,ll.b.x);
+	    printf("#0210: ll.b.v=%lld ll.b.w=%lld ll.b.x=%lld\n",ll.b.v,ll.b.w,ll.b.x);
 	}
 	ll.a[i]=0;
     }
--- a/test/inline.c	Sat Jan 07 02:00:06 2006 +0900
+++ b/test/inline.c	Sat Jan 07 12:46:38 2006 +0900
@@ -6,12 +6,12 @@
 static const char haa[] = "test";
 static inline const int f(int k);
 
-volatile const int i = 3;
 
 extern int printf(char *,...);
 inline int
 main0()
 {
+    volatile const int i = 3;
     volatile const int j = 3;
     switch(i) {
     case 1: printf("#0016:1\n"); break;
@@ -21,9 +21,30 @@
     }
     switch(j) {
     case 1: printf("#0022:1\n"); break;
-    case 2: printf("#0023:2\n"); break;
-    case 3: printf("#0024:3\n"); break;
-    case 4: printf("#0025:4\n"); break;
+    default:
+    case 2: printf("#0024:2\n"); break;
+    case 3: printf("#0025:3\n"); break;
+    case 4: printf("#0026:4\n"); break;
+    }
+    return 0;
+}
+
+inline int
+main3()
+{
+    const int i = 3;
+    const int j = 3;
+    switch(i) {
+    case 1: printf("#0037:1\n"); break;
+    case 2: printf("#0038:2\n"); break;
+    case 3: printf("#0039:3\n"); break;
+    case 4: printf("#0040:4\n"); break;
+    }
+    switch(j) {
+    case 1: printf("#0043:1\n"); break;
+    case 2: printf("#0044:2\n"); break;
+    case 3: printf("#0045:3\n"); break;
+    case 4: printf("#0046:4\n"); break;
     }
     return 0;
 }
@@ -31,18 +52,41 @@
 int
 main1()
 {
+    volatile const int i = 3;
     volatile const int j = 3;
     switch(i) {
-    case 1: printf("#0035:1\n"); break;
-    case 2: printf("#0036:2\n"); break;
-    case 3: printf("#0037:3\n"); break;
-    case 4: printf("#0038:4\n"); break;
+    case 1: printf("#0057:1\n"); break;
+    case 2: printf("#0058:2\n"); break;
+    case 3: printf("#0059:3\n"); break;
+    case 4: printf("#0060:4\n"); break;
     }
     switch(j) {
-    case 1: printf("#0041:1\n"); break;
-    case 2: printf("#0042:2\n"); break;
-    case 3: printf("#0043:3\n"); break;
-    case 4: printf("#0044:4\n"); break;
+    case 1: printf("#0063:1\n"); break;
+    case 2: printf("#0064:2\n"); break;
+    case 3: printf("#0065:3\n"); break;
+    case 4: printf("#0066:4\n"); break;
+    }
+    return 0;
+}
+
+int
+main2()
+{
+    const int j = 3;
+    const int i = 3;
+    switch(a) {
+    case 1: printf("#0077:1\n"); break;
+    default:
+    case 2: printf("#0079:2\n"); break;
+    case 3: printf("#0080:3\n"); break;
+    case 5: printf("#0081:4\n"); break;
+    }
+    switch(j) {
+    case 1: printf("#0084:1\n"); break;
+    default:
+    case 2: printf("#0085:2\n"); break;
+    case 3: printf("#0086:3\n"); break;
+    case 4: printf("#0087:4\n"); break;
     }
     return 0;
 }
@@ -64,7 +108,7 @@
 static
 inline int ins(const int i,const int j)
 {
-   printf("#0066:%d %d\n",i,j);
+   printf("#0109:%d %d\n",i,j);
    if (f(i)>j) return j;
    else return i;
 }
@@ -72,7 +116,7 @@
 static
 inline int ins1(const int i,const int j, const int k)
 {
-   printf("#0074:%d %d %d\n",i,j,k);
+   printf("#0117:%d %d %d\n",i,j,k);
    if (f(i)>j) return j;
    else return i;
 }
@@ -86,14 +130,14 @@
 	k += 3;
 	order <<= 4; order|=7;
     } while ( k < j);
-    printf("#0088: %d do %d %x\n",p,k,order);
+    printf("#0131: %d do %d %x\n",p,k,order);
 
     while (k > j) {
 	order <<= 4; order|=0;
 	k -= 3;
 	order <<= 4; order|=7;
     } 
-    printf("#0095: %d while %d %x\n",p,k,order);
+    printf("#0138: %d while %d %x\n",p,k,order);
 
     m = 0;
     for(k=0;k<j;k++) {
@@ -109,9 +153,9 @@
 	    m += k;
 	    order <<= 4; order|=10;
 	}
-	printf("#0111: %x\n",order);
+	printf("#0154: %x\n",order);
     }
-    printf("#0113: %d for %d\n",p,m);
+    printf("#0156: %d for %d\n",p,m);
 
 
     switch(i) {
@@ -125,13 +169,13 @@
 	break;
     default: k = 5;
     }
-    printf("#0127: %d switch %d\n",p,k);
+    printf("#0170: %d switch %d\n",p,k);
 
     for(k=0;k<j;k++) {
 	i += k;
 	if (k<3) continue;
     }
-    printf("#0133: %d for %d\n",p,i);
+    printf("#0176: %d for %d\n",p,i);
     goto hoge;
 hage:
     goto hage;
@@ -152,27 +196,27 @@
     // a = 10;
 
     k1 = in1(a,b);
-    printf("#0154:%d %d %d\n",a,b,k1);
+    printf("#0197:%d %d %d\n",a,b,k1);
     j1 = in1(k,j-6)+f(k1);
-    printf("#0156:%d %d %s\n",k1,j1,hoo);
+    printf("#0199:%d %d %s\n",k1,j1,hoo);
     k1 = &v-&x>0? &v-&x : &x-&v;
-    printf("#0158:v-x: %d\n",k1);
+    printf("#0201:v-x: %d\n",k1);
 
     k1 = ins(a,b);
     j1 = ins(k,j-6)+f(k1);
-    printf("#0162:%d %d %s\n",k1,j1,haa);
+    printf("#0205:%d %d %s\n",k1,j1,haa);
 
     k1 = ins(as,bs);
     j1 = ins(k,j-6)+f(k1);
-    printf("#0166:%d %d %s\n",k1,j1,haa);
+    printf("#0209:%d %d %s\n",k1,j1,haa);
 
     k1 = ins(v,x);
     j1 = ins(k,j-6)+f(v);
-    printf("#0170:%d %d %s\n",k1,j1,haa);
+    printf("#0213:%d %d %s\n",k1,j1,haa);
 
     k1 = fnp(v,x,5);
     j1 = ins1(k,j-6,6)+f(v);
-    printf("#0174:%d %d %s\n",k1,j1,haa);
+    printf("#0217:%d %d %s\n",k1,j1,haa);
 }
 
 void
@@ -191,13 +235,13 @@
 static
 inline int order(int a0,int a1,int a2, int a3, int a4)
 {
-    printf("#0193:order  %d %d %d %d %d\n",a0,a1,a2,a3,a4);
+    printf("#0236:order  %d %d %d %d %d\n",a0,a1,a2,a3,a4);
 }
 
 static
 inline int order1(int a0,int a1,int a2, int a3, int a4)
 {
-    printf("#0199:orderp %d %d %d %d %d\n",a0,a1,a2,a3,a4);
+    printf("#0242:orderp %d %d %d %d %d\n",a0,a1,a2,a3,a4);
 }
 
 int (*order1p)(int a0,int a1,int a2, int a3, int a4) = order1;
@@ -220,7 +264,7 @@
 main(int ac,char *av[])
 {
      fnp = ins1;
-     printf("#0222:%d\n",(1,2,3,4,5));
+     printf("#0265:%d\n",(1,2,3,4,5));
      order(1,2,3,4,5);
      order1p(1,2,3,4,5);
      a0(5,6);
@@ -230,6 +274,8 @@
      main0(ac,av);
      main1(ac,av);
      inmain(ac,av);
+     main2(ac,av);
+     main3(ac,av);
      return 0;
 }
 
--- a/test/offset.c	Sat Jan 07 02:00:06 2006 +0900
+++ b/test/offset.c	Sat Jan 07 12:46:38 2006 +0900
@@ -16,15 +16,15 @@
 int local_large[BIT16];
 
 #if 0
-    printf("#0017:int ac =\t%x\n",&ac);
-    printf("#0018:int midium[0] =\t%x\n",&midium[0]);
-    printf("#0019:int midium[BIT12] =\t%x\n",&midium[BIT12]);
-    printf("#0020:int large[0] =\t%x\n",&large[0]);
-    printf("#0021:int large[BIT16] =\t%x\n",&large[BIT16]);
-    printf("#0022:int local_midium[0] =\t%x\n",&local_midium[0]);
-    printf("#0023:int local_midium[BIT12] =\t%x\n",&local_midium[BIT12]);
-    printf("#0024:int local_large[0] =\t%x\n",&local_large[0]);
-    printf("#0025:int local_large[BIT16] =\t%x\n",&local_large[BIT16]);
+    printf("#0018:int ac =\t%x\n",&ac);
+    printf("#0019:int midium[0] =\t%x\n",&midium[0]);
+    printf("#0020:int midium[BIT12] =\t%x\n",&midium[BIT12]);
+    printf("#0021:int large[0] =\t%x\n",&large[0]);
+    printf("#0022:int large[BIT16] =\t%x\n",&large[BIT16]);
+    printf("#0023:int local_midium[0] =\t%x\n",&local_midium[0]);
+    printf("#0024:int local_midium[BIT12] =\t%x\n",&local_midium[BIT12]);
+    printf("#0025:int local_large[0] =\t%x\n",&local_large[0]);
+    printf("#0026:int local_large[BIT16] =\t%x\n",&local_large[BIT16]);
 #endif
 
   midium[0]=0x55;
@@ -47,25 +47,25 @@
   local_midium[BIT12-1]=0xaa;
   local_large[BIT16-1]=0xaa;
 
-   printf("#0048:%x\n", midium[0]);
-   printf("#0049:%x\n", large[0]);
-   printf("#0050:%x\n", local_midium[0]);
-   printf("#0051:%x\n", local_large[0]);
+   printf("#0049:%x\n", midium[0]);
+   printf("#0050:%x\n", large[0]);
+   printf("#0051:%x\n", local_midium[0]);
+   printf("#0052:%x\n", local_large[0]);
 
-   printf("#0053:%x\n", midium[BIT8]);
-   printf("#0054:%x\n", large[BIT8]);
-   printf("#0055:%x\n", local_midium[BIT8]);
-   printf("#0056:%x\n", local_large[BIT8]);
+   printf("#0054:%x\n", midium[BIT8]);
+   printf("#0055:%x\n", large[BIT8]);
+   printf("#0056:%x\n", local_midium[BIT8]);
+   printf("#0057:%x\n", local_large[BIT8]);
 
-   printf("#0058:%x\n", midium[BIT10]);
-   printf("#0059:%x\n", large[BIT10]);
-   printf("#0060:%x\n", local_midium[BIT10]);
-   printf("#0061:%x\n", local_large[BIT10]);
+   printf("#0059:%x\n", midium[BIT10]);
+   printf("#0060:%x\n", large[BIT10]);
+   printf("#0061:%x\n", local_midium[BIT10]);
+   printf("#0062:%x\n", local_large[BIT10]);
 
-   printf("#0063:%x\n", midium[BIT12-1]);
-   printf("#0064:%x\n", large[BIT16-1]);
-   printf("#0065:%x\n", local_midium[BIT12-1]);
-   printf("#0066:%x\n", local_large[BIT16-1]);
+   printf("#0064:%x\n", midium[BIT12-1]);
+   printf("#0065:%x\n", large[BIT16-1]);
+   printf("#0066:%x\n", local_midium[BIT12-1]);
+   printf("#0067:%x\n", local_large[BIT16-1]);
 
    p = local_large+BIT16;
 
@@ -75,11 +75,11 @@
    p[-(BIT12-1)] = 0xdd;
    p[-(BIT16-1)] = 0xee;
 
-   printf("#0076:%x\n", p[-1]);
-   printf("#0077:%x\n", p[-BIT8]);
-   printf("#0078:%x\n", p[-BIT10]);
-   printf("#0079:%x\n", p[-(BIT12-1)]);
-   printf("#0080:%x\n", p[-(BIT16-1)]);
+   printf("#0077:%x\n", p[-1]);
+   printf("#0078:%x\n", p[-BIT8]);
+   printf("#0079:%x\n", p[-BIT10]);
+   printf("#0080:%x\n", p[-(BIT12-1)]);
+   printf("#0081:%x\n", p[-(BIT16-1)]);
 
    p = large+BIT16;
 
@@ -89,11 +89,11 @@
    p[-(BIT12-1)] = 0xdd;
    p[-(BIT16-1)] = 0xee;
 
-   printf("#0090:%x\n", p[-1]);
-   printf("#0091:%x\n", p[-BIT8]);
-   printf("#0092:%x\n", p[-BIT10]);
-   printf("#0093:%x\n", p[-(BIT12-1)]);
-   printf("#0094:%x\n", p[-(BIT16-1)]);
+   printf("#0091:%x\n", p[-1]);
+   printf("#0092:%x\n", p[-BIT8]);
+   printf("#0093:%x\n", p[-BIT10]);
+   printf("#0094:%x\n", p[-(BIT12-1)]);
+   printf("#0095:%x\n", p[-(BIT16-1)]);
 
 
     for(p=local_midium;p<&local_midium[BIT12];p++) *p = p-local_midium;
@@ -111,7 +111,7 @@
     
     main0(ac,av);
 
-    printf("#0111:%d %d %d %d\n",ac,i,j,k);
+    printf("#0113:%d %d %d %d\n",ac,i,j,k);
     return 0;
 }
 
--- a/test/putenemy.c	Sat Jan 07 02:00:06 2006 +0900
+++ b/test/putenemy.c	Sat Jan 07 12:46:38 2006 +0900
@@ -49,16 +49,16 @@
 void
 Putenemy(int charno,float x,float y,float sx,float sy,int move) {
      if(x)
-          printf("#0004:%d %f %f %f %f %d\n",charno,x,y,sx,sy,move);
+          printf("#0051:%d %f %f %f %f %d\n",charno,x,y,sx,sy,move);
      else
-          printf("#0006:check\n");
+          printf("#0053:check\n");
 }
 int
 main()
 {
      int ix=32,iy=32; float fx=32,fy=32;
      sankakuf();
-     printf("%d %d\n", Mysin(45),Mycos(-30));
+     printf("#0060:%d %d\n", Mysin(45),Mycos(-30));
      {
          float x=10,y=20;
          Putenemy(3,x,y,(float) Mysin(15)*2/SANKAKU,(float)Mycos(15)*2/SANKAKU,0);
--- a/test/stralign.c	Sat Jan 07 02:00:06 2006 +0900
+++ b/test/stralign.c	Sat Jan 07 12:46:38 2006 +0900
@@ -87,23 +87,23 @@
 main()
 {
 
-    printf("%d\n",  jiki. x);
-    printf("%d\n",  jiki. y);
-    printf("%d\n",  jiki. ch);
-    printf("%d\n",  jiki. point);
-    printf("%d\n",  jiki.  bf);
-    printf("%d\n",  jiki. muteki);
-    printf("%d\n",  jiki. zanki);
-    printf("%d\n",  jiki. ccount);
+    printf("#0089:%d\n",  jiki. x);
+    printf("#0090:%d\n",  jiki. y);
+    printf("#0091:%d\n",  jiki. ch);
+    printf("#0092:%d\n",  jiki. point);
+    printf("#0093:%d\n",  jiki.  bf);
+    printf("#0094:%d\n",  jiki. muteki);
+    printf("#0095:%d\n",  jiki. zanki);
+    printf("#0096:%d\n",  jiki. ccount);
 
-    printf("%g\n",    laser_lv3[0].x);
-    printf("%g\n",    laser_lv3[0].y);
-    printf("%g\n",    laser_lv3[0].sx);
-    printf("%g\n",    laser_lv3[0].sy);
-    printf("%d\n",    laser_lv3[0].r);
-    printf("%d\n",    laser_lv3[0].enemyno);
+    printf("#0098:%g\n",    laser_lv3[0].x);
+    printf("#0099:%g\n",    laser_lv3[0].y);
+    printf("#0100:%g\n",    laser_lv3[0].sx);
+    printf("#0101:%g\n",    laser_lv3[0].sy);
+    printf("#0102:%d\n",    laser_lv3[0].r);
+    printf("#0103:%d\n",    laser_lv3[0].enemyno);
 
-    printf("%d\n",    lg.stg);
+    printf("#0105:%d\n",    lg.stg);