]> Cypherpunks repositories - gostls13.git/commitdiff
fix defer. gave up on unified code for defer and go for now.
authorKai Backman <kaib@golang.org>
Mon, 26 Oct 2009 15:02:19 +0000 (08:02 -0700)
committerKai Backman <kaib@golang.org>
Mon, 26 Oct 2009 15:02:19 +0000 (08:02 -0700)
R=rsc
http://go/go-review/1014010

src/cmd/5g/ggen.c

index f499fa6e485cea64b83cc5cce1cb6a63b47bb791..ddd693605e050118502a556aab090c16c06d9795 100644 (file)
@@ -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;
        }
 }