changeset 287:a0779a414855

*** empty log message ***
author kono
date Wed, 02 Jun 2004 14:29:30 +0900
parents 179e22f166ef
children ce7b4d90bc24
files Changes mc-code-ia32.c mc-code-mips.c mc-code-powerpc.c mc-code.h mc-codegen.c mc-codegen.h mc-parse.c
diffstat 8 files changed, 135 insertions(+), 128 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Wed Jun 02 13:19:13 2004 +0900
+++ b/Changes	Wed Jun 02 14:29:30 2004 +0900
@@ -4597,3 +4597,5 @@
    code_bool 
 では、rexpr,drexp を呼んだ方がいいんだけど... && || とかどうする
 かな。
+
+あーあ、なんか恥ずかしいミスが残っているね。
--- a/mc-code-ia32.c	Wed Jun 02 13:19:13 2004 +0900
+++ b/mc-code-ia32.c	Wed Jun 02 14:29:30 2004 +0900
@@ -182,6 +182,7 @@
 static void code_save_fstacks();
 #endif
 static void code_save_stacks();
+static void jcond(int l, char cond);
 
 #define use_int(reg)   if (reg==-1) reg=use_int0()
 static int use_int0() { lreg = 0; if (!is_int_reg(creg)) { creg = virtual(REG_EBX); regs[creg]=1;} return creg; }
@@ -854,43 +855,48 @@
 }
 
 void
-code_cmp_crgvar(int e1,int reg,int sz) {
+code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) {
     use_int(reg);
     if (sz==1)
 	printf("\tcmpb $0,%s\n",((NMTBL*)cadr(e1))->nm);
     else if (sz==SIZE_OF_SHORT)
 	printf("\tcmpw $0,%s\n",((NMTBL*)cadr(e1))->nm);
+    jcond(label,cond);
 }
 
 
 void
-code_cmp_crlvar(int e1,int reg,int sz) {
+code_cmp_crlvar(int e1,int reg,int sz,int label,int cond) {
     use_int(reg);
     if (sz==1)
 	printf("\tcmpb $0,%d(%%ebp)\n",lvar(e1));
     else if (sz==SIZE_OF_SHORT)
 	printf("\tcmpw $0,%d(%%ebp)\n",lvar(e1));
+    jcond(label,cond);
 }
 
 
 void
-code_cmp_rgvar(int e1,int reg) {
+code_cmp_rgvar(int e1,int reg,int label,int cond) {
     use_int(reg);
     printf("\tcmpl $0,%s\n",((NMTBL*)cadr(e1))->nm);
+    jcond(label,cond);
 }
 
 
 void
-code_cmp_rlvar(int e1,int reg) {
+code_cmp_rlvar(int e1,int reg,int label,int cond) {
     use_int(reg);
     printf("\tcmpl $0,%d(%%ebp)\n",lvar(e1));
+    jcond(label,cond);
 }
 
 
 void
-code_cmp_register(int e2) {
+code_cmp_register(int e2,int label,int cond) {
     use_int(e2);
     printf("\tcmpl $0,%s\n",register_name(e2,0));
+    jcond(label,cond);
 }
 
 
@@ -1569,12 +1575,13 @@
 }
 
 void
-code_cmpdimm(int e, int csreg)
+code_cmpdimm(int e, int csreg,int label,int cond)
 {
     /* used in dosiwtch() */
     if(chk) return;
     use_register(creg,csreg,0);
     printf("\tcmpl $%d,%s\n",e,register_name(creg,0));
+    jcond(label,cond);
 }
 
 void
@@ -1615,7 +1622,7 @@
 }
 
 
-void
+static void
 jcond(int l, char cond)
 {       
     if (chk) return;
@@ -2113,14 +2120,16 @@
     printf("\t%s %d(%%ebp)\n",fload(d),lvar(e2));
 }
 
-void code_cmp_drgvar(int e2,int reg,int d)
+void code_cmp_drgvar(int e2,int reg,int d,int label,int cond)
 { 
     printf("\tfcomp %s\n",((NMTBL*)cadr(e2))->nm);
+    jcond(label,cond);
 }
 
-void code_cmp_drlvar(int e2,int reg,int d)
+void code_cmp_drlvar(int e2,int reg,int d,int label,int cond)
 { 
     printf("\tfcomp %d(%%ebp)\n",lvar(e2));
+    jcond(label,cond);
 }
 
 void dtosop(int op,int reg,int e1)
@@ -2240,7 +2249,7 @@
 }
 
 void
-code_cmp_dregister(int e2,int d)
+code_cmp_dregister(int e2,int d,int label,int cond)
 {
     if (e2!=USE_CREG)
 	error(-1);
@@ -2249,6 +2258,7 @@
     printf("\tfnstsw\t%%ax\n");
     printf("\tandb\t$69,%%ah\n");
     printf("\txorb\t$64,%%ah\n");
+    jcond(label,cond);
 }
 
 int pop_fregister()
@@ -2401,7 +2411,7 @@
     }
 }
 
-void code_cmp_lregister(int reg)
+void code_cmp_lregister(int reg,int label,int cond)
 {
     char *crn;
     use_int(reg);
@@ -2409,9 +2419,10 @@
     printf("\tmovl %%esi,%s\n",crn);
     printf("\torl %%edi,%s\n",crn);
     printf("\ttestl %s,%s\n",crn,crn);
+    jcond(label,cond);
 }
 
-void code_cmp_lrgvar(int e1,int e2)
+void code_cmp_lrgvar(int e1,int e2,int label,int cond)
 {
     char *n,*crn;
     n = ((NMTBL*)cadr(e1))->nm;
@@ -2420,9 +2431,10 @@
     printf("\tmovl %s,%s\n",n,crn);
     printf("\torl  %s+4,%s\n",n,crn);
     printf("\ttestl %s,%s\n",crn,crn);
+    jcond(label,cond);
 }
 
-void code_cmp_lrlvar(int e1,int e2)
+void code_cmp_lrlvar(int e1,int e2,int label,int cond)
 {
     char *crn;
     use_int(e2);
@@ -2430,6 +2442,7 @@
     printf("\tmovl %d(%%ebp),%s\n",lvar(e1),crn);
     printf("\torl  %d(%%ebp),%s\n",lvar(e1)+4,crn);
     printf("\ttestl %s,%s\n",crn,crn);
+    jcond(label,cond);
 }
 
 void code_lassign(int e1,int e2)
--- a/mc-code-mips.c	Wed Jun 02 13:19:13 2004 +0900
+++ b/mc-code-mips.c	Wed Jun 02 14:29:30 2004 +0900
@@ -282,6 +282,8 @@
 static unsigned int code_fmask();
 static int code_fmask_offset();
 
+static void jcond(int l, char cond);
+
 #define ARG_LVAR_OFFSET 0x10000000
 
 #define round16(i)   ((i+0xf)&~0xf)
@@ -1364,7 +1366,7 @@
 
 
 void
-code_cmp_crgvar(int e1,int reg,int sz) {
+code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) {
     int r;
     char *crn;
     use_int(reg);
@@ -1374,11 +1376,12 @@
     cext(0,sz,r);
     cmpreg = reg;
     // printf("\tcmpwi cr0,%s,0\n",crn);
+    jcond(label,cond);
 }
 
 
 void
-code_cmp_crlvar(int e2,int reg, int sz) {
+code_cmp_crlvar(int e2,int reg, int sz,int label,int cond) {
     char *crn;
     use_int(reg);
     crn = register_name(reg);
@@ -1386,38 +1389,39 @@
     printf("\t%s %s,",cload(sz,0),crn);
     lvar(e2);
     cext(0,sz,reg);
-    code_cmp_register(reg);
+    code_cmp_register(reg,label,cond);
 }
 
 
 void
-code_cmp_rgvar(int e1,int reg) {
+code_cmp_rgvar(int e1,int reg,int label,int cond) {
     int r;
     char *crn;
     use_int(reg);
     crn = register_name(reg);
     r = get_ptr_cache((NMTBL*)cadr(e1));
     printf("\tlw %s,0(%s)\n",crn,register_name(r));
-    code_cmp_register(reg);
+    code_cmp_register(reg,label,cond);
 }
 
 
 void
-code_cmp_rlvar(int e2,int reg) {
+code_cmp_rlvar(int e2,int reg,int label,int cond) {
     char *crn;
     use_int(reg);
     crn = register_name(reg);
     lvar_intro(e2);
     printf("\tlw %s,",crn);
     lvar(e2);
-    code_cmp_register(reg);
+    code_cmp_register(reg,label,cond);
 }
 
 
 void
-code_cmp_register(int e2) {
+code_cmp_register(int e2,int label,int cond) {
     use_int(e2);
     cmpreg = e2;  // used by jcond,  beq $reg,$0,L_xx
+    jcond(label,cond);
 }
 
 
@@ -2662,7 +2666,7 @@
 static char * cmpreg_2;
 
 void
-code_cmpdimm(int e, int csreg)
+code_cmpdimm(int e, int csreg,int label,int cond)
 {
     /* used in dosiwtch() */
     int reg;
@@ -2675,6 +2679,7 @@
     cmpreg_2 = register_name(csreg);
     cmpreg=CMP_IMM;
     free_register(reg);
+    jcond(label,cond);
 }
 
 void
@@ -2781,7 +2786,7 @@
 
 #define CMP_C1T (-1)
 
-void
+static void
 jcond(int l, char cond)
 {       
     if (chk) return;
@@ -3323,7 +3328,7 @@
 static void dconst(int l,int h,double value);
 
 void
-code_cmp_dregister(int e2,int d)
+code_cmp_dregister(int e2,int d,int label,int cond)
 {
     char *grn,*frn;
     int greg;
@@ -3337,14 +3342,15 @@
         extern_conv("dpcmp");
 	set_dreg(RET_DREGISTER,0);
 	cmpreg = 2;
-	return;
+    } else {
+	grn =  register_name(greg = get_dregister(d));
+	frn = register_name(e2);
+	printf("\tmtc1 $0,%s\n",grn);
+	printf("\tc.eq.s %s,%s\n",grn,frn);
+	free_register(greg);
+	cmpreg = CMP_C1T;
     }
-    grn =  register_name(greg = get_dregister(d));
-    frn = register_name(e2);
-    printf("\tmtc1 $0,%s\n",grn);
-    printf("\tc.eq.s %s,%s\n",grn,frn);
-    free_register(greg);
-    cmpreg = CMP_C1T;
+    jcond(label,cond);
     return;
 }
 
@@ -3684,7 +3690,7 @@
 }
 
 void
-code_cmp_drgvar(int e2,int reg,int d)
+code_cmp_drgvar(int e2,int reg,int d,int label,int cond)
 { 
     int r;
     char *frn,*fr1;
@@ -3711,10 +3717,11 @@
 	cmpreg = CMP_C1T;
 	free_register(g);
     }
+    jcond(label,cond);
 }
 
 void
-code_cmp_drlvar(int e2,int reg,int d)
+code_cmp_drlvar(int e2,int reg,int d,int label,int cond)
 { 
     char *frn,*fr1;
     int g;
@@ -3738,6 +3745,7 @@
 	cmpreg = CMP_C1T;
 	free_register(g);
     }
+    jcond(label,cond);
 }
 
 static void
@@ -4240,30 +4248,30 @@
 }
 
 void
-code_cmp_lregister(int reg)
+code_cmp_lregister(int reg,int label,int cond)
 {
     use_longlong(reg);
     printf("\tor %s,%s,%s\n",
 		lregister_name_low(reg),
 		lregister_name_low(reg),
 		lregister_name_high(reg));
-    code_cmp_register(regv_l(reg));
+    code_cmp_register(regv_l(reg),label,cond);
 }
 
 void
-code_cmp_lrgvar(int e1,int creg)
+code_cmp_lrgvar(int e1,int creg,int label,int cond)
 {
     use_longlong(creg);
     code_lrgvar(e1,creg);
-    code_cmp_lregister(creg);
+    code_cmp_lregister(creg,label,cond);
 }
 
 void
-code_cmp_lrlvar(int e1,int creg)
+code_cmp_lrlvar(int e1,int creg,int label,int cond)
 {
     use_longlong(creg);
     code_lrlvar(e1,creg);
-    code_cmp_lregister(creg);
+    code_cmp_lregister(creg,label,cond);
 }
 
 void
@@ -4649,10 +4657,10 @@
     int v;
     if (car(e)==LCONST) {
 	if (!(-32766<lcadr(e)&&lcadr(e)<32767)) return 0;
-	v = lcaddr(e);
+	v = lcadr(e);
     } else if (car(e)==CONST) {
 	if (!(-32766<cadr(e)&&cadr(e)<32767)) return 0;
-	v = caddr(e);
+	v = cadr(e);
     } else return 0;
     
     switch(op) {
@@ -4691,27 +4699,24 @@
     case LLSHIFT:
     case LULSHIFT:
 	greg = get_register();
-	use_reg(greg);
 	grn = register_name(greg);
-	printf("\tsll %s,%s,%d\n",grn,crn_l,32-v);
-	printf("\tsrl %s,%s,%d\n",crn_h,crn_h,v);
-	printf("\tor %s,%s,%s\n",crn_h,grn,crn_h);
+	printf("\tsll %s,%s,%d\n",crn_h,crn_h,v);
+	printf("\tsrl %s,%s,%d\n",grn,crn_l,32-v);
+	printf("\tor %s,%s,%s\n",crn_h,crn_h,grn);
 	printf("\tsll %s,%s,%d\n",crn_l,crn_l,v);
 	free_register(greg);
 	return;
     case LRSHIFT:
 	greg = get_register();
-	use_reg(greg);
 	grn = register_name(greg);
-	printf("\tsrl %s,%s,%d\n",grn,crn_l,v);
+	printf("\tsrl %s,%s,%d\n",crn_l,crn_l,v);
 	printf("\tsll %s,%s,%d\n",grn,crn_h,32-v);
-	printf("\tor  %s,%s,%s\n",grn,grn,grn);
+	printf("\tor  %s,%s,%s\n",crn_l,crn_l,grn);
 	printf("\tsra %s,%s,%d\n",crn_h,crn_h,v);
 	free_register(greg);
 	return;
     case LURSHIFT:
 	greg = get_register();
-	use_reg(greg);
 	grn = register_name(greg);
 	printf("\tsll %s,%s,%d\n",grn,crn_h,32-v);
 	printf("\tsrl %s,%s,%d\n",crn_l,crn_l,v);
@@ -4735,7 +4740,7 @@
 	}
 	break;
     case LBOR:
-	printf("\tori %s,%s,lo16(%d)\n",crn_l,crn_l,v);
+	printf("\tori %s,%s,%d\n",crn_l,crn_l,v);
 	break;
     default:
 	error(-1);
--- a/mc-code-powerpc.c	Wed Jun 02 13:19:13 2004 +0900
+++ b/mc-code-powerpc.c	Wed Jun 02 14:29:30 2004 +0900
@@ -235,6 +235,7 @@
 static void    set_ireg(int,int);
 static void    set_freg(int,int);
 static void    set_lreg(int,int);
+static void jcond(int l, char cond);
 
 static int max_func_args;
 static int my_func_args;
@@ -1347,7 +1348,7 @@
 }
 
 void
-code_cmp_crgvar(int e1,int reg,int sz) {
+code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) {
     int r;
     char *crn;
     use_int(reg);
@@ -1356,11 +1357,12 @@
     printf("\t%s %s,0(%s)\n",cload(sz),crn,register_name(r));
     cext(0,sz,r);
     printf("\tcmpwi cr%d,%s,0\n",cmpflag,crn);
+    jcond(label,cond);
 }
 
 
 void
-code_cmp_crlvar(int e2,int reg, int sz) {
+code_cmp_crlvar(int e2,int reg, int sz,int label,int cond) {
     char *crn;
     use_int(reg);
     crn = register_name(reg);
@@ -1368,38 +1370,39 @@
     printf("\t%s %s,",cload(sz),crn);
     lvar(e2);
     cext(0,sz,reg);
-    code_cmp_register(reg);
+    code_cmp_register(reg,label,cond);
 }
 
 
 void
-code_cmp_rgvar(int e1,int reg) {
+code_cmp_rgvar(int e1,int reg,int label,int cond) {
     int r;
     char *crn;
     use_int(reg);
     crn = register_name(reg);
     r = get_ptr_cache((NMTBL*)cadr(e1));
     printf("\tlwz %s,0(%s)\n",crn,register_name(r));
-    code_cmp_register(reg);
+    code_cmp_register(reg,label,cond);
 }
 
 
 void
-code_cmp_rlvar(int e2,int reg) {
+code_cmp_rlvar(int e2,int reg,int label,int cond) {
     char *crn;
     use_int(reg);
     crn = register_name(reg);
     lvar_intro(e2);
     printf("\tlwz %s,",crn);
     lvar(e2);
-    code_cmp_register(reg);
+    code_cmp_register(reg,label,cond);
 }
 
 
 void
-code_cmp_register(int e2) {
+code_cmp_register(int e2,int label,int cond) {
     use_int(e2);
     printf("\tcmpwi cr%d,%s,0\n",cmpflag,register_name(e2));
+    jcond(label,cond);
 }
 
 
@@ -2511,11 +2514,12 @@
 }
 
 void
-code_cmpdimm(int e, int csreg)
+code_cmpdimm(int e, int csreg,int label,int cond)
 {
     /* used in dosiwtch() */
     if(chk) return;
     printf("\tcmpwi cr%d,%s,%d\n",cmpflag,register_name(csreg),e);
+    jcond(label,cond);
 }
 
 void
@@ -2549,7 +2553,7 @@
 }
 
 
-void
+static void
 jcond(int l, char cond)
 {       
     if (chk) return;
@@ -3034,7 +3038,7 @@
 }
 
 void
-code_cmp_dregister(int e2,int d)
+code_cmp_dregister(int e2,int d,int label,int cond)
 {
     char *frn,*rrn,*grn;
     int greg,r;
@@ -3047,6 +3051,7 @@
     printf("\tlfs %s,0(%s)\n",grn,rrn);
     printf("\tfcmpu cr%d,%s,%s\n",cmpflag,grn,frn);
     free_register(greg);
+    jcond(label,cond);
     return;
 }
 
@@ -3353,7 +3358,7 @@
 }
 
 void
-code_cmp_drgvar(int e2,int reg,int d)
+code_cmp_drgvar(int e2,int reg,int d,int label,int cond)
 { 
     int r;
     char *frn;
@@ -3367,10 +3372,11 @@
     printf("\t%s %s,0(%s)\n",fload(1),grn,register_name(r));
     printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
     free_register(g);
+    jcond(label,cond);
 }
 
 void
-code_cmp_drlvar(int e2,int reg,int d)
+code_cmp_drlvar(int e2,int reg,int d,int label,int cond)
 { 
     char *frn;
     int g=get_dregister(d);
@@ -3383,6 +3389,7 @@
     printf("\t%s %s,",fload(1),grn); lvar(e2);
     printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
     free_register(g);
+    jcond(label,cond);
 }
 
 void
@@ -3735,7 +3742,7 @@
 }
 
 void
-code_cmp_lregister(int reg)
+code_cmp_lregister(int reg,int label,int cond)
 {
     use_longlong(reg);
     printf("\tor %s,%s,%s\n",
@@ -3743,22 +3750,23 @@
 		lregister_name_low(reg),
 		lregister_name_high(reg));
     printf("\tcmpwi cr%d,%s,0\n",cmpflag,lregister_name_low(reg));
+    jcond(label,cond);
 }
 
 void
-code_cmp_lrgvar(int e1,int creg)
+code_cmp_lrgvar(int e1,int creg,int label,int cond)
 {
     use_longlong(creg);
     code_lrgvar(e1,creg);
-    code_cmp_lregister(creg);
+    code_cmp_lregister(creg,label,cond);
 }
 
 void
-code_cmp_lrlvar(int e1,int creg)
+code_cmp_lrlvar(int e1,int creg,int label,int cond)
 {
     use_longlong(creg);
     code_lrlvar(e1,creg);
-    code_cmp_lregister(creg);
+    code_cmp_lregister(creg,label,cond);
 }
 
 void
@@ -4226,10 +4234,10 @@
     int v;
     if (car(e)==LCONST) {
 	if (!(-32766<lcadr(e)&&lcadr(e)<32767)) return 0;
-	v = lcaddr(e);
+	v = lcadr(e);
     } else if (car(e)==CONST) {
 	if (!(-32766<cadr(e)&&cadr(e)<32767)) return 0;
-	v = caddr(e);
+	v = cadr(e);
     } else return 0;
     
     switch(op) {
--- a/mc-code.h	Wed Jun 02 13:19:13 2004 +0900
+++ b/mc-code.h	Wed Jun 02 14:29:30 2004 +0900
@@ -43,7 +43,7 @@
 extern void gexpr_code_init();
 extern int  code_csvalue();
 extern void code_gexpr(int e);
-extern void code_cmpdimm(int e, int csreg);
+extern void code_cmpdimm(int e, int csreg,int label,int cond);
 extern void code_gvar(int e1,int reg);
 extern void code_rgvar(int e1,int reg);
 extern void code_crgvar(int e1,int reg,int sign,int sz);
@@ -61,11 +61,11 @@
 extern void code_return(int reg);
 extern void code_environment(int reg);
 extern void code_bool(int e1,int reg);
-extern void code_cmp_crgvar(int e1,int reg,int sz);
-extern void code_cmp_crlvar(int e1,int reg,int sz);
-extern void code_cmp_rgvar(int e1,int reg);
-extern void code_cmp_rlvar(int e1,int reg);
-extern void code_cmp_register(int e2);
+extern void code_cmp_crgvar(int e1,int reg,int sz,int label,int cond);
+extern void code_cmp_crlvar(int e1,int reg,int sz,int label,int cond);
+extern void code_cmp_rgvar(int e1,int reg,int label,int cond);
+extern void code_cmp_rlvar(int e1,int reg,int label,int cond);
+extern void code_cmp_register(int e2,int label,int cond);
 extern void code_string(int e1,int reg);
 extern void emit_copy(int from,int  to,int length,int offset,int value,int det);
 extern int function(int e1);
@@ -94,7 +94,6 @@
 extern void code_opening(char *filename);
 extern void code_closing();
 extern void rexpr(int e1, int l1, int cond,int t);
-extern void jcond(int l, char cond);
 extern void jmp(int l);
 extern int code_get_fixed_creg(int reg,int type);
 extern void code_set_fixed_creg(int reg,int mode,int type);
@@ -113,9 +112,9 @@
 extern int dpop_register();
 extern int emit_dpop(int);
 extern void code_dregister(int e2,int reg,int d);
-extern void code_cmp_dregister(int,int);
-extern void code_cmp_drgvar(int,int,int);
-extern void code_cmp_drlvar(int,int,int);
+extern void code_cmp_dregister(int,int,int,int);
+extern void code_cmp_drgvar(int,int,int,int,int);
+extern void code_cmp_drlvar(int,int,int,int,int);
 extern void code_dassign(int,int,int);
 extern void code_dassign_gvar(int,int,int);
 extern void code_dassign_lvar(int,int,int);
@@ -153,9 +152,9 @@
 extern int lpop_register();
 extern int emit_lpop();
 extern void code_lregister(int e2,int reg);
-extern void code_cmp_lregister(int);
-extern void code_cmp_lrgvar(int,int);
-extern void code_cmp_lrlvar(int,int);
+extern void code_cmp_lregister(int,int,int);
+extern void code_cmp_lrgvar(int,int,int,int);
+extern void code_cmp_lrlvar(int,int,int,int);
 extern void code_lassign(int,int);
 extern void code_lassign_gvar(int,int);
 extern void code_lassign_lvar(int,int);
--- a/mc-codegen.c	Wed Jun 02 13:19:13 2004 +0900
+++ b/mc-codegen.c	Wed Jun 02 14:29:30 2004 +0900
@@ -543,53 +543,41 @@
 	if(!cond) fwddef(l2);
 	return;
     case CRGVAR: case CURGVAR:
-	code_cmp_crgvar(e1,USE_CREG,1);
-	jcond(l1,cond);
+	code_cmp_crgvar(e1,USE_CREG,1,l1,cond);
 	return;
     case SRGVAR: case SURGVAR:
-	code_cmp_crgvar(e1,USE_CREG,size_of_short);
-	jcond(l1,cond);
+	code_cmp_crgvar(e1,USE_CREG,size_of_short,l1,cond);
 	return;
     case CRLVAR: case CURLVAR:
-	code_cmp_crlvar(e2,USE_CREG,1);
-	jcond(l1,cond);
+	code_cmp_crlvar(e2,USE_CREG,1,l1,cond);
 	return;
     case SRLVAR: case SURLVAR:
-	code_cmp_crlvar(e2,USE_CREG,size_of_short);
-	jcond(l1,cond);
+	code_cmp_crlvar(e2,USE_CREG,size_of_short,l1,cond);
 	return;
     case RGVAR:
-	code_cmp_rgvar(e1,USE_CREG);
-	jcond(l1,cond);
+	code_cmp_rgvar(e1,USE_CREG,l1,cond);
 	return;
     case RLVAR:
-	code_cmp_rlvar(e2,USE_CREG);
-	jcond(l1,cond);
+	code_cmp_rlvar(e2,USE_CREG,l1,cond);
 	return;
 #if FLOATC_DOE
     case DRLVAR:
-	code_cmp_drlvar(e2,USE_CREG,1);
-	jcond(l1,cond);
+	code_cmp_drlvar(e2,USE_CREG,1,l1,cond);
 	return;
     case FRLVAR:
-	code_cmp_drlvar(e2,USE_CREG,0);
-	jcond(l1,cond);
+	code_cmp_drlvar(e2,USE_CREG,0,l1,cond);
 	return;
     case DRGVAR:
-	code_cmp_drgvar(e2,USE_CREG,1);
-	jcond(l1,cond);
+	code_cmp_drgvar(e2,USE_CREG,1,l1,cond);
 	return;
     case FRGVAR:
-	code_cmp_drgvar(e2,USE_CREG,0);
-	jcond(l1,cond);
+	code_cmp_drgvar(e2,USE_CREG,0,l1,cond);
 	return;
     case FREGISTER:
-	code_cmp_dregister(e2,0);
-	jcond(l1,cond);
+	code_cmp_dregister(e2,0,l1,cond);
 	return;
     case DREGISTER:
-	code_cmp_dregister(e2,1);
-	jcond(l1,cond);
+	code_cmp_dregister(e2,1,l1,cond);
 	return;
     case DCONST:
     case FCONST:
@@ -598,24 +586,20 @@
 #endif
 #if LONGLONG_DOE
     case LRLVAR:
-	code_cmp_lrlvar(e2,1);
-	jcond(l1,cond);
+	code_cmp_lrlvar(e2,1,l1,cond);
 	return;
     case LRGVAR:
-	code_cmp_lrgvar(e2,1);
-	jcond(l1,cond);
+	code_cmp_lrgvar(e2,1,l1,cond);
 	return;
     case LREGISTER:
-	code_cmp_lregister(e2,1);
-	jcond(l1,cond);
+	code_cmp_lregister(e2,1,l1,cond);
 	return;
     case LCONST:
 	if(control&&((lcadr(e2)!=0)^cond)) jmp(l1);
 	return;
 #endif
     case REGISTER:
-	code_cmp_register(e2);
-	jcond(l1,cond);
+	code_cmp_register(e2,l1,cond);
 	return;
     case CONST:
 	if(control&&((cond&&e2)||(!cond&&!e2))) jmp(l1);
@@ -628,17 +612,16 @@
 	if (0) ;
 #if FLOAT_CODE
 	else if(t==FLOAT)
-	    code_cmp_dregister(USE_CREG,0);
+	    code_cmp_dregister(USE_CREG,0,l1,cond);
 	else if(t==DOUBLE)
-	    code_cmp_dregister(USE_CREG,1);
+	    code_cmp_dregister(USE_CREG,1,l1,cond);
 #endif
 #if LONGLONG_CODE
 	else if(t==LONGLONG||t==ULONGLONG)
-	    code_cmp_lregister(USE_CREG);
+	    code_cmp_lregister(USE_CREG,l1,cond);
 #endif
 	else
-	    code_cmp_register(USE_CREG);
-	jcond(l1,cond);
+	    code_cmp_register(USE_CREG,l1,cond);
 	return;
     }
 }
@@ -1605,9 +1588,9 @@
 #endif 
 
 void 
-cmpdimm(int e, int csreg)
+cmpdimm(int e, int csreg,int label,int cond)
 {
-    code_cmpdimm(e, csreg);
+    code_cmpdimm(e, csreg,label,cond);
 }
 
 int 
--- a/mc-codegen.h	Wed Jun 02 13:19:13 2004 +0900
+++ b/mc-codegen.h	Wed Jun 02 14:29:30 2004 +0900
@@ -30,7 +30,7 @@
 extern void parallel_rassign(int list);
 
 extern int csvalue();
-extern void cmpdimm(int e, int csreg);
+extern void cmpdimm(int e, int csreg,int label,int cond);
 extern void code_enter(char *name) ;
 extern void code_enter1(int args);
 extern void code_init(void);
@@ -47,7 +47,6 @@
 extern void gen_source(char *s);
 extern int gexpr(int e1,int use);
 extern void gexpr_init(void);
-extern void jcond(int l, char cond);
 extern void jmp(int l);
 extern void jmp_eq_label(int l);
 extern void jmp_label(int l);
--- a/mc-parse.c	Wed Jun 02 13:19:13 2004 +0900
+++ b/mc-parse.c	Wed Jun 02 14:29:30 2004 +0900
@@ -1892,13 +1892,11 @@
     }
     if (cslabel) fwddef(cslabel);
     while(cadr(c)) {
-	cmpdimm(car(c),csvalue1);
-	jcond(l,0);
+	cmpdimm(car(c),csvalue1,l,0);
 	c=cadr(c);
     }
     lfree=slfree;
-    cmpdimm(car(c),csvalue1);
-    jcond(cslabel=fwdlabel(),1);
+    cmpdimm(car(c),csvalue1,cslabel=fwdlabel(),1);
     fwddef(l);
 }