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 を含めた変換をしないと構文解析できないし。
+