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 */
--- a/mc-codegen.h	Wed Jul 07 14:34:25 2004 +0900
+++ b/mc-codegen.h	Wed Jul 07 17:34:32 2004 +0900
@@ -92,4 +92,6 @@
 extern void clear_ptr_cache() ;
 extern int get_ptr_cache(NMTBL *nptr);
 
+extern int ilog(int i);
+
 /* end */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/scope.code-out	Wed Jul 07 17:34:32 2004 +0900
@@ -0,0 +1,14 @@
+f 2
+2nd inner 3 0 0
+inner 4 0 0
+f 1
+2nd inner 4 1 0
+inner 4 1 0
+f 0
+inner 4 2 0
+f -1
+2nd inner 6 3 0
+inner 4 3 0
+f -2
+2nd inner 7 4 0
+outer 3 10 1