From 5cc32a5348170eed078767f31a8733505cc7dfaf Mon Sep 17 00:00:00 2001 From: Kai Backman Date: Mon, 26 Oct 2009 08:02:19 -0700 Subject: [PATCH] fix defer. gave up on unified code for defer and go for now. R=rsc http://go/go-review/1014010 --- src/cmd/5g/ggen.c | 54 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 5 deletions(-) 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; } } -- 2.50.0