changeset 339:375d21a2b845

emit_data
author kono
date Fri, 25 Jun 2004 21:28:01 +0900
parents 7fe7ce0a791f
children 0150de6a3244
files Changes README README.jp mc-code-powerpc.c mc-codegen.c
diffstat 5 files changed, 81 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Fri Jun 25 14:30:43 2004 +0900
+++ b/Changes	Fri Jun 25 21:28:01 2004 +0900
@@ -5189,3 +5189,16 @@
     if (post) tmp_var;
 
 ですかね。
+
+Fri Jun 25 14:49:57 JST 2004
+
+もう少し複雑だった。でも、終りました。codegen level で
+終るのは良いよね。
+
+まぁ、bit-field も、
+
+     constant assign の時の最適化 (and/or mask の計算)
+     1 bit の時の特別命令を使う?
+     bit.r == 1 を、and 0x100 にコンパイルする
+
+とかいろいろやることはあるけど、意味ないよな...
--- a/README	Fri Jun 25 14:30:43 2004 +0900
+++ b/README	Fri Jun 25 21:28:01 2004 +0900
@@ -149,4 +149,4 @@
 //  #include does not search, sources current directory.
  #include does search, sources current directory.
 
-
+bit-field is supported, but no global initialization of bit-field.
--- a/README.jp	Fri Jun 25 14:30:43 2004 +0900
+++ b/README.jp	Fri Jun 25 21:28:01 2004 +0900
@@ -138,13 +138,13 @@
 //浮動小数点レジスタへの代入計算はできません。
 //    *=, /=, +=.
 
-built-in allocaはありません。
+// built-in allocaはありません。
 
-varargs もないです。
+// varargs もないです。
 
-Switch 文は、分岐にコンパイルされます。テーブルは生成されません。
+// Switch 文は、分岐にコンパイルされます。テーブルは生成されません。
 
-マクロの機能のうち連結とかは動きません。
+// マクロの機能のうち連結とかは動きません。
 
 マクロはコルーチンで、プリプロセッサではありません。振舞いがcppと
 少し異なります。
@@ -156,5 +156,7 @@
 // #include は、呼び出したソースコードのカレントディレクトリをサーチしません。
  #include は、呼び出したソースコードのカレントディレクトリをサーチします。
 
+bit-field (こんなの要らないけどさ...)
+
 その他、たくさん。ANSI コンパチを目指しているわけではないので...
 
--- a/mc-code-powerpc.c	Fri Jun 25 14:30:43 2004 +0900
+++ b/mc-code-powerpc.c	Fri Jun 25 21:28:01 2004 +0900
@@ -2956,59 +2956,75 @@
     } else {
 	data_mode(0);
     }
-    if (t==EMPTY) {
+    switch(t) {
+    case EMPTY:
 	if(car(e)!=CONST) error(-1);
 	printf("\t.space\t%d\n",cadr(e));
 	return;
-    }
-    if(car(e)==CONST) {       
-	if (t==CHAR||t==UCHAR) {
-	    printf("\t.byte %d\n",cadr(e));
-	    if (data_alignment>0)
-		data_alignment++;
-	    gpc += 1;
-	} else if (t==SHORT||t==USHORT) {
-	    printf("\t.short %d\n",cadr(e));
-	    if (data_alignment>0) data_alignment++;
-	    gpc += SIZE_OF_SHORT;
-	} else if (t==INT||t==UNSIGNED||t==ENUM||(t>0&&car(t)==POINTER)) {
-	    printf("\t.long %d\n",cadr(e));
-	    gpc += SIZE_OF_INT;
-	} else {
-	    // fprintf(stderr,"type= %d\n",t);
-	    error(TYERR);
-	}
+    case CHAR: case UCHAR:
+	printf("\t.byte %d\n",cadr(e));
+	if (data_alignment>0)
+	    data_alignment++;
+	return;
+    case SHORT: case USHORT:
+	printf("\t.short %d\n",cadr(e));
+	if (data_alignment>0) data_alignment++;
+	return;
+    case INT: case UNSIGNED: case ENUM:
+	printf("\t.long %d\n",cadr(e));
+	return;
 #if LONGLONG_CODE
-    } else if(t==LONGLONG||t==ULONGLONG) {       
+    case LONGLONG: case ULONGLONG:
 	ll = lcadr(e);
 	printf("\t.long\t0x%x,0x%x\n",code_l2(ll),code_l1(ll));
+	return;
 #endif
 #if FLOAT_CODE
-    } else if(t==DOUBLE) {       
+    case DOUBLE:
 	d = dcadr(e);
 	printf("\t.long\t0x%x,0x%x\n",code_d2(d),code_d1(d));
-    } else if(t==FLOAT) {       
+	return;
+    case FLOAT:
 	f = dcadr(e);
 	printf("\t.long\t0x%x\n",*(int *)&f);
+	return;
 #endif
-    } else if(t!=CHAR) {       
-	gpc += SIZE_OF_INT;
-	if(car(e)==ADDRESS&&car(cadr(e))==GVAR) {
-	    printf("\t.long _%s\n",((NMTBL *)cadr(cadr(e)))->nm);
-	} else if(car(e)==FNAME) {
-	    printf("\t.long _%s\n",((NMTBL *)cadr(e))->nm);
-	} else if(car(e)==GVAR) {
+    default:
+	if (t<0) error(-1);
+#if BIT_FIELD_CODE
+	if (car(t)==BIT_FIELD) {
+	    return;
+	}
+#endif
+	if (car(t)!=POINTER&&car(t)!=ARRAY) error(-1);
+	switch(car(e)) {
+	case CONST:
+	    printf("\t.long %d\n",cadr(e));
+	    return;
+	case ADDRESS:
+	    if (car(cadr(e))==GVAR)
+		printf("\t.long _%s\n",((NMTBL *)cadr(cadr(e)))->nm);
+	    else error(INERR);
+	    return;
+	case FNAME:
 	    printf("\t.long _%s\n",((NMTBL *)cadr(e))->nm);
-	} else if(car(e)==STRING) {       
-            if (car(n->ty)!=ARRAY || cadr(n->ty)!=CHAR) {
-                l = emit_string_label();
-                ascii((char *)cadr(e));
-                data_mode(0);
-                printf("\t.long L_%d\n",l);
-            } else
-                ascii((char *)cadr(e));
-	} else error(TYERR);
-    } else error(TYERR);
+	    return;
+	case GVAR:
+	    printf("\t.long _%s\n",((NMTBL *)cadr(e))->nm);
+	    return;
+	case STRING:
+	    if (car(n->ty)!=ARRAY || cadr(n->ty)!=CHAR) {
+		l = emit_string_label();
+		ascii((char *)cadr(e));
+		data_mode(0);
+		printf("\t.long L_%d\n",l);
+	    } else
+		ascii((char *)cadr(e));
+	    return;
+	}
+    // fprintf(stderr,"# type= %d\n",t);
+    }
+    error(INERR);
 }
 
 void
--- a/mc-codegen.c	Fri Jun 25 14:30:43 2004 +0900
+++ b/mc-codegen.c	Fri Jun 25 21:28:01 2004 +0900
@@ -3231,10 +3231,9 @@
     int n,e4;
     int type  = cadr(t);
     /*  e2 = e3 */
-if (car(e2)==BIT_FIELD) {
-    printf("# bit_field_bug\n");
-    e2 = cadr(e2);
-}
+    if (car(e2)==BIT_FIELD) {
+	e2 = cadr(e2);
+    }
     if (car(e2)==LREGISTER||car(e2)==REGISTER||car(e2)==LVAR||car(e2)==GVAR) {
 	e4 = rvalue_t(e2,type);
 	g_expr(assign_expr0(e2, list4(BFD_REPL,e4,e3,t), type,type));
@@ -3287,10 +3286,9 @@
     n1 = list2(LVAR,new_lvar(size(type)));
     if (post) n2 = list2(LVAR,new_lvar(size(type)));
     /*  e2 = e3 */
-if (car(e2)==BIT_FIELD) {
-    printf("# bit_field_bug\n");
-    e2 = cadr(e2);
-}
+    if (car(e2)==BIT_FIELD) {
+	e2 = cadr(e2);
+    }
     if (!(car(e2)==LREGISTER||car(e2)==REGISTER||car(e2)==LVAR||car(e2)==GVAR)) {
 	adr = list2(LVAR,new_lvar(size(type)));
 	g_expr_u(assign_expr0(adr,list2(ADDRESS,cadr(e2)),INT,INT));