more morestack fiddling

R=r
OCL=28204
CL=28204
This commit is contained in:
Ken Thompson 2009-05-03 19:09:14 -07:00
parent a5a878986c
commit 5963f59067
3 changed files with 123 additions and 36 deletions

View File

@ -477,40 +477,52 @@ brloop(Prog *p)
return q; return q;
} }
static char*
morename[] =
{
"sys·morestack00",
"sys·morestack10",
"sys·morestack01",
"sys·morestack11",
"sys·morestack8",
"sys·morestack16",
"sys·morestack24",
"sys·morestack32",
"sys·morestack40",
"sys·morestack48",
};
Prog* pmorestack[nelem(morename)];
Sym* symmorestack[nelem(morename)];
void void
dostkoff(void) 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 *pmorestack00, *pmorestack01, *pmorestack10, *pmorestack11; uint32 moreconst1, moreconst2, i;
Sym *symmorestack00, *symmorestack01, *symmorestack10, *symmorestack11;
uint32 moreconst1, moreconst2;
pmorestack00 = P; for(i=0; i<nelem(morename); i++) {
pmorestack01 = P; symmorestack[i] = lookup(morename[i], 0);
pmorestack10 = P; pmorestack[i] = P;
pmorestack11 = P; }
symmorestack00 = lookup("sys·morestack00", 0);
symmorestack01 = lookup("sys·morestack01", 0);
symmorestack10 = lookup("sys·morestack10", 0);
symmorestack11 = lookup("sys·morestack11", 0);
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 == symmorestack00) for(i=0; i<nelem(morename); i++) {
pmorestack00 = p; if(p->from.sym == symmorestack[i]) {
if(p->from.sym == symmorestack01) pmorestack[i] = p;
pmorestack01 = p; break;
if(p->from.sym == symmorestack10) }
pmorestack10 = p; }
if(p->from.sym == symmorestack11)
pmorestack11 = p;
} }
} }
if(pmorestack00 == P || pmorestack01 == P || pmorestack10 == P || pmorestack11 == P)
diag("sys·morestack[01][01] not defined"); for(i=0; i<nelem(morename); i++) {
if(pmorestack[i] == P)
diag("morestack trampoline not defined");
}
curframe = 0; curframe = 0;
curbecome = 0; curbecome = 0;
@ -662,13 +674,14 @@ dostkoff(void)
moreconst1 = (autoffset+160) & ~7LL; moreconst1 = (autoffset+160) & ~7LL;
moreconst2 = textarg; moreconst2 = textarg;
// four varieties (const1==0 cross const2==0) // 4 varieties varieties (const1==0 cross const2==0)
// and 6 subvarieties of (const1==0 and const2!=0)
p = appendp(p); p = appendp(p);
if(moreconst1 == 0 && moreconst2 == 0) { if(moreconst1 == 0 && moreconst2 == 0) {
p->as = ACALL; p->as = ACALL;
p->to.type = D_BRANCH; p->to.type = D_BRANCH;
p->pcond = pmorestack00; p->pcond = pmorestack[0];
p->to.sym = symmorestack00; p->to.sym = symmorestack[0];
if(q1) { if(q1) {
q1->pcond = p; q1->pcond = p;
q1 = P; q1 = P;
@ -687,8 +700,19 @@ dostkoff(void)
p = appendp(p); p = appendp(p);
p->as = ACALL; p->as = ACALL;
p->to.type = D_BRANCH; p->to.type = D_BRANCH;
p->pcond = pmorestack10; p->pcond = pmorestack[1];
p->to.sym = symmorestack10; p->to.sym = symmorestack[1];
} else
if(moreconst1 == 0 && moreconst2 <= 48 && moreconst2%8 == 0) {
i = moreconst2/8 + 3;
p->as = ACALL;
p->to.type = D_BRANCH;
p->pcond = pmorestack[i];
p->to.sym = symmorestack[i];
if(q1) {
q1->pcond = p;
q1 = P;
}
} else } else
if(moreconst1 == 0 && moreconst2 != 0) { if(moreconst1 == 0 && moreconst2 != 0) {
p->as = AMOVL; p->as = AMOVL;
@ -703,10 +727,9 @@ dostkoff(void)
p = appendp(p); p = appendp(p);
p->as = ACALL; p->as = ACALL;
p->to.type = D_BRANCH; p->to.type = D_BRANCH;
p->pcond = pmorestack01; p->pcond = pmorestack[2];
p->to.sym = symmorestack01; p->to.sym = symmorestack[2];
} else { } else {
p->as = AMOVQ; p->as = AMOVQ;
p->from.type = D_CONST; p->from.type = D_CONST;
p->from.offset = (uint64)moreconst2 << 32; p->from.offset = (uint64)moreconst2 << 32;
@ -720,8 +743,8 @@ dostkoff(void)
p = appendp(p); p = appendp(p);
p->as = ACALL; p->as = ACALL;
p->to.type = D_BRANCH; p->to.type = D_BRANCH;
p->pcond = pmorestack11; p->pcond = pmorestack[3];
p->to.sym = symmorestack11; p->to.sym = symmorestack[3];
} }
} }
@ -947,14 +970,18 @@ export(void)
n = 0; n = 0;
for(i = 0; i < NHASH; i++) for(i = 0; i < NHASH; i++)
for(s = hash[i]; s != S; s = s->link) for(s = hash[i]; s != S; s = s->link)
if(s->sig != 0 && s->type != SXREF && s->type != SUNDEF && (nexports == 0 || s->subtype == SEXPORT)) if(s->sig != 0 && s->type != SXREF &&
s->type != SUNDEF &&
(nexports == 0 || s->subtype == SEXPORT))
n++; n++;
esyms = malloc(n*sizeof(Sym*)); esyms = malloc(n*sizeof(Sym*));
ne = n; ne = n;
n = 0; n = 0;
for(i = 0; i < NHASH; i++) for(i = 0; i < NHASH; i++)
for(s = hash[i]; s != S; s = s->link) for(s = hash[i]; s != S; s = s->link)
if(s->sig != 0 && s->type != SXREF && s->type != SUNDEF && (nexports == 0 || s->subtype == SEXPORT)) if(s->sig != 0 && s->type != SXREF &&
s->type != SUNDEF &&
(nexports == 0 || s->subtype == SEXPORT))
esyms[n++] = s; esyms[n++] = s;
for(i = 0; i < ne-1; i++) for(i = 0; i < ne-1; i++)
for(j = i+1; j < ne; j++) for(j = i+1; j < ne; j++)

View File

@ -572,16 +572,37 @@ sweeplist(Prog **first, Prog **last)
*last = q; *last = q;
} }
static char*
morename[] =
{
"sys·morestack",
"sys·morestackx",
"sys·morestack00",
"sys·morestack10",
"sys·morestack01",
"sys·morestack11",
"sys·morestack8",
"sys·morestack16",
"sys·morestack24",
"sys·morestack32",
"sys·morestack40",
"sys·morestack48",
};
void void
deadcode(void) deadcode(void)
{ {
int i;
if(debug['v']) if(debug['v'])
Bprint(&bso, "%5.2f deadcode\n", cputime()); Bprint(&bso, "%5.2f deadcode\n", cputime());
mark(lookup(INITENTRY, 0)); mark(lookup(INITENTRY, 0));
mark(lookup("sys·morestack", 0)); for(i=0; i<nelem(morename); i++)
mark(lookup(morename[i], 0));
sweeplist(&firstp, &lastp); sweeplist(&firstp, &lastp);
sweeplist(&datap, &edatap); sweeplist(&datap, &edatap);
} }

View File

@ -111,6 +111,45 @@ TEXT sys·morestack11+0(SB),7,$0
MOVQ $sys·morestack+0(SB), AX MOVQ $sys·morestack+0(SB), AX
JMP AX JMP AX
TEXT sys·morestackx(SB),7,$0
POPQ AX
SHLQ $35, AX
MOVQ AX, 8(R14)
MOVQ $sys·morestack(SB), AX
JMP AX
// subcases of morestack01
// with const of 8,16,...48
TEXT sys·morestack8(SB),7,$0
PUSHQ $1
MOVQ $sys·morestackx(SB), AX
JMP AX
TEXT sys·morestack16(SB),7,$0
PUSHQ $2
MOVQ $sys·morestackx(SB), AX
JMP AX
TEXT sys·morestack24(SB),7,$0
PUSHQ $3
MOVQ $sys·morestackx(SB), AX
JMP AX
TEXT sys·morestack32(SB),7,$0
PUSHQ $4
MOVQ $sys·morestackx(SB), AX
JMP AX
TEXT sys·morestack40(SB),7,$0
PUSHQ $5
MOVQ $sys·morestackx(SB), AX
JMP AX
TEXT sys·morestack48(SB),7,$0
PUSHQ $6
MOVQ $sys·morestackx(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