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: