Mercurial > hg > CbC > old > device
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 */