From: Kai Backman Date: Fri, 30 Oct 2009 16:38:30 +0000 (-0700) Subject: added missing sgen reverse character copy code. X-Git-Tag: weekly.2009-11-06~173 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=1d0b65d33f9a8c3916a64a869b89bae800fc150f;p=gostls13.git added missing sgen reverse character copy code. R=rsc http://go/go-review/1018006 --- diff --git a/src/cmd/5g/cgen.c b/src/cmd/5g/cgen.c index bcbc979245..e46efdae74 100644 --- a/src/cmd/5g/cgen.c +++ b/src/cmd/5g/cgen.c @@ -1084,7 +1084,7 @@ sgen(Node *n, Node *res, int32 w) regalloc(&dst, types[tptr], res); if(n->ullman >= res->ullman) { - agen(n, &dst); + agen(n, &dst); // temporarily use dst regalloc(&src, types[tptr], N); gins(AMOVW, &dst, &src); agen(res, &dst); @@ -1137,6 +1137,29 @@ sgen(Node *n, Node *res, int32 w) patch(gbranch(ABNE, T), ploop); regfree(&nend); + } else { + // move src and dest to the end of block + p = gins(AMOVW, &src, &src); + p->from.type = D_CONST; + p->from.offset = (q-1)*4; + + p = gins(AMOVW, &dst, &dst); + p->from.type = D_CONST; + p->from.offset = (q-1)*4; + + while(q > 0) { + p = gins(AMOVW, &src, &tmp); + p->from.type = D_OREG; + p->from.offset = -4; + p->scond |= C_PBIT; + + p = gins(AMOVW, &tmp, &dst); + p->to.type = D_OREG; + p->to.offset = -4; + p->scond |= C_PBIT; + + q--; + } } } else { // normal direction