mirror of
https://github.com/golang/go
synced 2024-11-22 03:44:39 -07:00
gc: better compilation of floating point +=
R=ken2 CC=golang-dev https://golang.org/cl/255042
This commit is contained in:
parent
8c9944d8c8
commit
ac499ed7a5
@ -479,27 +479,35 @@ cgen_asop(Node *n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
hard:
|
hard:
|
||||||
if(nr->ullman > nl->ullman) {
|
n2.op = 0;
|
||||||
|
n1.op = 0;
|
||||||
|
if(nr->ullman >= nl->ullman || nl->addable) {
|
||||||
regalloc(&n2, nr->type, N);
|
regalloc(&n2, nr->type, N);
|
||||||
cgen(nr, &n2);
|
cgen(nr, &n2);
|
||||||
igen(nl, &n1, N);
|
nr = &n2;
|
||||||
} else {
|
} else {
|
||||||
igen(nl, &n1, N);
|
tempname(&n2, nr->type);
|
||||||
regalloc(&n2, nr->type, N);
|
|
||||||
cgen(nr, &n2);
|
cgen(nr, &n2);
|
||||||
|
nr = &n2;
|
||||||
|
}
|
||||||
|
if(!nl->addable) {
|
||||||
|
igen(nl, &n1, N);
|
||||||
|
nl = &n1;
|
||||||
}
|
}
|
||||||
|
|
||||||
n3 = *n;
|
n3 = *n;
|
||||||
n3.left = &n1;
|
n3.left = nl;
|
||||||
n3.right = &n2;
|
n3.right = nr;
|
||||||
n3.op = n->etype;
|
n3.op = n->etype;
|
||||||
|
|
||||||
regalloc(&n4, nl->type, N);
|
regalloc(&n4, nl->type, N);
|
||||||
cgen(&n3, &n4);
|
cgen(&n3, &n4);
|
||||||
gmove(&n4, &n1);
|
gmove(&n4, nl);
|
||||||
|
|
||||||
regfree(&n1);
|
if(n1.op)
|
||||||
regfree(&n2);
|
regfree(&n1);
|
||||||
|
if(n2.op == OREGISTER)
|
||||||
|
regfree(&n2);
|
||||||
regfree(&n4);
|
regfree(&n4);
|
||||||
goto ret;
|
goto ret;
|
||||||
|
|
||||||
|
@ -432,27 +432,35 @@ cgen_asop(Node *n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
hard:
|
hard:
|
||||||
if(nr->ullman > nl->ullman) {
|
n2.op = 0;
|
||||||
|
n1.op = 0;
|
||||||
|
if(nr->ullman >= nl->ullman || nl->addable) {
|
||||||
regalloc(&n2, nr->type, N);
|
regalloc(&n2, nr->type, N);
|
||||||
cgen(nr, &n2);
|
cgen(nr, &n2);
|
||||||
igen(nl, &n1, N);
|
nr = &n2;
|
||||||
} else {
|
} else {
|
||||||
igen(nl, &n1, N);
|
tempname(&n2, nr->type);
|
||||||
regalloc(&n2, nr->type, N);
|
|
||||||
cgen(nr, &n2);
|
cgen(nr, &n2);
|
||||||
|
nr = &n2;
|
||||||
|
}
|
||||||
|
if(!nl->addable) {
|
||||||
|
igen(nl, &n1, N);
|
||||||
|
nl = &n1;
|
||||||
}
|
}
|
||||||
|
|
||||||
n3 = *n;
|
n3 = *n;
|
||||||
n3.left = &n1;
|
n3.left = nl;
|
||||||
n3.right = &n2;
|
n3.right = nr;
|
||||||
n3.op = n->etype;
|
n3.op = n->etype;
|
||||||
|
|
||||||
regalloc(&n4, nl->type, N);
|
regalloc(&n4, nl->type, N);
|
||||||
cgen(&n3, &n4);
|
cgen(&n3, &n4);
|
||||||
gmove(&n4, &n1);
|
gmove(&n4, nl);
|
||||||
|
|
||||||
regfree(&n1);
|
if(n1.op)
|
||||||
regfree(&n2);
|
regfree(&n1);
|
||||||
|
if(n2.op == OREGISTER)
|
||||||
|
regfree(&n2);
|
||||||
regfree(&n4);
|
regfree(&n4);
|
||||||
|
|
||||||
ret:
|
ret:
|
||||||
|
@ -18,7 +18,7 @@ mgen(Node *n, Node *n1, Node *rg)
|
|||||||
reg[n->val.u.reg]++;
|
reg[n->val.u.reg]++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(n->type->width > widthptr)
|
if(n->type->width > widthptr && !isfloat[n->type->etype])
|
||||||
tempname(n1, n->type);
|
tempname(n1, n->type);
|
||||||
else
|
else
|
||||||
regalloc(n1, n->type, rg);
|
regalloc(n1, n->type, rg);
|
||||||
|
@ -471,21 +471,34 @@ cgen_asop(Node *n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
hard:
|
hard:
|
||||||
tempname(&n2, nr->type);
|
n2.op = 0;
|
||||||
cgen(nr, &n2);
|
n1.op = 0;
|
||||||
|
if(nr->ullman >= nl->ullman || nl->addable) {
|
||||||
igen(nl, &n1, N);
|
mgen(nr, &n2, N);
|
||||||
|
nr = &n2;
|
||||||
|
nr = &n2;
|
||||||
|
} else {
|
||||||
|
tempname(&n2, nr->type);
|
||||||
|
cgen(nr, &n2);
|
||||||
|
nr = &n2;
|
||||||
|
}
|
||||||
|
if(!nl->addable) {
|
||||||
|
igen(nl, &n1, N);
|
||||||
|
nl = &n1;
|
||||||
|
}
|
||||||
|
|
||||||
n3 = *n;
|
n3 = *n;
|
||||||
n3.left = &n1;
|
n3.left = nl;
|
||||||
n3.right = &n2;
|
n3.right = nr;
|
||||||
n3.op = n->etype;
|
n3.op = n->etype;
|
||||||
|
|
||||||
tempname(&n4, nl->type);
|
mgen(&n3, &n4, N);
|
||||||
cgen(&n3, &n4);
|
gmove(&n4, nl);
|
||||||
gmove(&n4, &n1);
|
|
||||||
|
|
||||||
regfree(&n1);
|
if(n1.op)
|
||||||
|
regfree(&n1);
|
||||||
|
mfree(&n2);
|
||||||
|
mfree(&n4);
|
||||||
|
|
||||||
ret:
|
ret:
|
||||||
;
|
;
|
||||||
|
@ -823,10 +823,13 @@ walkexpr(Node **np, NodeList **init)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* on 32-bit arch, rewrite 64-bit ops into l = l op r
|
* on 32-bit arch, rewrite 64-bit ops into l = l op r.
|
||||||
|
* on 386, rewrite float ops into l = l op r.
|
||||||
|
* TODO(rsc): Maybe this rewrite should be done always?
|
||||||
*/
|
*/
|
||||||
et = n->left->type->etype;
|
et = n->left->type->etype;
|
||||||
if(widthptr == 4 && (et == TUINT64 || et == TINT64)) {
|
if((widthptr == 4 && (et == TUINT64 || et == TINT64)) ||
|
||||||
|
(thechar == '8' && isfloat[et])) {
|
||||||
l = safeexpr(n->left, init);
|
l = safeexpr(n->left, init);
|
||||||
r = nod(OAS, l, nod(n->etype, l, n->right));
|
r = nod(OAS, l, nod(n->etype, l, n->right));
|
||||||
typecheck(&r, Etop);
|
typecheck(&r, Etop);
|
||||||
|
Loading…
Reference in New Issue
Block a user