1
0
mirror of https://github.com/golang/go synced 2024-11-24 09:30:07 -07:00

cmd/6g: use all 16 float registers, optimize float moves

Fixes #2446.

R=ken2
CC=golang-dev
https://golang.org/cl/6557044
This commit is contained in:
Russ Cox 2012-09-21 13:39:09 -04:00
parent b16c41bed7
commit 57ad05db15
4 changed files with 59 additions and 13 deletions

View File

@ -271,7 +271,7 @@ ginit(void)
reg[i] = 1;
for(i=D_AX; i<=D_R15; i++)
reg[i] = 0;
for(i=D_X0; i<=D_X7; i++)
for(i=D_X0; i<=D_X15; i++)
reg[i] = 0;
for(i=0; i<nelem(resvd); i++)
@ -289,7 +289,7 @@ gclean(void)
for(i=D_AX; i<=D_R15; i++)
if(reg[i])
yyerror("reg %R left allocated\n", i);
for(i=D_X0; i<=D_X7; i++)
for(i=D_X0; i<=D_X15; i++)
if(reg[i])
yyerror("reg %R left allocated\n", i);
}
@ -359,10 +359,10 @@ regalloc(Node *n, Type *t, Node *o)
case TFLOAT64:
if(o != N && o->op == OREGISTER) {
i = o->val.u.reg;
if(i >= D_X0 && i <= D_X7)
if(i >= D_X0 && i <= D_X15)
goto out;
}
for(i=D_X0; i<=D_X7; i++)
for(i=D_X0; i<=D_X15; i++)
if(reg[i] == 0)
goto out;
fatal("out of floating registers");

View File

@ -627,19 +627,34 @@ subprop(Reg *r0)
Reg *r;
int t;
if(debug['P'] && debug['v'])
print("subprop %P\n", r0->prog);
p = r0->prog;
v1 = &p->from;
if(!regtyp(v1))
if(!regtyp(v1)) {
if(debug['P'] && debug['v'])
print("\tnot regtype %D; return 0\n", v1);
return 0;
}
v2 = &p->to;
if(!regtyp(v2))
if(!regtyp(v2)) {
if(debug['P'] && debug['v'])
print("\tnot regtype %D; return 0\n", v2);
return 0;
}
for(r=uniqp(r0); r!=R; r=uniqp(r)) {
if(uniqs(r) == R)
if(debug['P'] && debug['v'])
print("\t? %P\n", r->prog);
if(uniqs(r) == R) {
if(debug['P'] && debug['v'])
print("\tno unique successor\n");
break;
}
p = r->prog;
switch(p->as) {
case ACALL:
if(debug['P'] && debug['v'])
print("\tfound %P; return 0\n", p);
return 0;
case AIMULL:
@ -710,21 +725,33 @@ subprop(Reg *r0)
case AMOVSB:
case AMOVSL:
case AMOVSQ:
if(debug['P'] && debug['v'])
print("\tfound %P; return 0\n", p);
return 0;
case AMOVL:
case AMOVQ:
case AMOVSS:
case AMOVSD:
if(p->to.type == v1->type)
goto gotit;
break;
}
if(copyau(&p->from, v2) ||
copyau(&p->to, v2))
break;
if(copysub(&p->from, v1, v2, 0) ||
copysub(&p->to, v1, v2, 0))
copyau(&p->to, v2)) {
if(debug['P'] && debug['v'])
print("\tcopyau %D failed\n", v2);
break;
}
if(copysub(&p->from, v1, v2, 0) ||
copysub(&p->to, v1, v2, 0)) {
if(debug['P'] && debug['v'])
print("\tcopysub failed\n");
break;
}
}
if(debug['P'] && debug['v'])
print("\tran off end; return 0\n", p);
return 0;
gotit:
@ -769,6 +796,8 @@ copyprop(Reg *r0)
Adr *v1, *v2;
Reg *r;
if(debug['P'] && debug['v'])
print("copyprop %P\n", r0->prog);
p = r0->prog;
v1 = &p->from;
v2 = &p->to;
@ -1180,14 +1209,23 @@ int
copyau(Adr *a, Adr *v)
{
if(copyas(a, v))
if(copyas(a, v)) {
if(debug['P'] && debug['v'])
print("\tcopyau: copyas returned 1\n");
return 1;
}
if(regtyp(v)) {
if(a->type-D_INDIR == v->type)
if(a->type-D_INDIR == v->type) {
if(debug['P'] && debug['v'])
print("\tcopyau: found indir use - return 1\n");
return 1;
if(a->index == v->type)
}
if(a->index == v->type) {
if(debug['P'] && debug['v'])
print("\tcopyau: found index use - return 1\n");
return 1;
}
}
return 0;
}

View File

@ -1601,7 +1601,7 @@ int
BtoF(int32 b)
{
b &= 0xFF0000L;
b &= 0xFFFF0000L;
if(b == 0)
return 0;
return bitno(b) - 16 + FREGMIN;

View File

@ -805,6 +805,14 @@ enum
D_X5,
D_X6,
D_X7,
D_X8,
D_X9,
D_X10,
D_X11,
D_X12,
D_X13,
D_X14,
D_X15,
D_CS = 68,
D_SS,