From: Kai Backman Date: Sun, 25 Oct 2009 18:51:48 +0000 (-0700) Subject: frame size > StackBig support X-Git-Tag: weekly.2009-11-06~202 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9e99383df51327e52b5484d849a4a1d861375c22;p=gostls13.git frame size > StackBig support R=rsc http://go/go-review/1015010 --- diff --git a/src/cmd/5l/noop.c b/src/cmd/5l/noop.c index e932750b54..f67deb821f 100644 --- a/src/cmd/5l/noop.c +++ b/src/cmd/5l/noop.c @@ -360,7 +360,7 @@ noops(void) // CMP R1, $-autosize(SP) // MOVW.LO $autosize, R1 // MOVW.LO $args, R2 - // MOVW.W.LO R14, R3 + // MOVW.LO R14, R3 // BL.LO runtime·morestack(SB) // modifies LR // MOVW.W R14,$-autosize(SP) @@ -403,7 +403,7 @@ noops(void) p->to.type = D_REG; p->to.reg = 2; - // MOVW.W.LO R14, R3 + // MOVW.LO R14, R3 p = appendp(p); p->as = AMOVW; p->scond = C_SCOND_LO; @@ -430,11 +430,53 @@ noops(void) p->to.offset = -autosize; p->to.reg = REGSP; } else { // > StackBig - // MOVW.W R14,$-4(SP) - // MOVW $(args << 24 | autosize), R1 - // BL callmorestack(SB) - // TODO(kaib): Fix large stacks, don't use packing - diag("StackBig broken"); + // MOVW $autosize, R1 + // MOVW $args, R2 + // MOVW R14, R3 + // BL runtime·morestack(SB) // modifies LR + // MOVW.W R14,$-autosize(SP) + + // MOVW $autosize, R1 + p = appendp(p); + p->as = AMOVW; + p->from.type = D_CONST; + p->from.offset = autosize; + p->to.type = D_REG; + p->to.reg = 1; + + // MOVW $args +4, R2 + // also need to store the extra 4 bytes. + p = appendp(p); + p->as = AMOVW; + p->from.type = D_CONST; + p->from.offset = (curtext->to.offset2 & ~7) + 4; + p->to.type = D_REG; + p->to.reg = 2; + + // MOVW R14, R3 + p = appendp(p); + p->as = AMOVW; + p->from.type = D_REG; + p->from.reg = REGLINK; + p->to.type = D_REG; + p->to.reg = 3; + + // BL runtime·morestack(SB) // modifies LR + p = appendp(p); + p->as = ABL; + p->to.type = D_BRANCH; + p->to.sym = symmorestack; + p->cond = pmorestack; + + // MOVW.W R14,$-autosize(SP) + p = appendp(p); + p->as = AMOVW; + p->scond |= C_WBIT; + p->from.type = D_REG; + p->from.reg = REGLINK; + p->to.type = D_OREG; + p->to.offset = -autosize; + p->to.reg = REGSP; } break;