Mercurial > hg > CbC > old > device
changeset 512:53ec17a8af7d
inline continue....
author | kono |
---|---|
date | Sun, 25 Dec 2005 19:46:20 +0900 |
parents | 14c7faf78910 |
children | 4c2607e72ab5 |
files | Changes mc-codegen.c mc-inline.c |
diffstat | 3 files changed, 53 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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が増えすぎるが... + + + + + +
--- 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? */ } }
--- 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: