changeset 746:f8ea174944f2

i64 continue... global table have to be fixed.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 12 Nov 2010 22:19:55 +0900
parents a396b346308a
children d4bc10fe7362
files .gdbinit mc-code-i64.c
diffstat 2 files changed, 22 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/.gdbinit	Fri Nov 12 16:38:42 2010 +0900
+++ b/.gdbinit	Fri Nov 12 22:19:55 2010 +0900
@@ -18,7 +18,7 @@
 # r -s test/call.c
 # r -s test/static.c
 # r -s test/tmpa.c
-r -s test/code-gen-all.c
+# r -s test/code-gen-all.c
 # r -s mc-code-powerpc.c
 # r -s test/macro.c
 # r -s test/basic.c
--- a/mc-code-i64.c	Fri Nov 12 16:38:42 2010 +0900
+++ b/mc-code-i64.c	Fri Nov 12 22:19:55 2010 +0900
@@ -320,7 +320,7 @@
 static char *float_one_lib[] = {
   "        .literal8",
 "        .align 3",
-"	_float_one",
+"_float_one:",
 "        .long   0",
 "        .long   1072693248",
         0
@@ -329,7 +329,7 @@
 static char *float_one_f_lib[] = {
   "        .literal4",
   "        .align 2",
-  "	_float_one_f:",
+  "_float_one_f:",
   "        .long   1065353216",
         0
 };
@@ -441,8 +441,8 @@
 #define REG_VAR_BASE    (MAX_REGISTER)
 #define REG_VAR_MIN     (MAX_REGISTER-MAX_REGISTER_VAR)
 
-#define FREG_VAR_BASE    (RET_FREGISTER+16)
-#define FREG_VAR_MIN     (RET_FREGISTER+16-MAX_DREGISTER_VAR)
+#define FREG_VAR_BASE    (RET_FREGISTER+15)
+#define FREG_VAR_MIN     (RET_FREGISTER+15-MAX_DREGISTER_VAR)
 
 static char *reg_name_q[] = {
     "%rsp",
@@ -480,8 +480,7 @@
     "%xmm12",
     "%xmm13",
     "%xmm14",
-    "%xmm15",
-    "%xmm16"};
+    "%xmm15" };
 
 static void ascii(char *s);
 
@@ -694,7 +693,12 @@
     return i;
 }
 
-#define fregister_name(reg)  reg_name_d[(reg)-FREG_OFFSET]
+char *
+fregister_name(int reg)  
+{
+    if (!is_float_reg(reg)) error(-1);
+    return reg_name_d[(reg)-FREG_OFFSET];
+}
 
 static void
 set_freg(int reg,int mode)
@@ -841,7 +845,7 @@
 get_register(void)
 {    /* 使われていないレジスタを調べる */
     int i,reg,j;
-    for(i=1;i<MAX_REGISTER+1;i++) {
+    for(i=REG_EDI;i<MAX_REGISTER+1;i++) {
 	if (! regs[i]) {    /* 使われていないなら */
 	    regs[i]=1;      /* そのレジスタを使うことを宣言し */
 	    return i;       /* その場所を表す番号を返す */
@@ -872,7 +876,7 @@
 get_data_register(void)
 {    /* 使われていないレジスタを調べる */
     int i,reg,j;
-    for(i=1; i<MAX_REGISTER+1;i++) {
+    for(i=REG_EDI; i<MAX_REGISTER+1;i++) {
 	if (is_data_reg(i) && ! regs[i]) {    /* 使われていないなら */
 	    regs[i]=1;      /* そのレジスタを使うことを宣言し */
 	    return i;       /* その場所を表す番号を返す */
@@ -1281,12 +1285,12 @@
 {
     int i;
     for(i=0;i<FREG_VAR_BASE-FREG_VAR_MIN;i++) {
-        if (! regs[FREG_VAR_BASE-i+FREG_OFFSET]) {       /* 使われていないなら */
-            regs[FREG_VAR_BASE-i+FREG_OFFSET]=REG_VAR; /*そのレジスタを使うことを宣言し*/
+        int reg = FREG_VAR_BASE-i;
+        if (! regs[reg]) {       /* 使われていないなら */
+            regs[reg]=REG_VAR; /*そのレジスタを使うことを宣言し*/
             if (i>max_freg_var) max_freg_var=i;
             /* その場所を表す番号を返す */
-            return list3n(DREGISTER,
-                FREG_VAR_BASE-i+FREG_OFFSET,nptr); 
+            return list3n(DREGISTER, reg,nptr); 
         }
     }
     return list3n(LVAR,new_lvar(SIZE_OF_DOUBLE),0);
@@ -1486,7 +1490,7 @@
 code_crlvar(int e2,int reg,int sign,int sz) {
     use_int(reg);
     printf("\t%s ",cload(sign,sz)); lvar(e2);
-    printf(",%s\n",register_name(reg,sz<=SIZE_OF_INT?SIZE_OF_INT:0));
+    printf(",%s\n",register_name(reg,0));
 }
 
 
@@ -3300,6 +3304,7 @@
 
 void code_dassign_gvar(int e2,int freg,int d)
 { 
+    use_float(d,freg);
 #ifdef __APPLE__
     int r = get_ptr_cache(ncaddr(e2));
     if (cadr(e2)) 
@@ -3316,6 +3321,7 @@
 
 void code_dassign_lvar(int e2,int freg,int d)
 { 
+    use_float(d,freg);
     printf("\t%s %s,",fstore(d),fregister_name(freg)); lvar(e2); printf("\n");
 }
 
@@ -3327,6 +3333,7 @@
 
 void code_dassign(int e2,int freg,int d)
 { 
+    use_float(d,freg);
     printf("\t%s %s,(%s)\n",fstore(d),fregister_name(freg),register_name(e2,0));
 }