Commit 1ed7f181 authored by Ken Thompson's avatar Ken Thompson

code improvement

better calling of morestack

R=r
OCL=28179
CL=28179
parent 4f18549c
...@@ -483,24 +483,34 @@ dostkoff(void) ...@@ -483,24 +483,34 @@ dostkoff(void)
Prog *p, *q, *q1; Prog *p, *q, *q1;
int32 autoffset, deltasp; int32 autoffset, deltasp;
int a, f, curframe, curbecome, maxbecome, pcsize; int a, f, curframe, curbecome, maxbecome, pcsize;
Prog *pmorestack; Prog *pmorestack00, *pmorestack01, *pmorestack10, *pmorestack11;
Sym *symmorestack; Sym *symmorestack00, *symmorestack01, *symmorestack10, *symmorestack11;
uint32 moreconst1, moreconst2;
pmorestack = P; pmorestack00 = P;
symmorestack = lookup("sys·morestack", 0); pmorestack01 = P;
pmorestack10 = P;
pmorestack11 = P;
symmorestack00 = lookup("sys·morestack00", 0);
symmorestack01 = lookup("sys·morestack01", 0);
symmorestack10 = lookup("sys·morestack10", 0);
symmorestack11 = lookup("sys·morestack11", 0);
if(symmorestack->type == STEXT)
for(p = firstp; p != P; p = p->link) { for(p = firstp; p != P; p = p->link) {
if(p->as == ATEXT) { if(p->as == ATEXT) {
if(p->from.sym == symmorestack) { if(p->from.sym == symmorestack00)
pmorestack = p; pmorestack00 = p;
p->from.scale |= NOSPLIT; if(p->from.sym == symmorestack01)
break; pmorestack01 = p;
} if(p->from.sym == symmorestack10)
pmorestack10 = p;
if(p->from.sym == symmorestack11)
pmorestack11 = p;
} }
} }
if(pmorestack == P) if(pmorestack00 == P || pmorestack01 == P || pmorestack10 == P || pmorestack11 == P)
diag("sys·morestack not defined"); diag("sys·morestack[01][01] not defined");
curframe = 0; curframe = 0;
curbecome = 0; curbecome = 0;
...@@ -583,14 +593,14 @@ dostkoff(void) ...@@ -583,14 +593,14 @@ dostkoff(void)
q = P; q = P;
q1 = P; q1 = P;
if(pmorestack != P)
if(!(p->from.scale & NOSPLIT)) { if(!(p->from.scale & NOSPLIT)) {
if(debug['K']) { if(debug['K']) {
// 6l -K means check not only for stack // 6l -K means check not only for stack
// overflow but stack underflow. // overflow but stack underflow.
// On underflow, INT 3 (breakpoint). // On underflow, INT 3 (breakpoint).
// Underflow itself is rare but this also // Underflow itself is rare but this also
// catches out-of-sync stack guard info. // catches out-of-sync stack guard info
p = appendp(p); p = appendp(p);
p->as = ACMPQ; p->as = ACMPQ;
p->from.type = D_INDIR+D_R15; p->from.type = D_INDIR+D_R15;
...@@ -646,33 +656,73 @@ dostkoff(void) ...@@ -646,33 +656,73 @@ dostkoff(void)
q = p; q = p;
} }
p = appendp(p);
p->as = AMOVQ;
p->from.type = D_CONST;
p->from.offset = 0;
p->to.type = D_AX;
if(q1) {
q1->pcond = p;
q1 = P;
}
/* 160 comes from 3 calls (3*8) 4 safes (4*8) and 104 guard */ /* 160 comes from 3 calls (3*8) 4 safes (4*8) and 104 guard */
moreconst1 = 0;
if(autoffset+160 > 4096) if(autoffset+160 > 4096)
p->from.offset = (autoffset+160) & ~7LL; moreconst1 = (autoffset+160) & ~7LL;
p->from.offset |= textarg<<32; moreconst2 = textarg;
// four varieties (const1==0 cross const2==0)
p = appendp(p); p = appendp(p);
p->as = AMOVQ; if(moreconst1 == 0 && moreconst2 == 0) {
p->from.type = D_AX; p->as = ACALL;
p->to.type = D_INDIR+D_R14; p->to.type = D_BRANCH;
p->to.offset = 8; p->pcond = pmorestack00;
p->to.sym = symmorestack00;
if(q1) {
q1->pcond = p;
q1 = P;
}
} else
if(moreconst1 != 0 && moreconst2 == 0) {
p->as = AMOVL;
p->from.type = D_CONST;
p->from.offset = moreconst1;
p->to.type = D_AX;
if(q1) {
q1->pcond = p;
q1 = P;
}
p = appendp(p); p = appendp(p);
p->as = ACALL; p->as = ACALL;
p->to.type = D_BRANCH; p->to.type = D_BRANCH;
p->pcond = pmorestack; p->pcond = pmorestack10;
p->to.sym = symmorestack; p->to.sym = symmorestack10;
} else
if(moreconst1 == 0 && moreconst2 != 0) {
p->as = AMOVL;
p->from.type = D_CONST;
p->from.offset = moreconst2;
p->to.type = D_AX;
if(q1) {
q1->pcond = p;
q1 = P;
}
p = appendp(p);
p->as = ACALL;
p->to.type = D_BRANCH;
p->pcond = pmorestack01;
p->to.sym = symmorestack01;
} else {
p->as = AMOVQ;
p->from.type = D_CONST;
p->from.offset = (uint64)moreconst2 << 32;
p->from.offset |= moreconst1;
p->to.type = D_AX;
if(q1) {
q1->pcond = p;
q1 = P;
}
p = appendp(p);
p->as = ACALL;
p->to.type = D_BRANCH;
p->pcond = pmorestack11;
p->to.sym = symmorestack11;
}
} }
if(q != P) if(q != P)
......
...@@ -87,6 +87,30 @@ TEXT gosave(SB), 7, $0 ...@@ -87,6 +87,30 @@ TEXT gosave(SB), 7, $0
* support for morestack * support for morestack
*/ */
// morestack trampolines
TEXT sys·morestack00+0(SB),7,$0
MOVQ $0, AX
MOVQ AX, 8(R14)
MOVQ $sys·morestack+0(SB), AX
JMP AX
TEXT sys·morestack01+0(SB),7,$0
SHLQ $32, AX
MOVQ AX, 8(R14)
MOVQ $sys·morestack+0(SB), AX
JMP AX
TEXT sys·morestack10+0(SB),7,$0
MOVLQZX AX, AX
MOVQ AX, 8(R14)
MOVQ $sys·morestack+0(SB), AX
JMP AX
TEXT sys·morestack11+0(SB),7,$0
MOVQ AX, 8(R14)
MOVQ $sys·morestack+0(SB), AX
JMP AX
// return point when leaving new stack. save AX, jmp to lessstack to switch back // return point when leaving new stack. save AX, jmp to lessstack to switch back
TEXT retfromnewstack(SB), 7, $0 TEXT retfromnewstack(SB), 7, $0
MOVQ AX, 16(R14) // save AX in m->cret MOVQ AX, 16(R14) // save AX in m->cret
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment