changeset 440:a531bbf572e3

regression test (case, float, long long)
author kono
date Sat, 20 Nov 2004 17:06:05 +0900
parents 65e379ba36b8
children 1edaa643458e
files Changes Makefile mc-code-arm.c mc-code-ia32.c mc-code-mips.c mc-code-powerpc.c mc-codegen.c mc-parse.c mc-parse.h test/code-gen.c
diffstat 10 files changed, 312 insertions(+), 211 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Nov 15 20:58:58 2004 +0900
+++ b/Changes	Sat Nov 20 17:06:05 2004 +0900
@@ -6650,7 +6650,7 @@
 code hoge1() { b; }
  
 では、a-> b に、そのまま落ちるべきだろうね。ファイルが分離される
-場合は少し困るが....
+場合は少し困るが.... 型が合わない場合にエラーを出さないと。
 
 if (0) hoge; でhogeが生成されてしまう。control で切っても出るね。
 いや、消えてました。ただ、jmp は生成されてしまうね。checkret
@@ -6666,3 +6666,19 @@
 
 if (1) hoge else fuga ; で fuga が生成されてしまう。bexpr で
 always jump かどうかを返したいところだが...
+
+Mon Nov 15 21:25:15 JST 2004
+
+構造的にはさ、inline は、CbC の外で行われるべきものだよね。
+内部で処理してもいいんだけど、本来は外でやるべきものです。
+
+gcov は面白い!
+
+Sat Nov 20 16:44:38 JST 2004
+
+古いswitchの実装が壊れている。lazy jump の影響らしい。
+
+PowerPC が cmp immideate value を出力してない
+
+あれ、複数のファイルをコンパイルするときの問題があったような
+気がするんだが...
--- a/Makefile	Mon Nov 15 20:58:58 2004 +0900
+++ b/Makefile	Sat Nov 20 17:06:05 2004 +0900
@@ -1,6 +1,8 @@
 CC = gcc
 # -O3
 CFLAGS = -g -Wall -I.
+# CFLAGS = -g -Wall -I. -pg -fprofile-arcs -ftest-coverage
+# LDFLAGS = -pg
 # for Linux Zaurus
 # CFLAGS = -fsigned-char -pipe -g -I. -I/home/zaurus/develop/include
 BASE=0
@@ -31,16 +33,16 @@
 		conv/conv.h conv/convdef.h conv/null.c
 
 mc-powerpc : mc-code-powerpc.o $(COMPLIB) $(CONVERTER)
-	$(CC) -g mc-code-powerpc.o $(COMPLIB) $(CONVERTER) -o $@
+	$(CC) $(LDFLAGS) -g mc-code-powerpc.o $(COMPLIB) $(CONVERTER) -o $@
 
 mc-ia32 : mc-code-ia32.o $(COMPLIB) $(CONVERTER)
-	$(CC) -g mc-code-ia32.o $(COMPLIB) $(CONVERTER) -o $@
+	$(CC) $(LDFLAGS) -g mc-code-ia32.o $(COMPLIB) $(CONVERTER) -o $@
 
 mc-mips : mc-code-mips.o $(COMPLIB) $(CONVERTER)
-	$(CC) -g mc-code-mips.o $(COMPLIB) $(CONVERTER) -o $@
+	$(CC) $(LDFLAGS) -g mc-code-mips.o $(COMPLIB) $(CONVERTER) -o $@
 
 mc-arm : mc-code-arm.o $(COMPLIB) $(CONVERTER)
-	$(CC) -g mc-code-arm.o $(COMPLIB) $(CONVERTER) -o $@
+	$(CC) $(LDFLAGS) -g mc-code-arm.o $(COMPLIB) $(CONVERTER) -o $@
 
 conv/conv.h: conv_func.tbl conv_func.pl
 	perl conv_func.pl
--- a/mc-code-arm.c	Mon Nov 15 20:58:58 2004 +0900
+++ b/mc-code-arm.c	Sat Nov 20 17:06:05 2004 +0900
@@ -53,10 +53,9 @@
 static void dconst(int l,int h,double value);
 static void code_assign_input_double_long(int e1,int e2) ;
 static void code_assign_input_float_int(int e1,int e2) ;
+#endif
 static void use_input_reg(int reg,int mode);
 
-#endif
-
 static int creg;
 static int output_mode = TEXT_EMIT_MODE;
 static int register_save_return_label;
@@ -213,7 +212,7 @@
     return i;
 }
 
-#if LONGLONG_CODE
+#if LONGLONG_CODE||FLOAT_CODE
 #define  use_longlong(reg) if (reg==USE_CREG) reg=use_longlong0()
 
 static
@@ -237,6 +236,9 @@
 static void lmove(int to,int from);
 #endif
 
+#define USING_DREG 5
+#define INPUT_DREG 6
+
 
 #if FLOAT_CODE
 
@@ -258,9 +260,6 @@
     return i;
 }
 
-#define USING_DREG 5
-#define INPUT_DREG 6
-
 static
 int use_double0() { 
     int i;
@@ -272,6 +271,19 @@
     creg = i;
     return i;
 }
+
+void code_lassign_lvar(int e2,int creg);
+int code_lrindirect(int e1, int reg, int offset, int us);
+void code_lregister(int e2,int reg);
+void code_lassign_gvar(int e2,int creg);
+void code_lassign(int e2,int creg);
+void code_lassign_lregister(int e2,int reg);
+void code_lrgvar(int e1,int creg);
+void code_lrlvar(int e1,int creg);
+void emit_lpop_free(int xreg);
+void emit_lpush();
+int emit_lpop();
+
 #endif
 
 
@@ -284,9 +296,13 @@
 static void code_save_stacks();
 static void code_save_input_registers(int dots);
 static void    set_ireg(int,int);
+#if FLOAT_CODE
 static void    set_dreg(int,int);
 static void    set_freg(int,int);
+#endif
+#if LONGLONG_CODE
 static void    set_lreg(int,int);
+#endif
 static void inc_inst(int count);
 
 static int max_func_args;
@@ -1250,6 +1266,7 @@
     return i;
 }
 
+#if FLOAT_CODE
 static int
 search_double_const(int tag,int value1,int value2,int *label)
 {
@@ -1288,6 +1305,7 @@
     }
     return i;
 }
+#endif
 
 static void
 const_list_table()
@@ -1769,14 +1787,18 @@
 }
 
 static int rexpr_bool(int e1, int reg);
+#if LONGLONG_CODE
 static int lrexpr_bool(int e1, int reg);
+#endif
 
 void
 code_bool(int e1,int reg) {
     int e2,e3;
     char *xrn;
     if (rexpr_bool(e1, reg)) return;
+#if LONGLONG_CODE
     if (lrexpr_bool(e1, reg)) return;
+#endif
     b_expr(e1,1,e2=fwdlabel(),1);  /* including > < ... */
     if (use) {
 	inc_inst(2);
@@ -2052,6 +2074,7 @@
     creg = freg = reg;
 }
 
+#if LONGLONG_CODE||FLOAT_CODE
 static void
 set_lreg0(int reg,int mode)
 {
@@ -2075,14 +2098,18 @@
     }
     creg = lreg = reg;
 }
-
+#endif
+
+#if LONGLONG_CODE
 static void
 set_lreg(int reg,int mode)
 {
     if (!is_longlong_reg(reg)) error(-1);
     set_lreg0(reg,mode);
 }
-
+#endif
+
+#if FLOAT_CODE
 static void
 set_dreg(int reg,int mode)
 {
@@ -2127,6 +2154,9 @@
      set_lreg_operand(reg,mode);
 }
 
+
+#endif
+
 void
 use_reg(int arg)
 {
@@ -2274,6 +2304,7 @@
 
 static void
 code_assign_input_float_int(int e1,int e2) {
+#if FLOAT_CODE
     int r,tmp=-1;
     float f;
     char *frn;
@@ -2299,10 +2330,12 @@
 	code_rlvar(tmp,r);
 	if (tmp!=-1) free_lvar(tmp);
     }
+#endif
 }
 
 static void
 code_assign_input_double_long(int e1,int e2) {
+#if FLOAT_CODE
     int r,tmp=-1,reg;
     double value;
     //  e1 = e2;
@@ -2328,6 +2361,7 @@
         printf("\tldmfd\tsp!, {%s, %s}\n",lregister_name_low(r),lregister_name_high(r));
     }
     if (tmp!=-1) free_lvar(tmp);
+#endif
 }
 
 static int
@@ -2639,13 +2673,19 @@
 	free_register(i);
     }
     if (ret_type==DOUBLE) {
+#if FLOAT_CODE
         set_dreg(RET_DREGISTER,0);
         use_reg(RET_DREGISTER);
+#endif
     } else if (ret_type==FLOAT) {
+#if FLOAT_CODE
         set_freg(RET_FREGISTER,0);
+#endif
     } else if (ret_type==ULONGLONG||ret_type==LONGLONG) {
+#if LONGLONG_CODE
         set_lreg(RET_LREGISTER,0);
         use_reg(RET_LREGISTER);
+#endif
     } else if (ret_type==VOID) {
     } else {
         set_ireg(RET_REGISTER,0);
@@ -2740,7 +2780,7 @@
 }
 #endif
 
-#if LONGLONG_CODE
+#if LONGLONG_CODE||FLOAT_CODE
 
 static void
 lload(int creg,int reg,int offset) 
@@ -3343,11 +3383,15 @@
 	retcont1 = fwdlabel();
 	fwddef(retcont);
 	if (cadr(fnptr->ty)==FLOAT) {
+#if FLOAT_CODE
 	    creg = freg = cadr(get_input_dregister_var(0,0,1,0));
 	    set_freg(RET_FREGISTER,1);
+#endif
 	} else if (cadr(fnptr->ty)==DOUBLE) {
+#if FLOAT_CODE
 	    creg = lreg = cadr(get_input_dregister_var(0,0,1,1));
 	    set_dreg(RET_DREGISTER,1);
+#endif
 	} else if (cadr(fnptr->ty)>0&&(
 	    car(cadr(fnptr->ty))==STRUCT ||
 	    car(cadr(fnptr->ty))==UNION)) {
@@ -3396,9 +3440,13 @@
     if (cadr(fnptr->ty)==FLOAT) {
 	set_freg(RET_FREGISTER,mode);
     } else if (cadr(fnptr->ty)==DOUBLE) {
+#if FLOAT_CODE
 	set_dreg(RET_DREGISTER,mode);
+#endif
     } else if (cadr(fnptr->ty)==LONGLONG||cadr(fnptr->ty)==ULONGLONG) {
+#if LONGLONG_CODE
 	set_lreg(RET_LREGISTER,mode);
+#endif
     } else if (cadr(fnptr->ty)==VOID) {
     } else {
 	set_ireg(RET_REGISTER,mode);
@@ -3408,9 +3456,13 @@
 int
 code_get_fixed_creg(int reg,int type) {
     switch(type) {
+#if FLOAT_CODE
     case DOUBLE: use_float(1,reg); break;
     case FLOAT:  use_float(0,reg); break;
+#endif
+#if LONGLONG_CODE
     case LONGLONG:  case ULONGLONG:  use_longlong(reg); break;
+#endif
     default:
         if (reg==USE_CREG) {
             if (regs[CREG_REGISTER]==0||regs[CREG_REGISTER]==PTRC_REG) {
@@ -3427,12 +3479,18 @@
 void
 code_set_fixed_creg(int reg,int mode,int type) {
     if (type==FLOAT) {
+#if FLOAT_CODE
 	set_freg(reg,mode);
+#endif
     } else if (type==DOUBLE) {
+#if FLOAT_CODE
 	set_dreg(reg,mode);
+#endif
     } else if (type==LONGLONG||type==ULONGLONG) {
+#if LONGLONG_CODE
 	set_lreg(reg,mode);
 	// use_reg(reg);
+#endif
     } else {
 	set_ireg(reg,mode);
     }
@@ -3687,6 +3745,7 @@
 
 #define lib_args(max) if (max_func_args<max) max_func_args=max
 
+#if LONGLONG_CODE||FLOAT_CODE
 static void
 extern_conv(char *conv)
 {
@@ -3697,6 +3756,7 @@
      printf("\tbl\t%s\n",conv);
      lib_args(16);
 }
+#endif
 
 static void
 code_int_lib(char *lib,int reg,int oreg)
@@ -4875,29 +4935,6 @@
     return l1;
 }
 
-int
-emit_lpop()
-{
-    int xreg,reg;
-    xreg=lreg_stack[--lreg_sp];
-    if (xreg<= -REG_LVAR_OFFSET) {
-        reg = get_lregister();
-        code_lrlvar(REG_LVAR_OFFSET+xreg,reg);
-        free_lvar(REG_LVAR_OFFSET+xreg);
-        xreg = reg;
-    }
-    return xreg;
-}
-
-void
-code_lregister(int e2,int reg)
-{
-    use_longlong(reg);
-    if (reg!=e2) {
-	lmove(reg,e2);
-    }
-}
-
 void
 code_cmp_lregister(int reg,int label,int cond)
 {
@@ -4926,6 +4963,33 @@
     code_cmp_lregister(creg,label,cond);
 }
 
+#endif
+#if LONGLONG_CODE||FLOAT_CODE
+
+int
+emit_lpop()
+{
+    int xreg,reg;
+    xreg=lreg_stack[--lreg_sp];
+    if (xreg<= -REG_LVAR_OFFSET) {
+        reg = get_lregister();
+        code_lrlvar(REG_LVAR_OFFSET+xreg,reg);
+        free_lvar(REG_LVAR_OFFSET+xreg);
+        xreg = reg;
+    }
+    return xreg;
+}
+
+void
+code_lregister(int e2,int reg)
+{
+    use_longlong(reg);
+    if (reg!=e2) {
+	lmove(reg,e2);
+    }
+}
+
+
 void
 code_lassign(int e2,int creg)
 {
@@ -4977,6 +5041,60 @@
     }
 }
 
+void
+emit_lpop_free(int xreg)
+{
+    if (xreg>=0)
+        free_register(xreg);
+}
+
+void
+emit_lpush()
+{
+    int new_reg;
+    if (!is_longlong_reg(creg)) error(-1);
+    if (lreg_sp>MAX_MAX) error(-1);
+    new_reg = get_lregister();        /* 絶対に取れる(?) */
+    lreg_stack[lreg_sp++] = creg;     /* push するかわりにレジスタを使う */
+    lreg = creg = new_reg;
+}
+
+void
+code_lrgvar(int e1,int creg)
+{
+    int r;
+    char *crn_h;
+    char *crn_l;
+    use_longlong(creg);
+    crn_h = lregister_name_high(creg);
+    crn_l = lregister_name_low(creg);
+    r = get_ptr_cache((NMTBL*)caddr(e1));
+#if ENDIAN_L==0
+    code_ldf("ldr",crn_l,cadr(e1),r,"");
+    code_ldf("ldr",crn_h,cadr(e1)+SIZE_OF_INT,r,"");
+#else
+    code_ldf("ldr",crn_h,cadr(e1),r,"");
+    code_ldf("ldr",crn_l,cadr(e1)+SIZE_OF_INT,r,"");
+#endif
+}
+
+void
+code_lrlvar(int e1,int creg)
+{
+    char *crn_h;
+    char *crn_l;
+    use_longlong(creg);
+    crn_h = lregister_name_high(creg);
+    crn_l = lregister_name_low(creg);
+    inc_inst(2);
+    lvar_intro(e1);
+    printf("\tldr\t%s, ",crn_l); lvar(e1,"");
+    printf("\tldr\t%s, ",crn_h); lvar(e1+SIZE_OF_INT,"");
+}
+
+#endif
+#if LONGLONG_CODE
+
 static long long ll0 = 1LL;
 
 static int 
@@ -5019,39 +5137,6 @@
     printf("\trsc\t%s, %s, #0\n",rh,rh);
 }
 
-void
-code_lrgvar(int e1,int creg)
-{
-    int r;
-    char *crn_h;
-    char *crn_l;
-    use_longlong(creg);
-    crn_h = lregister_name_high(creg);
-    crn_l = lregister_name_low(creg);
-    r = get_ptr_cache((NMTBL*)caddr(e1));
-#if ENDIAN_L==0
-    code_ldf("ldr",crn_l,cadr(e1),r,"");
-    code_ldf("ldr",crn_h,cadr(e1)+SIZE_OF_INT,r,"");
-#else
-    code_ldf("ldr",crn_h,cadr(e1),r,"");
-    code_ldf("ldr",crn_l,cadr(e1)+SIZE_OF_INT,r,"");
-#endif
-}
-
-void
-code_lrlvar(int e1,int creg)
-{
-    char *crn_h;
-    char *crn_l;
-    use_longlong(creg);
-    crn_h = lregister_name_high(creg);
-    crn_l = lregister_name_low(creg);
-    inc_inst(2);
-    lvar_intro(e1);
-    printf("\tldr\t%s, ",crn_l); lvar(e1,"");
-    printf("\tldr\t%s, ",crn_h); lvar(e1+SIZE_OF_INT,"");
-}
-
 static void
 code_longlong_lib(char *lib,int reg,int oreg)
 {
@@ -5310,24 +5395,6 @@
 
 
 void
-emit_lpop_free(int xreg)
-{
-    if (xreg>=0)
-        free_register(xreg);
-}
-
-void
-emit_lpush()
-{
-    int new_reg;
-    if (!is_longlong_reg(creg)) error(-1);
-    if (lreg_sp>MAX_MAX) error(-1);
-    new_reg = get_lregister();        /* 絶対に取れる(?) */
-    lreg_stack[lreg_sp++] = creg;     /* push するかわりにレジスタを使う */
-    lreg = creg = new_reg;
-}
-
-void
 code_i2ll(int reg)
 {
     char *crn,*crn_h,*crn_l;
@@ -6016,13 +6083,14 @@
 code_bit_field(int type,int adr,int reg)
 {
     int sign,bitsz,l,align;
-    int bitsize,bitpos,lvalue;
+    int bitsize,bitpos;
     int i,size;
     set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l);
     size = bitsz/8;
 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
     /* this implementation returns -1 for int i:1; */
     if (l==1) {
+#if LONGLONG_CODE
 	// use_int(adr);
 	use_longlong(reg);
         lload(adr,reg,0);
@@ -6033,6 +6101,7 @@
 	if ((i=bitsz-bitsize)) 
 	    loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i));
     } else if (l==2) {   /* three int container */
+	int lvalue;
 	// use_int(adr);
 	use_longlong(reg);
 	lvalue = get_register(); 
@@ -6073,6 +6142,7 @@
 	loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i));
 	if (i<0||64<=i) error(-1);
 	free_register(adr);
+#endif
     } else {
 	// use_int(adr);
 	use_int(reg);
@@ -6107,16 +6177,17 @@
 extern void
 code_bit_replace(int adr,int value,int type)
 {
-    int sign,bitsz,l,align,i;
+    int sign,bitsz,l,align;
     int bitsize,bitpos;
     int mask = 0;
-    int tmp = -1,tmp2,lvalue,size;
-    int tmpvar = -1;
+    int tmp = -1,lvalue,size;
     char *crn,*lrn,*trn;
     set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l);
     size = bitsz/8;
 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
     if (l==1) {
+#if LONGLONG_CODE
+	int tmp2;
         // use_int(adr);
         lvalue = get_lregister();
 	tmp2 = get_register();
@@ -6145,6 +6216,8 @@
 	free_register(lvalue);
 	free_register(adr);
     } else if (l==2) {
+	int i;
+	int tmpvar;
         // use_int(adr);
 	use_longlong(value);
 	lvalue = get_register();
@@ -6192,6 +6265,7 @@
 	printf("\t%s\t%s, [%s, #8]\n",cstore(0),lrn,register_name(adr));
 	free_lvar(tmpvar);
 	free_register(adr);
+#endif
     } else {
 	// use_int(adr);
 	use_int(value);
@@ -6263,7 +6337,7 @@
     long long lc;
     int tmp;
 #endif
-    char *crn,*trn;
+    char *crn;
     set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l);
     size = bitsz/8;
 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
@@ -6291,6 +6365,7 @@
 	free_register(adr);
         free_register(lvalue);
     } else if (l==2) {  // three int container
+	char *trn;
 /*
                         hhhhhh  mmmmmmmmmmmm  lllllll
    lllll  00000000000  mmmmmmmmmmmm  0000000  hhhhhhh 
--- a/mc-code-ia32.c	Mon Nov 15 20:58:58 2004 +0900
+++ b/mc-code-ia32.c	Sat Nov 20 17:06:05 2004 +0900
@@ -946,7 +946,9 @@
 }
 
 static int rexpr_bool(int e1,int reg);
+#if FLOAT_CODE
 static int drexpr_bool(int e1,int reg);
+#endif
 
 void
 code_bool(int e1,int reg) {
@@ -3522,6 +3524,7 @@
 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
     /* this implementation returns -1 for int i:1; */
     if (l==1) {
+#if LONGLONG_CODE
 	use_int(adr);
 	use_longlong(reg);
 	lload(adr,0,reg);
@@ -3531,6 +3534,7 @@
 	/* shift right */
 	if ((i=bitsz-bitsize)) 
 	    loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i));
+#endif
     } else {
 	use_int(adr);
 	use_int(reg);
@@ -3582,11 +3586,13 @@
     int sign,bitsz,l,align;
     int bitsize,bitpos;
     int mask = 0;
-    int size,push=0;
+    int size;
     set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l);
     size = bitsz/8;
 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
     if (l) {
+#if LONGLONG_CODE
+	int push=0;
 	use_int(adr);
 	use_longlong(value);
 	/* shift left */
@@ -3615,6 +3621,7 @@
 		    l_eax(value), register_name(adr,0));
 	}
 	if (push) printf("\taddl %%sp,$4\n");
+#endif
     } else {
 	use_int(adr);
 	use_int(value);
--- a/mc-code-mips.c	Mon Nov 15 20:58:58 2004 +0900
+++ b/mc-code-mips.c	Sat Nov 20 17:06:05 2004 +0900
@@ -194,7 +194,7 @@
     return i;
 }
 
-#if LONGLONG_CODE
+#if LONGLONG_CODE||FLOAT_CODE
 #define  use_longlong(reg) if (reg==USE_CREG) reg=use_longlong0()
 
 static
@@ -218,6 +218,9 @@
 static void lmove(int to,int from);
 #endif
 
+#define USING_DREG 5
+#define INPUT_DREG 6
+
 
 #if FLOAT_CODE
 #define  use_float(d,reg) if (reg==USE_CREG) reg=d?use_double0():use_float0()
@@ -235,9 +238,6 @@
     return i;
 }
 
-#define USING_DREG 5
-#define INPUT_DREG 6
-
 static
 int use_double0() { 
     int i;
@@ -260,10 +260,23 @@
 static void code_double_lib(char *lib,int to,int reg,int oreg);
 static void code_double_lib_c(char *lib,int from,int to,double value);
 
+void code_lassign_lvar(int e2,int creg);
+int code_lrindirect(int e1, int reg, int offset, int us);
+void code_lregister(int e2,int reg);
+void code_lassign_gvar(int e2,int creg);
+void code_lassign(int e2,int creg);
+void code_lassign_lregister(int e2,int reg);
+void code_lrgvar(int e1,int creg);
+void code_lrlvar(int e1,int creg);
+void emit_lpop_free(int xreg);
+void emit_lpush();
+int emit_lpop();
+
 #endif
 #if LONGLONG_CODE
 static int code_l1(long long ll);
 static int code_l2(long long ll);
+static void    set_lreg(int,int);
 #endif
 
 static void code_save_stacks();
@@ -271,7 +284,6 @@
 static void    set_ireg(int,int);
 static void    set_dreg(int,int);
 static void    set_freg(int,int);
-static void    set_lreg(int,int);
 
 static int max_func_args;
 static int my_func_args;
@@ -1708,6 +1720,8 @@
     regs[regv_h(reg)]=USING_DREG;
 }
 
+#if FLOAT_CODE
+
 static void
 set_lreg_operand(int reg,int mode)
 {
@@ -1718,31 +1732,13 @@
     }
 }
 
-/*
-static void
-set_lreg_operand1(int reg,int mode)
-{
-    // save_stack,clear_ptr_cache is assumed    
-    if (!is_longlong_reg(reg)) { error(-1); return; }
-    if (mode) {
-	lmove(LREGISTER_OPERAND_1,reg);
-    }
-}
- */
-
 static void
 set_dreg_operand(int reg,int mode)
 {
      set_lreg_operand(reg,mode);
 }
 
-/*
-static void
-set_dreg_operand1(int reg,int mode)
-{
-     set_lreg_operand1(reg,mode);
-}
- */
+#endif
 
 void
 use_reg(int arg)
@@ -1911,6 +1907,7 @@
 
 static void
 code_assign_input_float_int(int e0) {
+#if FLOAT_CODE
     int e1 = cadr(e0);
     int e2 = caddr(e0);
     int r;
@@ -1936,6 +1933,7 @@
     case FREGISTER:
 	printf("\tmfc1 %s,%s\n",frn,fregister_name(freg));
     }
+#endif
 }
 
 static int
@@ -2341,7 +2339,7 @@
 }
 #endif
 
-#if LONGLONG_CODE
+#if LONGLONG_CODE||FLOAT_CODE
 
 static void
 lload(int creg,int reg,int offset) 
@@ -3152,9 +3150,13 @@
 int
 code_get_fixed_creg(int reg,int type) {
     switch(type) {
+#if FLOAT_CODE
     case DOUBLE: use_float(1,reg); break;
     case FLOAT:  use_float(0,reg); break;
+#endif
+#if LONGLONG_CODE
     case LONGLONG:  case ULONGLONG:  use_longlong(reg); break;
+#endif
     default: 
 	if (reg==USE_CREG) {
 	    if (regs[CREG_REGISTER]==0||regs[CREG_REGISTER]==PTRC_REG) {
@@ -3427,6 +3429,7 @@
 
 #define lib_args(max) if (max_func_args<max) max_func_args=max
 
+#if FLOAT_CODE||LONGLONG_CODE
 static void
 extern_conv(char *conv)
 {
@@ -3436,6 +3439,7 @@
      printf("\tjal %s\n",conv);
      lib_args(16);
 }
+#endif
 
 #if FLOAT_CODE
 
@@ -4266,20 +4270,6 @@
 
 /* 64bit int part */
 
-#if 0
-static int
-lcmp(int op,int cond)
-{
-    if (op==LOP+UGT||op==LOP+UGE) {
-	return UCMP;
-    } else if (op==LOP+LE||op==LOP+GE) {
-	return CMPGE;
-    } else {
-	return CMP;
-    }
-}
-#endif
-
 int
 lrexpr(int e1, int e2,int l1, int op,int cond)
 {
@@ -4321,23 +4311,8 @@
     return l1;
 }
 
-#if 0
-static
-int emit_lpop_regvar()
-{ 
-    int xreg,reg;
-    xreg=lreg_stack[--lreg_sp];
-    reg = cadr(get_lregister_var(0));
-    if (xreg<= -REG_LVAR_OFFSET) {
-        code_lrlvar(REG_LVAR_OFFSET+xreg,reg);
-        free_lvar(REG_LVAR_OFFSET+xreg);
-        xreg = reg;
-    } else {
-        code_lassign_lregister(reg,xreg);
-    }
-    return xreg;
-}
 #endif
+#if LONGLONG_CODE||FLOAT_CODE
 
 int
 emit_lpop()
@@ -4362,6 +4337,9 @@
     }
 }
 
+#endif
+#if LONGLONG_CODE
+
 void
 code_cmp_lregister(int reg,int label,int cond)
 {
@@ -4389,6 +4367,8 @@
     code_cmp_lregister(creg,label,cond);
 }
 
+#endif
+#if LONGLONG_CODE||FLOAT_CODE
 void
 code_lassign(int e2,int creg)
 {
@@ -4439,6 +4419,46 @@
     }
 }
 
+void
+code_lrgvar(int e1,int creg)
+{
+    int r;
+    char *crn_h;
+    char *crn_l;
+    use_longlong(creg);
+    crn_h = lregister_name_high(creg);
+    crn_l = lregister_name_low(creg);
+    r = get_ptr_cache((NMTBL*)caddr(e1));
+#if ENDIAN_L==0
+    code_ldf("lw",crn_l,cadr(e1),r);
+    code_ldf("lw",crn_h,cadr(e1)+SIZE_OF_INT,r);
+#else
+    code_ldf("lw",crn_h,cadr(e1),r);
+    code_ldf("lw",crn_l,cadr(e1)+SIZE_OF_INT,r);
+#endif
+}
+
+void
+code_lrlvar(int e1,int creg)
+{
+    char *crn_h;
+    char *crn_l;
+    use_longlong(creg);
+    crn_h = lregister_name_high(creg);
+    crn_l = lregister_name_low(creg);
+    lvar_intro(e1);
+#if ENDIAN_L==0
+    printf("\tlw %s,",crn_l); lvar(e1);
+    printf("\tlw %s,",crn_h); lvar(e1+SIZE_OF_INT);
+#else
+    printf("\tlw %s,",crn_h); lvar(e1);
+    printf("\tlw %s,",crn_l); lvar(e1+SIZE_OF_INT);
+#endif
+}
+
+#endif
+#if LONGLONG_CODE
+
 static long long ll0 = 1LL;
 
 static int 
@@ -4487,43 +4507,6 @@
     set_lreg(dreg,0);
 }
 
-void
-code_lrgvar(int e1,int creg)
-{
-    int r;
-    char *crn_h;
-    char *crn_l;
-    use_longlong(creg);
-    crn_h = lregister_name_high(creg);
-    crn_l = lregister_name_low(creg);
-    r = get_ptr_cache((NMTBL*)caddr(e1));
-#if ENDIAN_L==0
-    code_ldf("lw",crn_l,cadr(e1),r);
-    code_ldf("lw",crn_h,cadr(e1)+SIZE_OF_INT,r);
-#else
-    code_ldf("lw",crn_h,cadr(e1),r);
-    code_ldf("lw",crn_l,cadr(e1)+SIZE_OF_INT,r);
-#endif
-}
-
-void
-code_lrlvar(int e1,int creg)
-{
-    char *crn_h;
-    char *crn_l;
-    use_longlong(creg);
-    crn_h = lregister_name_high(creg);
-    crn_l = lregister_name_low(creg);
-    lvar_intro(e1);
-#if ENDIAN_L==0
-    printf("\tlw %s,",crn_l); lvar(e1);
-    printf("\tlw %s,",crn_h); lvar(e1+SIZE_OF_INT);
-#else
-    printf("\tlw %s,",crn_h); lvar(e1);
-    printf("\tlw %s,",crn_l); lvar(e1+SIZE_OF_INT);
-#endif
-}
-
 
 
 static void
@@ -4914,6 +4897,8 @@
     if (dx!=-1) free_register(dx);
 }
 
+#endif
+#if LONGLONG_CODE||FLOAT_CODE
 
 void
 emit_lpop_free(int xreg)
@@ -4933,6 +4918,9 @@
     lreg = creg = new_reg;
 }
 
+#endif
+#if LONGLONG_CODE
+
 void
 code_i2ll(int reg)
 {
@@ -5558,6 +5546,7 @@
 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
     /* this implementation returns -1 for int i:1; */
     if (l==1) {
+#if LONGLONG_CODE
 	use_int(adr);
 	use_longlong(reg);
         lload(adr,reg,0);
@@ -5567,6 +5556,7 @@
 	/* shift right */
 	if ((i=bitsz-bitsize)) 
 	    loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i));
+#endif
     } else {
 	use_int(adr);
 	use_int(reg);
@@ -5609,6 +5599,7 @@
     size = bitsz/8;
 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
     if (l) {
+#if LONGLONG_CODE
 	use_int(adr);
 	lvalue = get_lregister();
         lload(adr,lvalue,0);
@@ -5632,6 +5623,7 @@
 	    make_mask_and_or(mask,tmp,trn,crn,lrn);
 	}
         code_lassign(adr,value);
+#endif
     } else {
 	use_int(adr);
 	use_int(value);
--- a/mc-code-powerpc.c	Mon Nov 15 20:58:58 2004 +0900
+++ b/mc-code-powerpc.c	Sat Nov 20 17:06:05 2004 +0900
@@ -2274,6 +2274,7 @@
 }
 #endif
 
+#if LONGLONG_CODE
 static void
 lload(int creg,int reg,int offset)
 {
@@ -2300,7 +2301,6 @@
 #endif
 }
 
-#if LONGLONG_CODE
 int
 code_lrindirect(int e1, int reg, int offset, int us)
 {
@@ -5328,6 +5328,7 @@
 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
     /* this implementation returns -1 for int i:1; */
     if (l==1) {
+#if LONGLONG_CODE
 	// use_int(adr);
 	use_longlong(reg);
 	lload(adr,reg,0);
@@ -5337,6 +5338,7 @@
 	/* shift right */
 	if ((i=bitsz-bitsize)) 
 	    loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i));
+#endif
     } else {
 	// use_int(adr);
 	use_int(reg);
@@ -5384,6 +5386,7 @@
     size = bitsz/8;
 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
     if (l) {
+#if LONGLONG_CODE
 	// use_int(adr);
 	lvalue = get_lregister();
 	lload(adr,lvalue,0);
@@ -5409,6 +5412,7 @@
 	code_lassign(adr,value);
 	free_register(lvalue);
 	// free_register(adr);
+#endif
     } else {
 	// use_int(adr);
 	use_int(value);
--- a/mc-codegen.c	Mon Nov 15 20:58:58 2004 +0900
+++ b/mc-codegen.c	Sat Nov 20 17:06:05 2004 +0900
@@ -19,7 +19,9 @@
 int disp_align;
 
 static void assign(int e1);
+#if ASM_CODE
 static void gen_asm(int asm0,int in,int out,int opt,int e);
+#endif
 static void compatible(int t1, int t2);
 static int contains(int e,int type);
 static int contains_in_list(int e,int type);
@@ -1644,11 +1646,11 @@
 
 /* numerical type conversion */
 
+#if FLOAT_CODE
 static int
 double_value(int e2)
 {
     if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2);
-#if FLOAT_CODE
     switch(car(e2)) {
     case LCONST:
 #if LONGLONG_CODE
@@ -1670,9 +1672,6 @@
 	    else { error(TYERR); e2 =  dlist2(DCONST,1.0); }
 	}
     }
-#else
-    error(TYERR); type = DOUBLE; return list2(CONST,0);
-#endif
     type = DOUBLE;
     return e2;
 }
@@ -1682,7 +1681,6 @@
 {
     if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2);
     if (0) ;
-#if FLOAT_CODE
 #if LONGLONG_CODE
     else if (car(e2)==LCONST)  e2 =  dlist2(FCONST,(double)lcadr(e2));
 #endif
@@ -1700,19 +1698,17 @@
 	    else { error(TYERR); e2 =  dlist2(DCONST,1.0); }
 	}
     }
-#else
-    else { error(TYERR); e2 =  list2(CONST,0); }
-#endif
     type = FLOAT;
     return e2;
 }
+#endif
 
+#if LONGLONG_CODE
 static int
 longlong_value(int e2)
 {
     if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2);
     if (0) ;
-#if LONGLONG_CODE
     else if (car(e2)==CONST)  e2 = llist2(LCONST,(long long)cadr(e2));
     else if (car(e2)==LCONST) ;
 #if FLOAT_CODE
@@ -1731,9 +1727,6 @@
 	    else { error(TYERR); e2 = llist2(LCONST,0LL); }
 	}
     }
-#else
-    else { error(TYERR); e2 =  list2(CONST,0); }
-#endif
     type = LONGLONG;
     return e2;
 }
@@ -1743,7 +1736,6 @@
 {
     if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2);
     if (0);
-#if LONGLONG_CODE
     else if (car(e2)==CONST)  e2 = llist2(LCONST,(unsigned long long)cadr(e2));
     else if (car(e2)==LCONST)  ;
 #if FLOAT_CODE
@@ -1762,12 +1754,10 @@
 	    else { error(TYERR); e2 = llist2(LCONST,0LL); }
 	}
     }
-#else
-    else unsigned_value(e2);
-#endif
     type = ULONGLONG;
     return e2;
 }
+#endif
 
 static int
 int_value(int e2)
@@ -2479,9 +2469,13 @@
 	    bit_field_disp=sbit_f;   // default is 0, recover only here.
             //        type = list4(BIT_FIELD,value type,
             //            list3(store type,bit offset,bit_width));
+#if BIT_FIELD_CODE
 	    cadr(caddr(type)) = code_bit_field_disp(
 		type,&disp,&bit_field_disp,&sz);
 	    /* bit_field_disp is next bit posision */
+#else
+	    error(-1);
+#endif
 	}  else {
 	    sz = size(type);
 	}
@@ -2744,7 +2738,9 @@
     if (t>0&&car(t)==BIT_FIELD) {
 	sz = 0; 
 	bfd = cadr(caddr(t)); /* bit_field_disp */
+#if BIT_FIELD_CODE
 	code_bit_field_disp(t,&offset,&bfd,&sz);
+#endif
 	return offset+sz;
     }
     return offset+((t==EMPTY)?cadr(e):size(t));
@@ -3630,6 +3626,7 @@
     code_bit_field(t, reg, USE_CREG);
     use=1;
     if (lo) {
+#if LONGLONG_CODE
 	if (post) {
 	    n1 = list2(LVAR,new_lvar(size_of_longlong));
 	    code_lassign_lvar(cadr(n1),USE_CREG);
@@ -3643,6 +3640,9 @@
 	    g_expr(e3);
 	    code_register_lassop(USE_CREG,op+LOP);
 	}
+#else
+	error(TYERR);
+#endif
     } else {
 	if (post) {
 	    n1 = list2(LVAR,new_lvar(size_of_int));
--- a/mc-parse.c	Mon Nov 15 20:58:58 2004 +0900
+++ b/mc-parse.c	Sat Nov 20 17:06:05 2004 +0900
@@ -1947,6 +1947,7 @@
     cslist = slist;
 }
 
+#if CASE_CODE
 /* used in insert ascend */
 static int
 docase_eq()
@@ -1954,6 +1955,7 @@
     error(-1);  // duplicate case value
     return 0;   // remove duplicate value
 }
+#endif
 
 static void
 docase(void)
@@ -1968,7 +1970,9 @@
 	conv->case_(0,0);
 	checksym(COLON);
     }
-    if (retpending) { ret(); retpending=0; }
+    if (retpending) {
+	ret(); retpending=0;
+    }
     if (!cslabel) {
 	if (!control) {
 	    // immediate after switch(i) (usual case)
@@ -1999,7 +2003,9 @@
     /* casading branch implementation */
     int c,l,slfree;
     l = 0;
-    if (retpending) ret();
+    if (retpending) { 
+	ret(); retpending=0;
+    }
     slfree=lfree;
     c=0;
     while(sym==CASE) {
@@ -2009,9 +2015,10 @@
 	conv->case_(c,0);
 	checksym(COLON);
     }
+    l=fwdlabel();
     if (control) {
 	control=0;
-	gen_jmp(l=fwdlabel());
+	gen_jmp(l);
     }
     if (cslabel) fwddef(cslabel);
     while(cadr(c)) {
@@ -2518,8 +2525,8 @@
 	    return(list3(FPREINC,e,dir));
 	case DOUBLE:
 	    return(list3(DPREINC,e,dir));
+#endif
 	}
-#endif
 	if(integral(type))
 	    return(list4(PREINC,e,dir,size_of_int));
 	if(type>0 && car(type)==BIT_FIELD) {
--- a/mc-parse.h	Mon Nov 15 20:58:58 2004 +0900
+++ b/mc-parse.h	Sat Nov 20 17:06:05 2004 +0900
@@ -10,9 +10,7 @@
 extern int retlabel,retpending,retcont;
 extern int pending_jmp;
 extern int chk;
-#if BIT_FIELD_CODE
 extern int bit_field_disp;
-#endif
 extern int fields;
 extern int struct_return;
 extern int lastexp;
@@ -81,8 +79,7 @@
 extern void display_ntable(NMTBL *n, char *s);
 extern NMTBL * lsearch(char *name,int sc);
 #if FLOAT_CODE
-extern int
-dlist2(int e1, double d1);
+extern int dlist2(int e1, double d1);
 #endif
 extern void error(int n);
 extern int glist2(int e1,int e2);
--- a/test/code-gen.c	Mon Nov 15 20:58:58 2004 +0900
+++ b/test/code-gen.c	Sat Nov 20 17:06:05 2004 +0900
@@ -2762,6 +2762,7 @@
 	case 1234: printf("#2761:code_switch 1 nn %d\n",i); break;
 	case 2233: printf("#2762:code_switch 2 nn %d\n",i); break;
 	case 3333: printf("#2763:code_switch 3 nn %d\n",i);
+        case -200: return;
 	case -4: printf("#2764:code_switch 4 nn %d\n",i); break;
         case 733:
 	case -5: printf("#2766:code_switch 5 nn %d\n",i); break;