changeset 566:ddc435b64fc8

binop/inline interaction
author kono
date Wed, 11 Jan 2006 13:59:06 +0900
parents dbe0b9ac9f53
children 790ecb8900f0
files .gdbinit Changes mc-code-arm.c mc-codegen.c mc-inline.c mc.h
diffstat 6 files changed, 127 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/.gdbinit	Wed Jan 11 10:48:05 2006 +0900
+++ b/.gdbinit	Wed Jan 11 13:59:06 2006 +0900
@@ -47,8 +47,8 @@
 # run -s test/too-long-argument.c
 # run -s test/strinit.c
 # run -DINLINE=inline test/scope.c
-# run -DINLINE=inline test/code-gen-all.c
+run -DINLINE=inline test/code-gen-all.c
 # run  -DINLINE=inline test/bitfield1.c
 # run -s test/linux_kernel.c.--- 
 # run -s test/stralign.c
-run -s test/putenemy.c
+# run -s test/putenemy.c
--- 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 を含めた変換をしないと構文解析できないし。
+
--- a/mc-code-arm.c	Wed Jan 11 10:48:05 2006 +0900
+++ b/mc-code-arm.c	Wed Jan 11 13:59:06 2006 +0900
@@ -1225,7 +1225,7 @@
      nth element has offset n * SIZE_OF_INT
  */
 
-#define CONST_TBL_COUNT 200
+#define CONST_TBL_COUNT 100
 
 static int
 search_const(int tag,int value,int *label)
--- a/mc-codegen.c	Wed Jan 11 10:48:05 2006 +0900
+++ b/mc-codegen.c	Wed Jan 11 13:59:06 2006 +0900
@@ -3686,7 +3686,7 @@
 fdbinop(int op, int e1, int e2, int t1, int t2, int dop)
 {
     double d1,d2,d;
-    int b=0;
+    int b=0,t;
 
     if (dop==DOP) {
 	type=t1; e1=double_value(e1);
@@ -3750,20 +3750,23 @@
 	    car(e2)==DRLVAR || car(e2)==DRGVAR ||
 	    car(e2)==FRLVAR || car(e2)==FRGVAR
 	)) {
+	if (inmode)  return list3(ST_OP,op,list4(e2,e1,type,type));
 	return(list3(op+dop,e2,e1));
     }
+    if(op==ADD||op==SUB||op==MUL||op==DIV) {
+	if (inmode)  return list3(ST_OP,op,list4(e1,e2,type,type));
+	return(list3(op+dop,e1,e2));
+    }
+    t = type;
+    type=INT;
+    if (inmode)  return list3(ST_OP,op,list4(e1,e2,t,t));
     if(op==LT) {
-	type=INT;
 	return(list3(GT+dop,e2,e1));
     } else if(op==LE) {
-	type=INT;
 	return(list3(GE+dop,e2,e1));
     } else if(op==GT||op==GE||op==EQ||op==NEQ) {
-	type=INT;
 	return(list3(op+dop,e1,e2));
-    } else if(op==ADD||op==SUB||op==MUL||op==DIV)
-	return(list3(op+dop,e1,e2));
-    else {
+    } else {
 	error(-1);
 	return e1;
     }
@@ -3796,9 +3799,11 @@
     if (us||(t1==ULONGLONG&&(op==LSHIFT||op==RSHIFT))) {
 	type=t1; e1=ulonglong_value(e1);
 	type=t2; e2=ulonglong_value(e2);
+	t1=t2=ULONGLONG;
     } else {
 	type=t1; e1=longlong_value(e1);
 	type=t2; e2=longlong_value(e2);
+	t1=t2=LONGLONG;
     }
     if(car(e1)==LCONST&&car(e2)==LCONST) {
 	le1=lcadr(e1);
@@ -3856,13 +3861,6 @@
 	}
 	return llist2(LCONST,le);
     }
-    if(op==LT) {
-	type = INT; return(list3(GT+LOP+us,e2,e1));
-    } else if(op==LE) {
-	type = INT; return(list3(GE+LOP+us,e2,e1));
-    } else if(op==GT||op==GE||op==LT||op==LE) {
-	type = INT; return(list3(op+LOP+us,e1,e2));
-    }
     if(op==SUB) { us = 0; type=LONGLONG; }
     if(op==SUB&&car(e2)==LCONST) { op=ADD; lcadr(e2)=-lcadr(e2); }
     if((op==ADD||op==MUL||op==BOR||op==EOR||op==BAND)&&
@@ -3873,8 +3871,10 @@
 	e=e1;e1=e2;e2=e;e=t1;t1=t2;t2=e;
     }
     if((op==MUL||op==DIV)&&car(e2)==LCONST&&lcadr(e2)==1) return e1;
-    if(op==BOR||op==EOR||op==BAND||op==ADD||op==SUB||op==EQ||op==NEQ) 
+    if(op==BOR||op==EOR||op==BAND||op==ADD||op==SUB) {
+	if (inmode)  return list3(ST_OP,op,list4(e1,e2,t1,t2));
 	return(list3(op+LOP,e1,e2));
+    }
     if(op==LSHIFT && car(e2)==LCONST) {
 	if (lcadr(e2)==0) return e1;
 	else if (lcadr(e2)>63) return llist2(LCONST,0);
@@ -3882,8 +3882,26 @@
     if(op==RSHIFT && car(e2)==LCONST) {
 	if (lcadr(e2)==0) return e1;
     }
-    if(op==LSHIFT||op==RSHIFT) return(list3(op+LOP+(t1==ULONGLONG),e1,e2));
-    return(list3(op+LOP+us,e1,e2));
+    if(op==LSHIFT||op==RSHIFT) {
+	if (inmode)  return list3(ST_OP,op,list4(e1,e2,t1,t2));
+	return(list3(op+LOP+(t1==ULONGLONG),e1,e2));
+    }
+    if (op==DIV||op==MUL||op==ADD||op==SUB||op==MOD||op==EQ||op==NEQ) {
+	if (inmode)  return list3(ST_OP,op,list4(e1,e2,t1,t2));
+	return(list3(op+LOP,e1,e2));
+    }
+
+    type = INT;
+    if (inmode)  return list3(ST_OP,op,list4(e1,e2,t1,t2));
+    if(op==LT) {
+	return(list3(GT+LOP+us,e2,e1));
+    } else if(op==LE) {
+	return(list3(GE+LOP+us,e2,e1));
+    } else if(op==GT||op==GE||op==LT||op==LE) {
+	return(list3(op+LOP+us,e1,e2));
+    } else
+	error(-1);
+    return 0; /* not reached */
 }
 #endif
 
@@ -3994,35 +4012,46 @@
 	return list2(CONST,e);
     }
     if(op==GT||op==GE||op==LT||op==LE) {
+	if (inmode)  return list3(ST_OP,op,list4(e1,e2,t1,t2));
 	return(car(e1)==CONST?list3(rop_dual(op)+us,e2,e1):list3(op+us,e1,e2));
     } else if(op==EQ||op==NEQ) {
+	if (inmode)  return list3(ST_OP,op,list4(e1,e2,t1,t2));
 	return(car(e1)==CONST?list3(op,e2,e1):list3(op,e1,e2));
     }
     if(op==SUB&&car(e2)==CONST) { op=ADD; cadr(e2)=-cadr(e2); }
-    if((op==ADD||op==MUL||op==BOR||op==EOR||op==BAND)&&
-	(car(e1)!=CONST&& (
-	    car(e2)==RGVAR||car(e2)==RLVAR||
-	    car(e2)==URGVAR||car(e2)==URLVAR||
-	    car(e2)==SRGVAR||car(e2)==SRLVAR||
-	    car(e2)==SURGVAR||car(e2)==SURLVAR||
-	    car(e2)==CRGVAR||car(e2)==CRLVAR||
-	    car(e2)==CURGVAR||car(e2)==CURLVAR
-	    ))) {
-	e=e1;e1=e2;e2=e;e=t1;t1=t2;t2=e;
+    if((op==ADD||op==MUL||op==BOR||op==EOR||op==BAND)&& (car(e1)!=CONST)) {
+	switch(car(e2)) {
+	    case RGVAR: case RLVAR:
+	    case URGVAR: case URLVAR:
+	    case SRGVAR: case SRLVAR:
+	    case SURGVAR: case SURLVAR:
+	    case CRGVAR: case CRLVAR:
+	    case CURGVAR: case CURLVAR:
+	    e=e1;e1=e2;e2=e;e=t1;t1=t2;t2=e;
+	}
     }
     if(op==ADD) {
 	if(integral(t1)) {
 	    if(integral(t2)) {
 		// if(t1==INT) type=t2;else type=t1;
 		if (us) type=UNSIGNED; else type=INT;
+		if (inmode)  return list3(ST_OP,op,list4(e1,e2,t1,t2));
 		return(list3(ADD,e1,e2));
 	    }
 	    if(car(t2)!=POINTER) error(TYERR);
+	    if (inmode) {
+		type=t2;
+	       	return list3(ST_OP,op,list4(e1,e2,t1,t2));
+	    }
 	    e=binop(MUL,e1,list2(CONST,size(cadr(t2))),t1,INT);
 	    type=t2;
 	    return(list3(ADD,e,e2));
 	}
 	if(car(t1)!=POINTER||!integral(t2)) error(TYERR);
+	if (inmode) {
+	    type=t1;
+	    return list3(ST_OP,op,list4(e1,e2,t1,t2));
+	}
 	e=binop(MUL,e2,list2(CONST,size(cadr(t1))),t2,INT);
 	type=t1;
 	if (car(e)==CONST && cadr(e)==0)
@@ -4053,10 +4082,15 @@
 	    if(!integral(t2)) error(TYERR);
 	    if(t1==INT) type=t2;else type=t1;
 	    if (type==UNSIGNED) type=INT;
+	    if (inmode)  return list3(ST_OP,op,list4(e1,e2,t1,t2));
 	    return(list3(SUB,e1,e2));
 	}
 	if(car(t1)!=POINTER) error(TYERR);
 	if(integral(t2)) {
+	    if (inmode) {
+		type=t1;
+	       	return list3(ST_OP,op,list4(e1,e2,t1,t2));
+	    }
 	    e=binop(MUL,e2,list2(CONST,size(cadr(t1))),t2,INT);
 	    type=t1;
 	    if (car(e)==CONST) error(-1);
@@ -4065,6 +4099,10 @@
 	if(car(t2)!=POINTER)
 	    error(TYERR);
 	compatible(t1,t2);
+	if (inmode) {
+	    type= INT;
+	    return list3(ST_OP,op,list4(e1,e2,t1,t2));
+	}
 	e=list3(SUB,e1,e2);
 	e=binop(DIV,e,list2(CONST,size(cadr(t1))),INT,INT);
 	type= INT;
@@ -4073,6 +4111,7 @@
     if(!integral(t1)||!integral(t2)) error(TYERR);
     // if(t1==INT) type=t2; else type=t1;  /* ??? */
     if (us) type=UNSIGNED; else type=INT;
+    if (inmode) return list3(ST_OP,op,list4(e1,e2,t1,t2));
     if((op==MUL||op==DIV)&&car(e2)==CONST&&cadr(e2)==1) return e1;
     if(op==BOR||op==EOR||op==BAND) return(list3(op,e1,e2));
     if(op==LSHIFT||op==RSHIFT) return(list3(op+(t1==UNSIGNED?US:0),e1,e2));
--- a/mc-inline.c	Wed Jan 11 10:48:05 2006 +0900
+++ b/mc-inline.c	Wed Jan 11 13:59:06 2006 +0900
@@ -927,6 +927,10 @@
 	return prindirect(e1);
     case ADDRESS:
 	return paddress(e1);
+    case ST_OP:
+	e3=caddr(e1);
+	e1=pexpr(car(e3));
+	return binop(e2,e1,pexpr(cadr(e3)),caddr(e3),cadddr(e3));
     case MINUS:
 	if ((e3 = pexpr(e2))==e2) return e1;
 	if ((e3 = pexpr(e2))==e2) return e1;
--- a/mc.h	Wed Jan 11 10:48:05 2006 +0900
+++ b/mc.h	Wed Jan 11 13:59:06 2006 +0900
@@ -427,11 +427,12 @@
 #define ST_GOTO		127
 #define ST_ASM		128
 #define ST_LABEL	129
-#define ST_COMMENT	130
+#define ST_OP		130
+#define ST_COMMENT	131
 
 #define IS_STATEMENT(i) (i==INLINE||(ST_DECL<=i&&i<=ST_COMMENT))
 
-#define HAS_ADDRESS	131
+#define HAS_ADDRESS	132
 
 /* statement end */