From: Kai Backman Date: Mon, 26 Oct 2009 15:02:19 +0000 (-0700) Subject: fix defer. gave up on unified code for defer and go for now. X-Git-Tag: weekly.2009-11-06~200 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5cc32a5348170eed078767f31a8733505cc7dfaf;p=gostls13.git fix defer. gave up on unified code for defer and go for now. R=rsc http://go/go-review/1014010 --- diff --git a/src/cmd/5g/ggen.c b/src/cmd/5g/ggen.c index f499fa6e48..ddd693605e 100644 --- a/src/cmd/5g/ggen.c +++ b/src/cmd/5g/ggen.c @@ -123,8 +123,8 @@ ginscall(Node *f, int proc) afunclit(&p->to); break; + // TODO(kaib): unify newproc and defer if you can figure out how not to break things case 1: // call in new proc (go) - case 2: // defered call (defer) regalloc(&r, types[tptr], N); p = gins(AMOVW, N, &r); p->from.type = D_OREG; @@ -154,10 +154,7 @@ ginscall(Node *f, int proc) p->to.offset = 4; regfree(&r); - if(proc == 1) - ginscall(newproc, 0); - else - ginscall(deferproc, 0); + ginscall(newproc, 0); regalloc(&r, types[tptr], N); p = gins(AMOVW, N, &r); @@ -172,6 +169,53 @@ ginscall(Node *f, int proc) p->scond |= C_WBIT; regfree(&r); + break; + + case 2: // defered call (defer) + regalloc(&r, types[tptr], N); + p = gins(AMOVW, N, &r); + p->from.type = D_OREG; + p->from.reg = REGSP; + + p = gins(AMOVW, &r, N); + p->to.type = D_OREG; + p->to.reg = REGSP; + p->to.offset = -8; + p->scond |= C_WBIT; + + memset(&n1, 0, sizeof n1); + n1.op = OADDR; + n1.left = f; + gins(AMOVW, &n1, &r); + + p = gins(AMOVW, &r, N); + p->to.type = D_OREG; + p->to.reg = REGSP; + p->to.offset = 8; + + nodconst(&con, types[TINT32], argsize(f->type)); + gins(AMOVW, &con, &r); + p = gins(AMOVW, &r, N); + p->to.type = D_OREG; + p->to.reg = REGSP; + p->to.offset = 4; + regfree(&r); + + ginscall(deferproc, 0); + + regalloc(&r, types[tptr], N); + p = gins(AMOVW, N, &r); + p->from.type = D_OREG; + p->from.reg = REGSP; + p->from.offset = 0; + + p = gins(AMOVW, &r, N); + p->to.type = D_OREG; + p->to.reg = REGSP; + p->to.offset = 8; + p->scond |= C_WBIT; + regfree(&r); + break; } }