From 1d0b65d33f9a8c3916a64a869b89bae800fc150f Mon Sep 17 00:00:00 2001 From: Kai Backman Date: Fri, 30 Oct 2009 09:38:30 -0700 Subject: [PATCH] added missing sgen reverse character copy code. R=rsc http://go/go-review/1018006 --- src/cmd/5g/cgen.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) 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