Mercurial > hg > CbC > old > device
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));