Mercurial > hg > CbC > old > device
diff Changes @ 566:ddc435b64fc8
binop/inline interaction
author | kono |
---|---|
date | Wed, 11 Jan 2006 13:59:06 +0900 |
parents | dbe0b9ac9f53 |
children | 790ecb8900f0 |
line wrap: on
line diff
--- a/Changes Wed Jan 11 10:48:05 2006 +0900 +++ b/Changes Wed Jan 11 13:59:06 2006 +0900 @@ -8158,11 +8158,54 @@ 変だよね。本体を2 pass にすることも可能だが、いろいろ 面倒か。と考えると、parse tree が結局楽か。 - - - - - - - - +Wed Jan 11 13:58:03 JST 2006 + +ARM の定数テーブルの溢れを修正、freg_arg のバグ。 + +a0+a1+a2+.... で、局所変数から局所変数へのコピーが出るのは +ダサイ。が、そのためには、 + gexpr(e1); + emit_push(); +ではなくて、 + emit_push(e1); +にしないとだめだね。直しても対した量ではないが... + +emit_push() では、register_full かどうかを見てないから、 +get_register() のところで、stack のclearが出るわけか。 +あぁ、そんなコードが出てるね。 + +machineop のところで、なんとか出来ないの? emit_pop +では free_lvar しているしな。 + + void + machinop(e1) + int e1; + { + int e2,e3,op; + + e2 = cadr(e1); + op = car(e1); + switch (car(e3 = caddr(e1))) { + case RGVAR: case RLVAR: case CONST: + g_expr(e2); + if (simpop(op)) + oprt(op,e3); + else + oprt_div(op,e3); + return; + +昔は、やってたみたいだね。 + +あぁ、そうじゃないよ。tosop の前のgexpr では RGVAR とかが +くれば良いんだが、それはbinop でやっていて、mc-inline.c +では、binop は呼ばれないから、最適化がかからないわけね。 +IVAR level で binop を呼んでも意味がない。 +ということは、mc-inline.c でbinopを呼べば良いから、やっぱり、 +list(op,e1,t1,e2,t2) という形でないとだめなわけね。 + +でも binop は type を変えてしまうので、それを保存するように +直さないとだめ。 + +これだと、parse tree を正確に保存することはできない。 +type を含めた変換をしないと構文解析できないし。 +