From 231fcea7e60ebf76d01b6ebd6534558ac079fe3c Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 20 Oct 2010 18:11:53 -0400 Subject: [PATCH] 5l: two stack split bugs in one day An ARM expert could probably phrase the comparison in fewer instructions, but this works. R=ken2 CC=golang-dev https://golang.org/cl/2620041 --- src/cmd/5l/noop.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/cmd/5l/noop.c b/src/cmd/5l/noop.c index a3a0ae29b25..5def0d3f169 100644 --- a/src/cmd/5l/noop.c +++ b/src/cmd/5l/noop.c @@ -37,6 +37,7 @@ enum { StackBig = 4096, + StackSmall = 128, }; static Sym* sym_div; @@ -296,7 +297,7 @@ noops(void) // TODO(kaib): add more trampolines // TODO(kaib): put stackguard in register // TODO(kaib): add support for -K and underflow detection - + // MOVW g_stackguard(g), R1 p = appendp(p); p->as = AMOVW; @@ -304,14 +305,31 @@ noops(void) p->from.reg = REGG; p->to.type = D_REG; p->to.reg = 1; - - // CMP R1, $-autosize(SP) - p = appendp(p); - p->as = ACMP; - p->from.type = D_REG; - p->from.reg = 1; - p->from.offset = -autosize; - p->reg = REGSP; + + if(autosize < StackSmall) { + // CMP R1, SP + p = appendp(p); + p->as = ACMP; + p->from.type = D_REG; + p->from.reg = 1; + p->reg = REGSP; + } else { + // MOVW $-autosize(SP), R2 + // CMP R1, R2 + p = appendp(p); + p->as = AMOVW; + p->from.type = D_CONST; + p->from.reg = REGSP; + p->from.offset = -autosize; + p->to.type = D_REG; + p->to.reg = 2; + + p = appendp(p); + p->as = ACMP; + p->from.type = D_REG; + p->from.reg = 1; + p->reg = 2; + } // MOVW.LO $autosize, R1 p = appendp(p);