diff mc-code-mips.c @ 263:c922bade771d

MIPS go on...
author kono
date Sun, 16 May 2004 20:11:48 +0900
parents 31d7f050ec0d
children 7de200d88747
line wrap: on
line diff
--- a/mc-code-mips.c	Sat May 15 23:09:36 2004 +0900
+++ b/mc-code-mips.c	Sun May 16 20:11:48 2004 +0900
@@ -16,6 +16,7 @@
 #define RODATA_EMIT_MODE 2
 
 static void data_mode(char *name);
+static void text_mode(int alignment);
 static void init_ptr_cache();
 static void ld_indexx(int byte, int n, int xreg,int reg,int sign);
 static void local_table(void);
@@ -27,9 +28,16 @@
 static int output_mode = TEXT_EMIT_MODE;
 static int data_alignment = 0;
 
-// static int code_disp_label;
-// static int disp_label;
-int code_top_label;
+static FILE *asi;
+
+static int cprestore_label;
+static int fmask_label;
+static int fmask_offset_label;
+static int mask_label;
+static int mask_offset_label;
+static int register_save_return_label;
+static int register_save_label;
+
 
 static int r1_offset_label;
 static int lvar_offset_label;
@@ -866,7 +874,7 @@
 	free_register(lreg_stack[--lreg_sp]);
     }
     use_int0();
-    text_mode();
+    text_mode(2);
     gexpr_code_init();
     register_usage("gexpr_init");
 }
@@ -880,7 +888,7 @@
     max_reg_var=0; max_freg_var=0;
     reg_sp = 0;
     freg_sp = 0;
-    text_mode();
+    text_mode(3);
 }
 
 #define reg_var_num(i) (REG_VAR_BASE-i)
@@ -1369,7 +1377,7 @@
     if (output_mode==TEXT_EMIT_MODE) {
 	printf(".text\n");
     } else {
-	text_mode();
+	text_mode(2);
     }
     printf("\tla %s,$L_%d\n",crn,lb);
 }
@@ -2427,14 +2435,13 @@
 {
     static int count=0;
     /* this is called once per file */
-#if 0
     char *p=cheapp;
     char *s,*t;
-#endif
+
     printf("\t.file %d \"%s\"\n",count++,filename);
     printf(".abicalls\n");
     printf(".text\n");
-#if 0
+
     if (asi) {
         fclose(asi);
         asi = 0;
@@ -2453,7 +2460,6 @@
     asi = fopen(p,"w");
     printf(".include \"%s\"\n",p);
     if (!asi) error(-1);
-#endif
 }
 
 void
@@ -2537,6 +2543,12 @@
 	    disp += SIZE_OF_INT;
 	}
     }
+    for(i=0;i<32;i++) {
+	if (freg_var_num(0)>i&&i>freg_var_num(max_reg_var)) {
+	    printf("\ts.s    %s,%d($sp)\n",register_name(i),disp);
+	    disp += SIZE_OF_FLOAT;
+	}
+    }
     return disp;
 }
 
@@ -2550,6 +2562,12 @@
 	    disp += SIZE_OF_INT;
 	}
     }
+    for(i=0;i<32;i++) {
+	if (freg_var_num(0)>i&&i>freg_var_num(max_reg_var)) {
+	    printf("\tl.s    %s,%d($sp)\n",register_name(i),disp);
+	    disp += SIZE_OF_FLOAT;
+	}
+    }
     return disp;
 }
 
@@ -2581,37 +2599,11 @@
     return mask;
 }
 
-static int
-code_fregister_save(reg_save,freg_save,disp)
-{
-    int i;
-    for(i=0;i<32;i++) {
-	if (freg_var_num(0)>i&&i>freg_var_num(max_reg_var)) {
-	    printf("\tsw    %s,%d($sp)\n",register_name(i),disp);
-	    disp += SIZE_OF_FLOAT;
-	}
-    }
-    return disp;
-}
-
-static int
-code_fregister_restore(reg_save,freg_save,disp)
-{
-    int i;
-    for(i=0;i<32;i++) {
-	if (freg_var_num(0)>i&&i>freg_var_num(max_reg_var)) {
-	    printf("\tsw    %s,%d($sp)\n",register_name(i),disp);
-	    disp += SIZE_OF_FLOAT;
-	}
-    }
-    return disp;
-}
-
 void
 code_enter(char *name)
 {
     if (output_mode!=TEXT_EMIT_MODE) 
-	text_mode();
+	text_mode(3);
     else
 	printf("\t.align 3\n");
     if (stmode!=STATIC)
@@ -2619,9 +2611,18 @@
 #ifdef DOT_SIZE
     printf("\t.type\t%s,@function\n",name);
 #endif
-    code_top_label = backdef();
-    r1_offset_label = fwdlabel();
-    lvar_offset_label = 0;
+
+    printf("%s:\n",name);
+    printf("\t.frame $fp,%d,$31\n",0);
+    printf("\t.mask  0x%x,%d\n",code_mask(),0);
+    printf("\t.fmask 0x%x,%d\n",code_fmask(),0);
+
+    printf("\t.set noreorder\n");
+    printf("\t.cpload $25\n");
+    printf("\t.set reorder\n");
+    printf("\tsubu $sp,$sp,$L_%d\n", r1_offset_label = fwdlabel());
+    printf("\t.cprestore %d\n",max_func_args);
+    lvar_offset_label = fwdlabel();
 
     max_func_args = 0;
 }
@@ -2644,20 +2645,6 @@
 
     printf(".set L_%d,%d\n",r1_offset_label,r1_offsetv);
 
-    printf("\t.align 2\n");
-    printf("%s:\n",name);
-    printf("\t.frame $fp,%d,$31\n",0);
-    printf("\t.mask  0x%x,%d\n",code_mask(),0);
-    printf("\t.fmask 0x%x,%d\n",code_fmask(),0);
-
-    printf("\t.set noreorder\n");
-    printf("\t.cpload $25\n");
-    printf("\t.set reorder\n");
-    printf("\tsubu $sp,$sp,$L_%d\n",-r1_offsetv);
-    printf("\t.cprestore %d\n",max_func_args);
-    printf("\tj $L_%d\n",code_top_label);
-
-
     local_table();
     printf("\t.end    %s\n",name);
     // free_all_register();
@@ -2667,21 +2654,35 @@
 enter(char *name)
 {
     if (output_mode!=TEXT_EMIT_MODE) 
-	text_mode();
+	text_mode(3);
     else
-	printf("\t.align 2\n");
-    code_top_label = backdef();
+	printf("\t.align 3\n");
     
-    r1_offset_label = fwdlabel();
+    max_func_args = 0;
+
     lvar_offset_label = fwdlabel();
 
-    max_func_args = 0;
+    printf(".ent %s\n",name);
+    printf("%s:\n",name);
+    printf("\t.frame $fp,$L_%d,$31\t",r1_offset_label);
+    printf("\t.mask  0x%x,%d\n",mask_label=fwdlabel(),
+	mask_offset_label=fwdlabel());
+    printf("\t.fmask  0x%x,%d\n",fmask_label=fwdlabel(),
+	fmask_offset_label=fwdlabel());
+    printf("\t.set noreorder\n");
+    printf("\t.cpload $25\n");
+    printf("\t.set reorder\n");
+    printf("\tsubu $sp,$sp,$L_%d\n",r1_offset_label=fwdlabel());
+    printf("\t.cprestore $L_%d\n",cprestore_label=fwdlabel());
+    printf("\tj $L_%d\n",register_save_label=fwdlabel());
+    register_save_return_label = backdef();
+    printf("\tmove  $fp,$sp\n");
 }
 
 void
 enter1()
 {
-    text_mode();
+    text_mode(0);
     // set_lreg(LREG_LREGISTER,0);
     set_ireg(CREG_REGISTER,0);
     set_freg(FREG_FREGISTER,0);
@@ -2704,7 +2705,8 @@
 
     if (control) {
 	code_set_return_register(1);
-    }
+    } else
+	text_mode(2);
     if (retcont) { 
 	/* return from CbC segement */
 	if (control) jmp(retlabel);
@@ -2734,35 +2736,24 @@
     if (retcont) {
 	fwddef(retcont1);
     }
-#if 0
-    fprintf(asi,"$L_%d=%d\n",r1_offset_label,0);
-    fprintf(asi,"$L_%d=%d\n",lvar_offset_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=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 ,max_func_args);
-#endif
+
 
     disp &= -SIZE_OF_INT;
     r1_offsetv = round16(-disp) +
 	max_reg_var*SIZE_OF_INT+max_freg_var*SIZE_OF_FLOAT+
 	round16(max_func_args);
 	
-    printf(".set L_%d,%d\n",r1_offset_label,r1_offsetv);
-    printf(".set L_%d,%d\n",lvar_offset_label,lvar_offsetv);
+    fprintf(asi,"$L_%d=%d\n",r1_offset_label,r1_offsetv);
+    fprintf(asi,"$L_%d=%d\n",lvar_offset_label,lvar_offsetv);
 
     printf("\tmove    $sp,$fp\n");
-    code_fregister_restore(code_register_restore(disp));
+    if (max_reg_var+max_freg_var)
+	code_register_restore(disp);
     printf("\tlw      $31,%d($sp)\n",-disp);
     printf("\tlw      $fp,%d($sp)\n",-disp-4);
     printf("\taddu    $sp,$sp,%d\n",r1_offsetv);
     printf("\tj       $31\n");
 
-    printf("\t.align 2\n");
-    printf(".ent %s\n",name);
-    printf("%s:\n",name);
-    printf("\t.frame $fp,%d,$31\t",r1_offsetv);
 printf("# vars= %d, regs= %d/%d, args= %d, extra= %d\n",
 	round16(-disp),
 	max_reg_var+2,
@@ -2770,16 +2761,20 @@
 	round16(max_func_args),
 	0
 );
-    printf("\t.mask  0x%x,%d\n",code_mask(),code_mask_offset());
-    printf("\t.fmask 0x%x,%d\n",code_fmask(),code_fmask_offset());
-
-    printf("\t.set noreorder\n");
-    printf("\t.cpload $25\n");
-    printf("\t.set reorder\n");
-    printf("\tsubu $sp,$sp,%d\n",r1_offsetv);
-    printf("\t.cprestore %d\n",round16(max_func_args));
-    code_fregister_save(code_register_save(disp));
-    printf("\tj $L_%d\n",code_top_label);
+    fprintf(asi,"$L_%d=0x%x\n",mask_label,code_mask());
+    fprintf(asi,"$L_%d=%d\n",mask_offset_label,code_mask_offset());
+    fprintf(asi,"$L_%d=0x%x\n",fmask_label,code_fmask());
+    fprintf(asi,"$L_%d=%d\n",fmask_offset_label,code_fmask_offset());
+    fprintf(asi,"$L_%d=%d\n",cprestore_label ,round16(max_func_args));
+
+    if (max_reg_var+max_freg_var==0) {
+	fprintf(asi,"$L_%d=$L_%d\n",
+		register_save_label,register_save_return_label);
+    } else {
+	code_label(register_save_return_label);
+	code_register_save(disp);
+	jmp(register_save_return_label);
+    }
 
     local_table();
     printf("\t.end    %s\n",name);
@@ -2976,11 +2971,11 @@
 }
 
 void
-text_mode(void)
+text_mode(int align)
 {
     if (output_mode!=TEXT_EMIT_MODE) {
 	printf(".text\n");
-	printf("\t.align 2\n");
+	if (align) printf("\t.align %d\n",align);
 	output_mode = TEXT_EMIT_MODE;
     }
 }
@@ -3420,7 +3415,7 @@
     int cmp=0;
 
     d=(op<FOP);
-    use_float(reg,d);
+    use_float(d,reg);
     switch(op) {
     case FADD: opn="add.s"; break;
     case DADD: opc="dpadd"; break;
@@ -4779,6 +4774,7 @@
 {
     global_table();
     /* printf("\t.ident \"Micro-C compiled\"\n"); */
+    fclose(asi); asi=0;
 }
 
 /* end */