Mercurial > hg > CbC > old > device
changeset 659:2a3b1cddd45f
*** empty log message ***
author | kono |
---|---|
date | Wed, 24 Jan 2007 14:31:50 +0900 |
parents | cb3809f4ec97 |
children | 3e1dba5758d8 |
files | Changes mc-codegen.c |
diffstat | 2 files changed, 33 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Wed Jan 24 13:48:28 2007 +0900 +++ b/Changes Wed Jan 24 14:31:50 2007 +0900 @@ -9203,3 +9203,7 @@ してしまうと、それは出来ない。deleyed みたいな扱いをすればいい? 実際に使われるところでemit_init_vars() するみたいな? + +Wed Jan 24 14:12:20 JST 2007 + +get_register_var を使った後、free してない例が多いみたい。
--- a/mc-codegen.c Wed Jan 24 13:48:28 2007 +0900 +++ b/mc-codegen.c Wed Jan 24 14:31:50 2007 +0900 @@ -1076,7 +1076,8 @@ static void save_target(int t,int s,int *target,int *use,int sz,int ty) { - int e1; + int e1 = 0; + // 使ったら free するべきだよね? code goto の時なら害はないか... /*新しいレジスタ(or スタック)を取得する*/ if (scalar(ty) && sz==size_of_int && (e1=get_register_var(0))!=-1) { // e1=list3(REGISTER,e1,0); @@ -2464,7 +2465,7 @@ iassop(int e1) { int e2,e3,byte,op,sign,size; - int n,t; + int t; /* e2 op= e3 */ switch(car(e1)) { @@ -2494,18 +2495,24 @@ /* e2 = e2 op e3; */ t = sign?INT:UNSIGNED; // oprtc expected - if (car(e2)==LVAR||car(e2)==GVAR) { + if (car(e2)==LVAR||car(e2)==GVAR|| + (car(e2)==INDIRECT&&car(cadr(e2))==REGISTER)) { g_expr(assign_expr0(e2,list3(op,rvalue_t(e2,t),e3),t,t)); return; } +#if 0 /* new = &e2 */ /* *new = *new op e3 */ - n = list3(LVAR,new_lvar(size_of_int),0); + // e2 が複雑な式でないと却ってだめなこともある + // register が取れれば常に有効か? + // たぶん、i386 の時には有効だったんだろうなぁ。 + int n = list3(LVAR,new_lvar(size_of_int),0); // get register var? g_expr_u(assign_expr0(n,list2(ADDRESS,e2),INT,INT)); g_expr(assign_expr0(rvalue_t(n,INT), list3(op,rvalue_t(list2(INDIRECT,rvalue_t(n,INT)),t),e3),t,t)); free_lvar(cadr(n)); return; +#endif } g_expr(e3); emit_push(); @@ -2528,14 +2535,25 @@ e3 = caddr(e1); op = cadddr(e1); - g_expr(e3); if (car(e2)==DREGISTER||car(e2)==FREGISTER) { + g_expr(e3); emit_dpush(d); code_register_dassop(cadr(e2),op,d); if (use) code_dregister(cadr(e2),USE_CREG,d); return; } + if (car(e3)==DCONST||car(e3)==FCONST) { + /* e2 = e2 op e3; */ + int t = d?DOUBLE:FLOAT; + // oprtc expected + if (car(e2)==LVAR||car(e2)==GVAR|| + (car(e2)==INDIRECT&&car(cadr(e2))==REGISTER)) { + g_expr(assign_expr0(e2,list3(op,rvalue_t(e2,t),e3),t,t)); + return; + } + } + g_expr(e3); emit_dpush(d); g_expr(e2); code_dassop(op,USE_CREG,d); @@ -2556,7 +2574,7 @@ lassop(int e1) { int e2,e3,op; - int n,t; + int t; /* e2 op= e3 */ e2 = cadr(e1); @@ -2585,18 +2603,21 @@ if (!code_lassop_p||car(e3)==LCONST) { /* e2 = e2 op e3; */ t = long_sign(op); - if (car(e2)==LREGISTER||car(e2)==LVAR||car(e2)==GVAR) { + if (car(e2)==LREGISTER||car(e2)==LVAR||car(e2)==GVAR|| + (car(e2)==INDIRECT&&car(cadr(e2))==REGISTER)) { g_expr(assign_expr0(e2,list3(op,rvalue_t(e2,t),e3),t,t)); return; } +#if 0 /* new = &e2 */ /* *new = *new op e3 */ - n = list3(LVAR,new_lvar(size_of_int),0); + int n = list3(LVAR,new_lvar(size_of_int),0); g_expr_u(assign_expr0(n,list2(ADDRESS,e2),INT,INT)); g_expr(assign_expr0(rvalue_t(n,INT), list3(op,rvalue_t(list2(INDIRECT,rvalue_t(n,INT)),t),e3),t,t)); free_lvar(cadr(n)); return; +#endif } g_expr(e3);