changeset 391:a460a3f118d1

ARM continue...
author kono
date Wed, 08 Sep 2004 01:10:37 +0900
parents 15cf97ce7db1
children 28c60758dac9
files Changes mc-code-arm.c
diffstat 2 files changed, 48 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sat Sep 04 14:15:41 2004 +0900
+++ b/Changes	Wed Sep 08 01:10:37 2004 +0900
@@ -5951,3 +5951,17 @@
 そういえば Input register をtmpに使わないのはなんで?
 
 順調にバグ取りは進んではいるんだけど...
+
+Sat Sep  4 18:04:40 JST 2004
+
+INPUT/REGISTER が double int register と float register 
+で一貫してない。
+
+Wed Sep  8 01:08:35 JST 2004
+
+lvar_offset_label, r1_offset_label っているの? fp を
+使ってるんだから、いらない説もあるが..
+
+局所変数を負のオフセットでアクセスし、関数呼び出しをsp オフセット
+で積むなら、いらないはず。
+
--- a/mc-code-arm.c	Sat Sep 04 14:15:41 2004 +0900
+++ b/mc-code-arm.c	Wed Sep 08 01:10:37 2004 +0900
@@ -287,9 +287,6 @@
 
 /*          
 
-     Reorder is automatically done in assembler.
-     delayed slot done within .set noreorder.
-
      r0    return value etc.
      r0,r1 return value. (dpcmp return value on $2)
      00  special register
@@ -358,7 +355,8 @@
 printf("        @ args = %d, pretend = %d, frame = %d\n",
 	max_func_args,0,round16(-disp));
 printf("        @ frame_needed = 1, current_function_anonymous_args = 0\n");
-
+printf("\t.set .L%d, %d\n",lvar_offset_label,lvar_offsetv);
+printf("\t.set .L%d, %d\n",r1_offset_label,r1_offsetv);
 
 #if 0
 printf("# vars= %d, regs= %d/%d, args= %d, extra= %d\n",
@@ -790,26 +788,26 @@
 get_input_dregister_var(int i,NMTBL *n,int is_code,int d)
 {
     int j;
+    if (is_code) {
+	if (!(arch_mode&UseFPP)) {
+	    if(!(i<FREG_VAR_BASE-FREG_VAR_MIN)) return 0;
+	    i = FREG_VAR_BASE-i+FREG_OFFSET;
+	    return list3(FREGISTER,i,(int)n);
+	} else {
+	    return 0;
+	}
+    }
     if (d) {
-      // if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
-      j = get_input_lregister_var(i,n,is_code);
-      if (car(j)==LREGISTER) {
-	if (regs[cadr(j)]==INPUT_REG) regs[cadr(j)]=INPUT_DREG;
-	car(j) = DREGISTER;
-      }
-      return j;
-    }
-    if (is_code) {
-	if(!(i<FREG_VAR_BASE-FREG_VAR_MIN)) return 0;
-	i = FREG_VAR_BASE-i+FREG_OFFSET;
+	// if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
+	j = get_input_lregister_var(i,n,is_code);
+	return j;
     } else {
-	if (i==0) i=12+FREG_OFFSET;
-	else if (i==1) i=14+FREG_OFFSET;
-	else if (i==2) return list3(REGISTER,6,(int)n);
-	else if (i==3) return list3(REGISTER,7,(int)n);
+	if (i==0) return list3(REGISTER,1,(int)n);
+	else if (i==1) return list3(REGISTER,2,(int)n);
+	else if (i==2) return list3(REGISTER,3,(int)n);
+	else if (i==3) return list3(REGISTER,4,(int)n);
 	else return 0;
     }
-    return list3(FREGISTER,i,(int)n);
 }
 
 int
@@ -1088,25 +1086,18 @@
 get_dregister_var(NMTBL *n,int d)
 {
     int i,j;
-    if (d) {
-        i = get_lregister_var(n);
-	if (car(i)==LREGISTER) {
-	    car(i) = DREGISTER;
-	    regs[cadr(i)] = USING_DREG;
-	} 
-	return i;
-    }
-	    
-    for(i=0;i<FREG_VAR_BASE-FREG_VAR_MIN;i++) {
-	j = freg_var_num(i);
-        if (! regs[j]) {       /* 使われていないなら */
-            regs[j]=USING_REG; /*そのレジスタを使うことを宣言し*/
-	    if (i+1>max_freg_var) max_freg_var=i+1;
-	    /* その場所を表す番号を返す */
-	    return list3(FREGISTER,j,(int)n); 
-        }
-    }
-    return list2(LVAR,new_lvar(SIZE_OF_DOUBLE));
+    if ((arch_mode&UseFPP)) {
+	for(i=0;i<FREG_VAR_BASE-FREG_VAR_MIN;i++) {
+	    j = freg_var_num(i);
+	    if (! regs[j]) {       /* 使われていないなら */
+		regs[j]=USING_REG; /*そのレジスタを使うことを宣言し*/
+		if (i+1>max_freg_var) max_freg_var=i+1;
+		/* その場所を表す番号を返す */
+		return list3(d?DREGISTER:FREGISTER,j,(int)n); 
+	    }
+	}
+    }
+    return list2(LVAR,new_lvar(d?SIZE_OF_DOUBLE:SIZE_OF_FLOAT));
 }
 
 void
@@ -3108,6 +3099,7 @@
     max_func_args = 0;
 
     lvar_offset_label = fwdlabel();
+    r1_offset_label = fwdlabel();
     code_size_label = fwdlabel();
     printf("\t.type\t%s,function\n",name);
     if (stmode!=STATIC)
@@ -3627,7 +3619,7 @@
     }
     use_float(d,freg);
     inc_inst(1);
-    printf("\t%s\t%s,0(%s) @ float\n",fstore(d),
+    printf("\t%s\t%s, [%s, #0] @ float\n",fstore(d),
 	fregister_name(freg),register_name(e2));
 }
 
@@ -3816,6 +3808,8 @@
     } else {
 	//   u = (d>2.1e9)?((int)(d-2.1e9)^2147483648):(int)d
 	inc_inst(7);
+	use_float(1,reg);
+	frn = register_name(reg);
         if (!d) printf("\tmvfd\t%s, %s\n",frn,frn);
 	emit_dpush(1);
 	code_dconst(dlist2(DCONST,2.147483648e9),USE_CREG,1);
@@ -3833,7 +3827,6 @@
         printf("\teor\t%s, %s, #-2147483648\n",crn,crn);
 	printf("2:\n");
 	emit_dpop_free(lreg,d);
-	if (reg!=USE_CREG) code_register(reg0,reg);
     }
     return;
 }