diff mc-code-arm.c @ 389:68fb244e0e3c

mc-arm generates code-gen-all.s with no error, but assembler output contains errors.
author kono
date Fri, 03 Sep 2004 23:27:04 +0900
parents 245c6033683d
children 15cf97ce7db1
line wrap: on
line diff
--- a/mc-code-arm.c	Tue Aug 24 15:10:16 2004 +0900
+++ b/mc-code-arm.c	Fri Sep 03 23:27:04 2004 +0900
@@ -83,9 +83,9 @@
 #define REG_fp   13
 #define REG_sp   14
 #define REG_VAR_BASE 11
-#define REG_VAR_MIN  4
-#define MIN_TMP_REG 12          /* only one tmp register? */
-#define MAX_TMP_REG 12
+#define REG_VAR_MIN  9
+#define MIN_TMP_REG 2          /* only one tmp register? */
+#define MAX_TMP_REG 8
 
 #define PTRC_REG 3              /* mark for pointer cache */
 
@@ -497,7 +497,7 @@
 void
 code_gexpr(int e){
      if (is_int_reg(creg) && creg!=ireg) error(-1);
-// register_usage("code_gexpr");
+//  register_usage("code_gexpr");
 }
 
 
@@ -620,7 +620,7 @@
         }
     }
     /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
-    error(HPERR); return creg;
+    error(RGERR); return creg;
 }
 
 #if 0
@@ -672,7 +672,7 @@
         }
     }
     /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
-    error(REG_ERR); return freg;
+    error(RGERR); return freg;
 }
 
 #if 0
@@ -692,13 +692,14 @@
 }
 #endif
 
+// static int lreg_count;
 int
 get_lregister0()
 {
     int i;
     for(i=LREG_OFFSET;i<REAL_MAX_LREGISTER+LREG_OFFSET;i++) {
 	if (regs[i]==0) {
-// printf("# get_lregister %d\n",i);
+// printf("# get_lregister %d (%d)\n",i,lreg_count++);
 	    return i;
 	}
     }
@@ -771,6 +772,7 @@
 // printf("# free_register %d\n",i);
     regs[i]=0;
     if (is_longlong_reg(i)) {
+// printf("# free lregister %d (%d)\n",i,lreg_count++);
 	regs[regv_l(i)]=0;
 	regs[regv_h(i)]=0;
 	//regv_l(i)=0;
@@ -2882,6 +2884,8 @@
 	printf("\tbeq\t.L%d\n",label); break;
     case LT:
 	printf("\tblt\t.L%d\n",label); break;
+    case GT:
+	printf("\tbgt\t.L%d\n",label); break;
     default: error(-1);
     }
     if (reg!=-1) free_register(reg);
@@ -5320,6 +5324,8 @@
     emit_pop_free(edx);
     if (edx0!=-1)
 	free_register(edx0);
+    if (reg!=lreg)
+	free_register(reg);
 }
 
 void
@@ -5394,7 +5400,7 @@
 
     char *trn = register_name(t=get_register());
 
-    code_add(t,csvalue,-min);
+    code_add(t,-min,csvalue);
     code_cmpdimm(max-min+1,t,dlabel,GT);
     switch(delta) {
     case 1: printf("\tldrls\tpc, [pc, %s, asl #2]\n",trn);