changeset 153:33b39002ac58 mips-offset

MIPS continue
author kono
date Mon, 21 Jul 2003 15:13:37 +0900
parents 17c6598617f8
children 3edd10355434
files Changes mc-code-mips.c mc-code-powerpc.c
diffstat 3 files changed, 91 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sun Jul 20 16:45:09 2003 +0900
+++ b/Changes	Mon Jul 21 15:13:37 2003 +0900
@@ -3139,3 +3139,16 @@
 Mon Jul 14 14:25:23 JST 2003
 
 なんか unsigned が通らなくなっているみたい。
+
+Sun Jul 20 17:37:34 JST 2003
+
+やっぱり dictionary は、書き直さないとだめだよな。
+それに関して、heap も修正した方が良い。このコード
+はあんまりだものなぁ。
+
+さて、あとは、オフセットだけど... めんど...
+
+Mon Jul 21 15:12:56 JST 2003
+
+Frame pointer は使うの? 使った方がいいんじゃない?
+PowerPC は使わなかったけど。
--- a/mc-code-mips.c	Sun Jul 20 16:45:09 2003 +0900
+++ b/mc-code-mips.c	Mon Jul 21 15:13:37 2003 +0900
@@ -190,8 +190,9 @@
 
 static FILE *asi;
 
-int max_func_args;
-int my_func_args;
+static int max_func_args;
+static int max_func_iargs;
+static int my_func_args;
 #define ARG_LVAR_OFFSET 0x10000000
 
 #define DOT_SIZE 1
@@ -250,8 +251,8 @@
 #endif
     int lvar_offsetv = -disp+max_func_args*size_of_int+func_disp_offset;
     int r1_offsetv = -disp+max_func_args*size_of_int-reg_save+r1_offset;
-    printf(".set L_%d,%d\n",lvar_offset_label,lvar_offsetv);
-    printf(".set L_%d,%d\n",r1_offset_label,r1_offsetv);
+    printf("L_%d = %d\n",lvar_offset_label,lvar_offsetv);
+    printf("L_%d = %d\n",r1_offset_label,r1_offsetv);
 #if 0
 printf("# function %s\n",fnptr->nm);
     l = ARG_LVAR_OFFSET;
@@ -487,7 +488,7 @@
     for(i=0;i<freg_sp;i++) {
 	if ((reg=freg_stack[i])>=0) {
             code_dassign_lvar(
-                (freg_stack[i]=new_lvar(size_of_float)),reg,1); 
+                (freg_stack[i]=new_lvar(size_of_float)),reg,0); 
             freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
 	    return reg;
 	}
@@ -1448,6 +1449,7 @@
     NMTBL *fn = 0;
     int jmp = 0;
     char *jrn;
+    int iargs=0;
 
     special_lvar = -1;
     ret_type = cadr(cadddr(e1));
@@ -1500,7 +1502,7 @@
 	    use_var(arg); /* protect from input register free */
 	    reg_arg_list = list2(arg,reg_arg_list);
 	    g_expr_u(assign_expr0(arg,e4,t,t));
-	    nargs ++ ; reg_arg++;
+	    nargs ++ ; reg_arg++; iargs += size_of_int;
 	    continue;
 	} else if (t==DOUBLE||t==FLOAT) {
 	    if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
@@ -1519,10 +1521,12 @@
 	    g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */
 	    freg_arg++;
 	    nargs += size(t)/size_of_int;
+	    if (t==DOUBLE) iargs += size(t);
 	    continue;
 	} else if (car(t)==STRUCT||car(t)==UNION) {
 	    arg = list2(LVAR,caller_arg_offset_v(nargs));
 	    nargs += struct_push(e4,t,arg);
+	    iargs += ((size(t)+3)/size_of_int)*size_of_int;
 	    continue;
 	} else {
 	    error(TYERR);
@@ -1530,6 +1534,7 @@
 	++nargs;
     }
     if (max_func_args<nargs) max_func_args=nargs;
+    if (max_func_iargs<iargs) max_func_iargs=iargs;
     for(;arg_assign;arg_assign=cadr(arg_assign)) {
 	g_expr_u(car(arg_assign));
     }
@@ -1922,8 +1927,8 @@
 	text_mode();
     else
 	printf("\t.align 3\n");
-    if (stmode!=STATIC)
-	printf(".globl _%s\n",name);
+    /* if (stmode!=STATIC)
+	printf(".globl _%s\n",name); */
     printf(".ent %s\n",name);
     printf("_%s:\n",name);
     code_disp_label=fwdlabel();
@@ -1932,9 +1937,10 @@
     printf("\t.cpload $25\n");
     printf("\t.set reorder\n");
     printf("\tsubu $sp,$sp,L_%d\n",code_disp_label);
-    printf("\t.cprestore 16\n");
+    printf("\t.cprestore L_%d\n",cprestore_label);
 
     max_func_args = 0;
+    max_func_iargs = 0;
 }
 
 
@@ -1966,8 +1972,8 @@
 	text_mode();
     else
 	printf("\t.align 2\n");
-    if (stmode!=STATIC)
-	printf(".globl _%s\n",name);
+    /* if (stmode!=STATIC)
+	printf(".globl _%s\n",name); */
     printf(".ent %s\n",name);
     printf("_%s:\n",name);
 
@@ -1988,8 +1994,9 @@
     printf("\t.cpload $25\n");
     printf("\t.set reorder\n");
     printf("\tsubu $sp,$sp,L_%d\n",disp_label);
-    printf("\t.cprestore %d\n",cprestore_label);
+    printf("\t.cprestore L_%d\n",cprestore_label);
     max_func_args = 0;
+    max_func_iargs = 0;
 
 }
 
@@ -2001,15 +2008,33 @@
     set_dreg(DREG_DREGISTER,0);
 }
 
-int
-reg_save_offset()
+static unsigned int
+code_mask_label()
 {
-    return -(
-	(REAL_MAX_REGISTER-(REG_VAR_BASE-max_reg_var))*size_of_int+
-	(REAL_MAX_FREGISTER-(FREG_VAR_BASE-max_freg_var))*size_of_double
-	);
+    int i;
+    unsigned int mask=0;
+    for(i=0;i<32;i++) {
+	if (i==28||i==31||(REG_VAR_MIN<=i&&i<=REG_VAR_MIN+max_reg_var)) {
+	    mask |= (1<<i);
+	}
+    }
+    return mask;
 }
 
+static unsigned int
+code_fmask_label()
+{
+    int i;
+    unsigned int mask=0;
+    for(i=0;i<32;i++) {
+	if (FREG_VAR_MIN<=i&&i<=FREG_VAR_MIN+max_freg_var) {
+	    mask |= (1<<i);
+	}
+    }
+    return mask;
+}
+
+
 void
 leave(int control, char *name)
 {
@@ -2017,8 +2042,10 @@
     int r1_offsetv;
 
     if (max_freg_var>=0 && max_freg_var<=3) max_freg_var=3; 
-    reg_save = reg_save_offset();
-    freg_save = 0;
+    reg_save = 
+	(REAL_MAX_REGISTER-(REG_VAR_BASE-max_reg_var))*size_of_int;
+    freg_save = 
+	(REAL_MAX_FREGISTER-(FREG_VAR_BASE-max_freg_var))*size_of_float;
 
     if (control) {
 	code_set_return_register(1);
@@ -2057,11 +2084,11 @@
     }
     fprintf(asi,"L_%d=%d\n",r1_offset_label,0);
     fprintf(asi,"L_%d=%d\n",lvar_offset_label,0);
-    fprintf(asi,"L_%d=%d\n",mask_label,0);
+    fprintf(asi,"L_%d=0x%x\n",mask_label,code_mask_label());
     fprintf(asi,"L_%d=%d\n",mask1_label,0);
-    fprintf(asi,"L_%d=%d\n",fmask_label ,0);
+    fprintf(asi,"L_%d=0x%x\n",fmask_label ,code_fmask_label());
     fprintf(asi,"L_%d=%d\n",fmask1_label,0);
-    fprintf(asi,"L_%d=%d\n",cprestore_label ,0);
+    fprintf(asi,"L_%d=%d\n",cprestore_label ,max_func_iargs);
 
     disp &= -size_of_int;
     r1_offsetv = 0;
@@ -2121,7 +2148,7 @@
 gen_gdecl(char *n, int gpc)
 {
     if (stmode!=STATIC)
-	printf(".globl _%s\n",n); 
+	printf("\t.globl _%s\n",n); 
 }
 
 void 
@@ -2148,7 +2175,7 @@
     if (chk) return;
     if (n->dsp != -1) {
 	n->dsp = -1;   /* initiallized flag */
-	printf(".globl\t_%s\n",name);
+	/* printf(".globl\t_%s\n",name); */
 	data_mode(name);
 	align(t);
 	printf("_%s:\n",name); 
@@ -2171,7 +2198,7 @@
 	}
     } else if(t==DOUBLE) {       
         d = dcadr(e);
-        printf("\t.word\t0x%x\n\t.word\t0x%x\n",code_d2(d),code_d1(d));
+        printf("\t.word\t0x%x\n\t.word\t0x%x\n",code_d1(d),code_d2(d));
     } else if(t==FLOAT) {       
         f = dcadr(e);
         printf("\t.word\t0x%x\n",*(int *)&f);
@@ -2289,6 +2316,13 @@
     return d?"lfd":"lfs";
 }
 
+static
+void code_dpfunc(char *f)
+{
+    if (max_func_iargs<16) max_func_iargs=16;
+    printf("\tjal %s\n",f);
+}
+
 void
 code_cmp_dregister(int e2,int d)
 {
@@ -2299,7 +2333,8 @@
 	printf("\tli.d $6,%g\n",0.0);
         code_save_stacks();
 	move_dreg(4+DREG_OFFSET,freg);
-	printf("\tjal dpcmp\n");
+	code_dpfunc("dpcmp");
+        if (max_func_iargs<16) max_func_iargs=16;
         set_dreg(RET_DREGISTER,0);
 	return;
     } else {
@@ -2426,7 +2461,7 @@
     if (d) {
         code_save_stacks();
 	move_dreg(4+DREG_OFFSET,freg);
-        printf("\tjal dpneg\n");
+	code_dpfunc("dpneg");
         set_dreg(RET_DREGISTER,0);
     } else {
         frn = fregister_name(freg);
@@ -2438,7 +2473,7 @@
 { 
     code_save_stacks();
     set_dreg(RET_DREGISTER,1);
-    printf("\tjal dptoli\n");
+    code_dpfunc("dptoli");
     set_creg(RET_REGISTER,0);
     regv[freg]=0;
     regv[creg]=1;
@@ -2448,7 +2483,7 @@
 { 
     code_save_stacks();
     set_creg(RET_REGISTER,1);
-    printf("\tjal litodp\n");
+    code_dpfunc("litodp");
     set_dreg(RET_DREGISTER,0);
     regv[freg]=1;
     regv[creg]=0;
@@ -2458,7 +2493,7 @@
 { 
     code_save_stacks();
     set_dreg(RET_DREGISTER,1);
-    printf("\tjal dptoul\n");
+    code_dpfunc("dptoul");
     set_creg(RET_REGISTER,0);
     regv[freg]=1;
 }
@@ -2467,7 +2502,7 @@
 { 
     code_save_stacks();
     set_creg(RET_REGISTER,1);
-    printf("\tjal ultodp\n");
+    code_dpfunc("ultodp");
     set_dreg(RET_DREGISTER,0);
     regv[freg]=1;
 }
@@ -2475,14 +2510,14 @@
 void code_d2f(int freg) {
     code_save_stacks();
     set_dreg(RET_DREGISTER,1);
-    printf("\tjal dptofp\n");
+    code_dpfunc("dptofp");
     set_freg(RET_FREGISTER,0);
 }
 
 void code_f2d(int freg) {
     code_save_stacks();
     set_freg(RET_FREGISTER,1);
-    printf("\tjal fptodp\n");
+    code_dpfunc("fptodp");
     set_dreg(RET_DREGISTER,0);
 }
 
@@ -2540,7 +2575,7 @@
 	code_save_stacks();
 	set_dreg(RET_DREGISTER,1);
         code_drgvar(e2,d,RET_DREGISTER+2);
-        printf("\tjal dcmp\n");
+	code_dpfunc("dcmp");
 	regv[dreg]=0;
     } else {
 	frn=fregister_name(freg);
@@ -2560,7 +2595,7 @@
 	code_save_stacks();
 	set_dreg(RET_DREGISTER,1);
         code_drgvar(e2,d,RET_DREGISTER+2);
-        printf("\tjal dcmp\n");
+	code_dpfunc("dcmp");
 	regv[dreg]=0;
     } else {
         g=get_dregister(d);
@@ -2580,7 +2615,7 @@
 	code_save_stacks();
 	set_dreg(RET_DREGISTER,1);
 	move_dreg(RET_DREGISTER+2,e1);
-        printf("\tjal %s\n",opn);
+	code_dpfunc(opn);
     } else {
         frn=fregister_name(freg);
         grn=fregister_name(e1);
@@ -2665,9 +2700,9 @@
         printf("\tlw $5,%d(%s)\n",size_of_int,crn);
         printf("\tli.d $6,1.0\n");
         if (caddr(e1)>0)
-            printf("\tjal dpadd\n");
+	    code_dpfunc("dpadd");
         else
-            printf("\tjal dpsub\n");
+	    code_dpfunc("dpsub");
         printf("\tsw $2,0(%s)\n",crn);
         printf("\tsw $3,%d(%s)\n",size_of_int,crn);
 	creg = dreg;
@@ -2707,9 +2742,9 @@
 	move_dreg(g,4+DREG_OFFSET);
         printf("\tli.d $6,1.0\n");
         if (caddr(e1)>0)
-            printf("\tjal dpadd\n");
+	    code_dpfunc("dpadd");
         else
-            printf("\tjal dpsub\n");
+	    code_dpfunc("dpsub");
         set_dreg(RET_DREGISTER,0);
         printf("\tsw $2,0(%s)\n",crn);
         printf("\tsw $3,%d(%s)\n",size_of_int,crn);
--- a/mc-code-powerpc.c	Sun Jul 20 16:45:09 2003 +0900
+++ b/mc-code-powerpc.c	Mon Jul 21 15:13:37 2003 +0900
@@ -138,8 +138,8 @@
 static void    set_creg(int,int);
 static void    set_freg(int,int);
 
-int max_func_args;
-int my_func_args;
+static int max_func_args;
+static int my_func_args;
 #define ARG_LVAR_OFFSET 0x10000000
 
 /*