# HG changeset patch # User kono # Date 1135507580 -32400 # Node ID 53ec17a8af7da1ee2459cf3dfe4d68f1c57d566f # Parent 14c7faf78910eaf84c3ea04f7d2ffbb2dc484926 inline continue.... diff -r 14c7faf78910 -r 53ec17a8af7d Changes --- a/Changes Sun Dec 25 17:40:11 2005 +0900 +++ b/Changes Sun Dec 25 19:46:20 2005 +0900 @@ -7495,9 +7495,11 @@ pfdecl で、inline を生成するんだけど、そこで引数のn->dspが arg_register などで破壊されてしまう。すると、inline がinlineを含んでいた時に破綻します。 +なのでコピーを作ることで対処。 inline return は、まだ、ちゃんとつくってないね。代入になる 場合があるから、ret_var みたいなので取っておけば良いか。 +(これは、いまだにさぼり) gen_inline なんだけど、最初は、partial evaluation だけやるつもり だったみたいだね。g_expr_u したのは間違いなのか。(そもそも、_u @@ -7512,4 +7514,36 @@ うまく直せない。scope 関係を見直せば良いんだけど.... enter_top_scope とか。 マルチレベルscopeになるわけね。 - +ではなくて、parse してしまえば、single level scpe になるので、 +enter_scope して、st_label では、make_local_scope すれば良いらしい。 + +## 65: } while ( k < j); + la r11,lo16(-20)(r30) + la r10,lo16(-24)(r30) + cmpw cr2,r10,r11 + +なので、rvalue が取れてないみたいね。そう言われてみると、 +IVAR のravalue とかは無視してましたが、RVALUEみたいなのが +いるってこと? + +RINDIRECT で逃げようと思ったが、 + +## 40: if (i>j) return j; + li r11,-3 + lwz r11,lo16(0)(r11) + li r10,5 + lwz r10,lo16(0)(r10) + cmpw cr1,r10,r11 + ble cr1,L_37 + li r10,-3 + lwz r10,lo16(0)(r10) +## 41: else return i; + +const でreplaceする時がまずいな。RIVARみたいなのを作ると、 +ちょっとcaseが増えすぎるが... + + + + + + diff -r 14c7faf78910 -r 53ec17a8af7d mc-codegen.c --- a/mc-codegen.c Sun Dec 25 17:40:11 2005 +0900 +++ b/mc-codegen.c Sun Dec 25 19:46:20 2005 +0900 @@ -3326,6 +3326,8 @@ return(list3(RLVAR+op,cadr(e),caddr(e))); case INDIRECT: return(indirect(RINDIRECT+op,cadr(e))); + case IVAR: + return(indirect(RINDIRECT+op,e)); default:return(e); /* idempotent case? */ } } diff -r 14c7faf78910 -r 53ec17a8af7d mc-inline.c --- a/mc-inline.c Sun Dec 25 17:40:11 2005 +0900 +++ b/mc-inline.c Sun Dec 25 19:46:20 2005 +0900 @@ -434,7 +434,20 @@ static int prindirect(int e) { - return list3(car(e),pexpr(cadr(e)),caddr(e)); + if (cadr(e) && car(cadr(e))==IVAR) { + int lvar=p_lvar(cadr(e)); + if (car(lvar)!=LVAR) { + if (caddr(e)) { + return list3(ADD,lvar,caddr(e)); + } else { + return lvar; + } + } else { + return list3(car(e),lvar,caddr(e)); + } + } else { + return list3(car(e),pexpr(cadr(e)),caddr(e)); + } } static int @@ -706,7 +719,7 @@ } static int -pgen_inline(int e) +p_inline(int e) { int e3; int narg; @@ -766,7 +779,7 @@ case CODE: return list2(car(e1),pexpr(e2)); case INLINE: - return pgen_inline(e1); + return p_inline(e1); case INDIRECT: return prindirect(e1); case RINDIRECT: case URINDIRECT: