diff mc-code-mips.c @ 287:a0779a414855

*** empty log message ***
author kono
date Wed, 02 Jun 2004 14:29:30 +0900
parents 912b54949344
children 55e611476cba
line wrap: on
line diff
--- 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);