From 9e99383df51327e52b5484d849a4a1d861375c22 Mon Sep 17 00:00:00 2001 From: Kai Backman Date: Sun, 25 Oct 2009 11:51:48 -0700 Subject: [PATCH] frame size > StackBig support R=rsc http://go/go-review/1015010 --- src/cmd/5l/noop.c | 56 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 7 deletions(-) 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; -- 2.50.0