mirror of
https://github.com/golang/go
synced 2024-11-24 07:10:18 -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:
parent
b16c41bed7
commit
57ad05db15
@ -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");
|
||||
|
@ -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))
|
||||
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))
|
||||
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,13 +1209,22 @@ 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;
|
||||
}
|
||||
|
@ -1601,7 +1601,7 @@ int
|
||||
BtoF(int32 b)
|
||||
{
|
||||
|
||||
b &= 0xFF0000L;
|
||||
b &= 0xFFFF0000L;
|
||||
if(b == 0)
|
||||
return 0;
|
||||
return bitno(b) - 16 + FREGMIN;
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user