Mercurial > hg > CbC > old > device
changeset 226:a31e1d24c097
*** empty log message ***
author | kono |
---|---|
date | Tue, 27 Apr 2004 10:32:32 +0900 |
parents | 8675ea3d2c7f |
children | ed92cef127f1 |
files | Changes mc-code-powerpc.c |
diffstat | 2 files changed, 28 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Mon Apr 26 14:07:43 2004 +0900 +++ b/Changes Tue Apr 27 10:32:32 2004 +0900 @@ -4052,3 +4052,7 @@ 構造体の戻値を持つ場合に、引数がないとうまくいかない。 #include "" は、今読んでいるファイルのcurrent directry も探す。 + +まぁ、ia32 は、eax,edx にlong,long を積んで、あとは、 +対メモリで計算するわけね。そうだろうな。むしろ、 +やさしいかも。
--- a/mc-code-powerpc.c Mon Apr 26 14:07:43 2004 +0900 +++ b/mc-code-powerpc.c Tue Apr 27 10:32:32 2004 +0900 @@ -155,7 +155,7 @@ int i = creg; if (!is_longlong_reg(i)) { if (ireg) { free_register(ireg); ireg=0; } - if (!lreg) lreg = get_lregister(); + if (!lreg||!regs[lreg]) lreg = get_lregister(); // else if (lreg!=i) free_register(i); i = lreg; } @@ -671,8 +671,8 @@ if (is_longlong_reg(i)) { regs[regv_l(i)]=0; regs[regv_h(i)]=0; - regv_l(i)=0; - regv_h(i)=0; + //regv_l(i)=0; + //regv_h(i)=0; } } @@ -771,7 +771,11 @@ int i; // printf("# free_all register\n"); #if LONGLONG_CODE - for(i=0;i<REAL_MAX_LREGISTER;i++) { regs[i+LREG_OFFSET]=0; } + for(i=0;i<REAL_MAX_LREGISTER;i++) { + regs[i+LREG_OFFSET]=0; + regv_l(i+LREG_OFFSET) = 0; + regv_h(i+LREG_OFFSET) = 0; + } lreg = 0; // set_lreg(LREG_LREGISTER,0); #endif @@ -1504,16 +1508,16 @@ } if (!is_longlong_reg(reg)) error(-1); if (reg!=creg) { - free_register(creg); if (lreg && reg!=lreg) { - free_register(lreg); if (mode) { printf("\tmr %s,%s\n", lregister_name_low(reg),lregister_name_low(lreg)); printf("\tmr %s,%s\n", lregister_name_high(reg),lregister_name_high(lreg)); } + free_register(lreg); } + free_register(creg); regs[reg]=USING_REG; clear_ptr_cache_reg(regv_l(reg)); regs[regv_l(reg)]=USING_REG; @@ -3239,8 +3243,13 @@ static void lmove(int to,int from) { - printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from)); - printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from)); + if (regv_h(to)==regv_l(from)) { + printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from)); + printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from)); + } else { + printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from)); + printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from)); + } } static void @@ -3373,8 +3382,13 @@ crn_h = lregister_name_high(creg); crn_l = lregister_name_low(creg); - printf("\tstw %s,0(%s)\n",crn_h,drn); - printf("\tstw %s,%d(%s)\n",crn_l,size_of_int,drn); + if (e2==regv_h(creg)) { + printf("\tstw %s,%d(%s)\n",crn_l,size_of_int,drn); + printf("\tstw %s,0(%s)\n",crn_h,drn); + } else { + printf("\tstw %s,0(%s)\n",crn_h,drn); + printf("\tstw %s,%d(%s)\n",crn_l,size_of_int,drn); + } } void