Mercurial > hg > CbC > old > device
changeset 14:77c0710a8729
struct copy
author | kono |
---|---|
date | Mon, 17 Jan 2000 01:20:59 +0900 |
parents | a8a812dace23 |
children | 6667dbd4f718 |
files | mc-nop-386.c mc-parse.c |
diffstat | 2 files changed, 27 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/mc-nop-386.c Mon Jan 17 00:43:06 2000 +0900 +++ b/mc-nop-386.c Mon Jan 17 01:20:59 2000 +0900 @@ -757,37 +757,40 @@ break; default: if (length <=MAX_COPY_LEN) { - for(;length>4;length-=4,offset+=4); + for(;length>=4;length-=4,offset+=4) emit_copy(from,to,4,offset); - for(;length>2;length-=2,offset+=2); + for(;length>=2;length-=2,offset+=2) emit_copy(from,to,2,offset); if(length>0) emit_copy(from,to,length,offset); return; } - printf("\texch %%edi,%s\n",from); - printf("\texch %%esi,%s\n",to); - printf("\texch %%ecx,%s\n",drn); - printf("\tmovl $%d,%%ecx\n",length); + printf("\txchg %%edi,%s\n",from); + printf("\txchg %%esi,%s\n",to); + printf("\txchg %%ecx,%s\n",drn); + printf("\tmovl $%d,%%ecx\n",length/4); printf("\tcld\n\trep\n\tmovsl\n"); - printf("\texch %%ecx,%s\n",drn); - printf("\texch %%esi,%s\n",to); - printf("\texch %%edi,%s\n",from); + printf("\txchg %%ecx,%s\n",drn); + printf("\txchg %%esi,%s\n",to); + printf("\txchg %%edi,%s\n",from); + if(length%4) { + emit_copy("%esi","%edi",length,offset+length/4); + } } } int struct_push(int e4,int t) { - int e5; + int length; g_expr(e4); - e5=size(t); - if(e5%size_of_int) { - e5 += size_of_int - (e5%size_of_int); + length=size(t); + if(length%size_of_int) { + length += size_of_int - (length%size_of_int); } - printf("\tsubl $%d,%%esp\n",e5); - if (e5<=MAX_COPY_LEN) - emit_copy(crn,"%esp",e5,0); + printf("\tsubl $%d,%%esp\n",length); + if (length<=MAX_COPY_LEN) + emit_copy(crn,"%esp",length,0); else { printf("\tpushl %%edi\n"); printf("\tpushl %%esi\n"); @@ -795,13 +798,13 @@ printf("\tleal 12(%%esp),%%di\n"); if (rname[creg]!=REG_ESI) printf("\tmovl %s,%%esi\n",crn); - printf("\tmovl $%d,%%ecx\n",e5); + printf("\tmovl $%d,%%ecx\n",length/size_of_int); printf("\tcld\n\trep\n\tmovsl\n"); printf("\tpopl %%ecx\n"); printf("\tpopl %%esi\n"); printf("\tpopl %%edi\n"); } - return e5/size_of_int; + return length/size_of_int; } void @@ -1032,7 +1035,7 @@ e2 = cadr(e1); e3 = cadr(e2); e4 = caddr(e1); - sz = size(cadr(e2)); /* cld rep movsb */ + sz = cadddr(e1); /* cld rep movsb */ g_expr(e4); emit_push(); g_expr(e2);
--- a/mc-parse.c Mon Jan 17 00:43:06 2000 +0900 +++ b/mc-parse.c Mon Jan 17 01:20:59 2000 +0900 @@ -722,9 +722,9 @@ nsc = LVAR; ndsp = (disp -= sz); } + n->sc = nsc; + n->dsp = ndsp; if(sym==ASS) { - n->sc = nsc; - n->dsp = ndsp; decl_data(type,n,0); } return; @@ -776,7 +776,7 @@ } else if (scalar(t)) { ass = list3(ASS,list2(LVAR,n->dsp+offset),e); } else if (car(t)==STRUCT || car(t)==UNION || car(t)==STRING) { - ass = list3(SASS,list2(LVAR,n->dsp+offset),e); + ass = list4(SASS,list2(LVAR,n->dsp+offset),e,size(t)); } else { error(DCERR); } @@ -1410,8 +1410,8 @@ error(TYERR); if(t==CHAR) { type= INT;return(list3(CASS,e1,e2)); - } else if(t==STRUCT||t==UNION) { - type= t;return(list3(SASS,e1,e2)); + } else if(!scalar(t)&&(car(t)==STRUCT||car(t)==UNION)) { + type= t;return(list4(SASS,e1,e2,size(t))); } type=t; return(list3(ASS,e1,e2));