Mercurial > hg > CbC > old > device
changeset 582:3f60e599cc04 intel-register-removal
*** empty log message ***
author | kono |
---|---|
date | Mon, 16 Jan 2006 00:52:56 +0900 |
parents | ad9ef203f95b |
children | 421be86892b3 |
files | Changes mc-code-ia32.c mc-codegen.c test/throw.c test/throw.code-out |
diffstat | 5 files changed, 73 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Sun Jan 15 22:40:23 2006 +0900 +++ b/Changes Mon Jan 16 00:52:56 2006 +0900 @@ -8386,7 +8386,32 @@ そもそも、そうでないと parallel assignment がうまく動かない はずだよね。 - - - - +というわけで、disp_offset==code_disp_offset は必須ということに +なりました。これで、code_fix_frame_pointer はなくなりました。 + +non destructive creg ってのは、あっても良いかも。 + +Sun Jan 15 23:16:10 JST 2006 + +あーぁ、ia32 のレジスタ変数がloopでは、virtualがずれるので +うまく動かない。jmp では、標準に直すべきなのか。ってことは、 +ia32 ではレジスタはやっぱり禁止か。か、あるいは、virtual +を止めるかだね。esi/edi はvirtualしないっていう風にすれば +いいか。lreg は? + +いや、だめですね。check_virtual みたいな方法だと、もっと、 +いろいろ変更しないと動かない。use_data_reg() とかは、 +根本的にだめってことじゃないか? (いまさら?) + +use_register(reg,REG_EAX) などが、 reg = use_register(reg,REG_EAX); +という形式ならば、rename し切れなかった時に、別なレジスタを返せる。 + +通常は register はcopy して使うわけだから、rename はされな +い。setup_edx とか、get_register で esi/edi が返されて rename +されてしまった時がまずいわけだけよね。 その時だけ check_virtual +すれば? + +esi/edi をget_regsiter しないと、assop などで、致命的に足り +ないことになる。 + +
--- a/mc-code-ia32.c Sun Jan 15 22:40:23 2006 +0900 +++ b/mc-code-ia32.c Mon Jan 16 00:52:56 2006 +0900 @@ -713,7 +713,13 @@ int get_register_var(NMTBL *nptr) { +#if 0 int i,j; + どうしても、%esi,%edi がvirtualでずれてループしてしまうのを + 止められないので、とりえあず諦める。 + + edx_setup あたりがまずいらしいが... + if (reg_var<2) { for(i=REG_ESI;i<REG_EBP;i++) { j = virtual(i); @@ -725,6 +731,7 @@ } } } +#endif return list3(LVAR,new_lvar(SIZE_OF_INT),0); } @@ -734,7 +741,7 @@ return list3(LVAR,new_lvar(d?SIZE_OF_DOUBLE:SIZE_OF_FLOAT),0); } -void +static void use_register(int virt, int real, int move) { int real_v; @@ -750,7 +757,28 @@ rname[virt] = real; } -void +#if 0 +static void +check_virtual() +{ + int real; + if (rname[REG_ESI]!=REG_ESI) { + real = rname[REG_ESI]; + printf("\txchg %%esi,%s\n",reg_name[real]); + rname[real] = real; + rname[REG_ESI] = REG_ESI; + } + if (rname[REG_EDI]!=REG_EDI) { + real = rname[REG_EDI]; + printf("\txchg %%edi,%s\n",reg_name[real]); + rname[real] = real; + rname[REG_EDI] = REG_EDI; + } +} +#endif + +#if 0 +static void use_pointer(int virt, int move) { int i; @@ -765,6 +793,7 @@ /* we prefer EBX */ use_register(virt,REG_EBX,move); } +#endif void use_data_reg(int virt, int move) @@ -809,10 +838,6 @@ { int xreg; if ((xreg=pop_register())==-1) { - if (type==POINTER_REG) - use_pointer(dreg,0); - else if (type==DATA_REG) - use_data_reg(dreg,0); if (regv[dreg]) { printf("### emit_pop dreg conflict\n"); error(-1); @@ -1025,6 +1050,7 @@ g_expr(e2); xrn = register_name(creg,0); use_int(reg); + // use_data_reg(reg); printf("\t%s $%d,(%s)\n",(sz==1)?"addb":(sz==SIZE_OF_SHORT)?"addw":"addl",dir,xrn); printf("\t%s (%s),%s\n",cload(sign,sz),xrn,register_name(reg,0)); } @@ -1044,6 +1070,7 @@ emit_push(); xrn = register_name((e2=emit_pop(0)),0); use_int(reg); + // use_data_reg(reg); printf("\t%s (%s),%s\n",cload(sign,sz),xrn,register_name(reg,0)); printf("\t%s $%d,(%s)\n",(sz==1)?"addb":(sz==SIZE_OF_SHORT)?"addw":"addl",dir,xrn); emit_pop_free(e2);
--- a/mc-codegen.c Sun Jan 15 22:40:23 2006 +0900 +++ b/mc-codegen.c Mon Jan 16 00:52:56 2006 +0900 @@ -932,7 +932,7 @@ /* source (after) list2(tag,disp) */ /* source list list3(e,cdr,sz) */ -#define DEBUG_PARALLEL_ASSIGN 9 +#define DEBUG_PARALLEL_ASSIGN 0 static int is_writable(int);
--- a/test/throw.c Sun Jan 15 22:40:23 2006 +0900 +++ b/test/throw.c Mon Jan 16 00:52:56 2006 +0900 @@ -23,7 +23,7 @@ code throw1(interface1 arg,int i,int j) { - printf("%d %d %d %d\n",arg.last,arg.a,arg.c[99],j); + printf("%d %d %d %d %d\n",arg.last,arg.a,arg.c[99],i,j); arg.last=96; goto throw2(arg,i,74); } @@ -32,7 +32,7 @@ throw(interface1 arg,int i,int j) { char *space = (char *)malloc(ENVSIZE)+ENVSIZE; - printf("%d %d %d %d\n",arg.last,arg.a,arg.c[99],j); + printf("%d %d %d %d %d\n",arg.last,arg.a,arg.c[99],i,j); arg.last=97; goto throw1(arg,i,75),space; } @@ -40,7 +40,7 @@ void setup(interface1 *arg) { - for(int i=0;i<100;i++) arg->c[i]=i; + for(register int i=0;i<100;i++) arg->c[i]=i; } int @@ -58,7 +58,7 @@ ret = return; env = environment; - goto throw(arg,1,76); + goto throw(arg,-7,76); } int @@ -79,7 +79,7 @@ ret = return; env = environment; - goto throw1(arg,1,77),space; + goto throw1(arg,-6,77),space; } int @@ -99,7 +99,7 @@ ret = return; env = environment; - goto throw1(arg,1,78); + goto throw1(arg,-5,78); } int