Mercurial > hg > CbC > old > device
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)); }