Mercurial > hg > CbC > old > device
changeset 366:2d510935c37d
*** empty log message ***
author | kono |
---|---|
date | Wed, 07 Jul 2004 17:34:32 +0900 |
parents | 5ac17fa9d7e0 |
children | 4efbb07f556b |
files | Changes Makefile mc-code-ia32.c mc-code-mips.c mc-code-powerpc.c mc-codegen.c mc-codegen.h test/scope.code-out |
diffstat | 8 files changed, 115 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Wed Jul 07 14:34:25 2004 +0900 +++ b/Changes Wed Jul 07 17:34:32 2004 +0900 @@ -5525,3 +5525,31 @@ static が global になっちゃってるな。 あ、いけない、なんか壊しちゃったよ。。。 + +bit field って + + e4 = rvalue_t(e2,type); + g_expr(assign_expr0(e2, list4(BFD_REPL,e4,e3,t), type,type)); + +なんだけど、これだと、 + e2 を出力して、push して、 + e2 をもう一回読み込んで load + そして replace + pop して assign +って感じなんだよな。別にいいんだけどさ。 + e2 + load + replace + store +っていうようにしたいんだけど。 + +でも、この部分って long long も通っているから変更するとなると +量が多いんだよな。 + +GVAR + offset が、list2(INDIRECT,list2(ADD..)) に展開されるので、 +simple の方にもっていかれない。ということは、GVAR を GVAR + offset +という構成にした方が良いってことだよね。 + +list2(GVAR,nptr) なんだけど、これを、list2(GVAR,nptr,0) +にすれば良い? まぁねぇ。あんまり使われないとは思うけどね。 +実際、出るコードは変わらないし。
--- a/Makefile Wed Jul 07 14:34:25 2004 +0900 +++ b/Makefile Wed Jul 07 17:34:32 2004 +0900 @@ -80,7 +80,7 @@ make check TARGET=test/bitfield make check TARGET=test/bitfield1 make check TARGET=test/cext - make check TARGET=test/scope STDFLAG="-std=gnu99" +# make check TARGET=test/scope STDFLAG="-std=gnu99" #MK =-make MK= check-all-code: @@ -95,6 +95,7 @@ make check-code$(MK) TARGET=test/tmp2 make check-code$(MK) TARGET=test/tmp4 # make check-code$(MK) TARGET=test/tmp6 + make check-code$(MK) TARGET=test/scope check-nkf: ( cd nkf203; $(CC) -g -o nkf1 nkf.c utf8tbl.c )
--- a/mc-code-ia32.c Wed Jul 07 14:34:25 2004 +0900 +++ b/mc-code-ia32.c Wed Jul 07 17:34:32 2004 +0900 @@ -1555,7 +1555,8 @@ code_const_op_p(int op,int e) { if (car(e)!=CONST) return 0; - if (op==DIV||op==UDIV||op==MOD||op==UMOD) return 0; + if (op==DIV||op==UDIV) return ilog(cadr(e)); + if (op==MOD||op==UMOD) return 0; else return 1; } @@ -1574,9 +1575,13 @@ case ULSHIFT: printf("\tsall $%d,%s\n",orn,crn); return; + case DIV: + orn = ilog(orn); case RSHIFT: printf("\tsarl $%d,%s\n",orn,crn); return; + case UDIV: + orn = ilog(orn); case URSHIFT: printf("\tshrl $%d,%s\n",orn,crn); return; @@ -1607,7 +1612,10 @@ break; case MUL: case UMUL: - printf("\t%s $%d,%s\n","imull",orn,crn); + if (ilog(orn)) { + printf("\tsall $%d,%s\n",ilog(orn),crn); + } else + printf("\t%s $%d,%s\n","imull",orn,crn); break; default: error(-1);
--- a/mc-code-mips.c Wed Jul 07 14:34:25 2004 +0900 +++ b/mc-code-mips.c Wed Jul 07 17:34:32 2004 +0900 @@ -2603,17 +2603,6 @@ if(ox!=-1) free_register(ox); } -static int -ilog(int i) -{ - int j,k; - for(k=1,j=0;j<8;j++,k+=k) { - if (i==k) - return j; - } - return 0; -} - int code_const_op_p(int op,int v) { @@ -2706,6 +2695,22 @@ if(chk) return; crn = register_name(csreg); + if (e<-32767||32766<e) { + rn = register_name(reg= get_register()); + code_const(list2(CONST,e),reg); + switch(cond) { + case 1: + printf("\tbne\t%s,%s,$L_%d\n",crn,rn,label); break; + case 0: + printf("\tbeq\t%s,%s,$L_%d\n",crn,rn,label); break; + case LT: + use_reg(csreg); + printf("\tslt\t%s,%s,%s\n",rn,crn,rn); + printf("\tbne\t%s,$0,$L_%d\n",rn,label); break; + default: error(-1); + } + free_register(reg); + } switch(cond) { case 1: printf("\tbne\t%s,%d,$L_%d\n",crn,e,label); break;
--- a/mc-code-powerpc.c Wed Jul 07 14:34:25 2004 +0900 +++ b/mc-code-powerpc.c Wed Jul 07 17:34:32 2004 +0900 @@ -2485,7 +2485,8 @@ code_const_op_p(int op,int v) { if (car(v)!=CONST) return 0; - if (op==BAND||op==DIV||op==UDIV||op==MOD||op==UMOD) return 0; + if (op==DIV||op==UDIV) return ilog(v); + if (op==BAND||op==MOD||op==UMOD) return 0; v = cadr(v); return (-32766<v&&v<32767); } @@ -2494,6 +2495,7 @@ oprtc(int op,int creg, int v) { char *crn; + int l; use_int(creg); crn = register_name(creg); v = cadr(v); @@ -2503,9 +2505,13 @@ case ULSHIFT: printf("\tslwi %s,%s,%d\n",crn,crn,v); return; + case DIV: + v = ilog(v); case RSHIFT: printf("\tsrawi %s,%s,%d\n",crn,crn,v); return; + case UDIV: + v = ilog(v); case URSHIFT: printf("\tsrwi %s,%s,%d\n",crn,crn,v); return; @@ -2530,10 +2536,11 @@ printf("\tori %s,%s,lo16(%d)\n",crn,crn,v); break; case MUL: - printf("\tmulli %s,%s,lo16(%d)\n",crn,crn,v); - break; case UMUL: - printf("\tmulli %s,%s,lo16(%d)\n",crn,crn,v); + if ((l=ilog(v))) { + printf("\tslwi %s,%s,%d\n",crn,crn,l); + } else + printf("\tmulli %s,%s,lo16(%d)\n",crn,crn,v); break; default: error(-1); @@ -2570,6 +2577,7 @@ void code_cmpdimm(int e, int csreg,int label,int cond) { + int reg; /* used in dosiwtch() */ if(chk) return; inc_cmpflag(); @@ -2577,7 +2585,11 @@ printf("\tcmpwi cr%d,%s,%d\n",cmpflag,register_name(csreg),e); jcond(label,cond); } else { - error(-1); /* !? */ + reg = get_register(); + code_const(list2(CONST,e),reg); + printf("\tcmpw cr%d,%s,%s\n",cmpflag,register_name(csreg),register_name(reg)); + jcond(label,cond); + free_register(reg); } }
--- a/mc-codegen.c Wed Jul 07 14:34:25 2004 +0900 +++ b/mc-codegen.c Wed Jul 07 17:34:32 2004 +0900 @@ -3798,5 +3798,31 @@ return r; } +extern int +ilog(int i) +{ + switch(i) { + case 2: return 1; + case 4: return 2; + case 8: return 3; + case 16: return 4; + case 32: return 5; + case 64: return 6; + case 128: return 7; + case 256: return 8; + case 512: return 9; + case 1024: return 10; + case 2048: return 11; + case 4096: return 12; + case 8192: return 13; + case 16384: return 14; + case 32768: return 15; + case 65536: return 16; + case 131072: return 17; + case 262144: return 18; + case 524288: return 19; + } + return 0; +} /* end */