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