Commit 97cbf47c authored by Russ Cox's avatar Russ Cox

cmd/8c: better fix for 64-bit register smash

Ken pointed out that CL 5998043 was ugly code.
This should be better.

Fixes #3501.

R=ken2
CC=golang-dev
https://golang.org/cl/6258049
parent 51072eb1
......@@ -1703,6 +1703,7 @@ copy:
}
}
v = w == 8;
if(n->complex >= FNX && nn != nil && nn->complex >= FNX) {
t = nn->type;
nn->type = types[TLONG];
......@@ -1728,8 +1729,28 @@ copy:
}
x = 0;
v = w == 8;
if(v) {
if(nn != nil && nn->complex >= FNX) {
t = nn->type;
nn->type = types[TLONG];
regialloc(&nod2, nn, Z);
lcgen(nn, &nod2);
nn->type = t;
nod2.type = typ(TIND, t);
nod1 = nod2;
nod1.op = OIND;
nod1.left = &nod2;
nod1.right = Z;
nod1.complex = 1;
nod1.type = t;
sugen(n, &nod1, w);
regfree(&nod2);
return;
}
c = cursafe;
if(n->left != Z && n->left->complex >= FNX
&& n->right != Z && n->right->complex >= FNX) {
......
......@@ -1601,33 +1601,6 @@ cgen64(Node *n, Node *nn)
prtree(n, "cgen64");
print("AX = %d\n", reg[D_AX]);
}
if(nn != Z && nn->complex >= FNX) {
// Evaluate nn address to register
// before we use registers for n.
// Otherwise the call during computation of nn
// will smash the registers. See
// http://golang.org/issue/3501.
// If both n and nn want calls, refuse to compile.
if(n != Z && n->complex >= FNX)
diag(n, "cgen64 miscompile");
reglcgen(&nod1, nn, Z);
m = cgen64(n, &nod1);
regfree(&nod1);
if(m == 0) {
// Now what? We computed &nn, which involved a
// function call, and didn't use it. The caller will recompute nn,
// calling the function a second time.
// We can figure out what to do later, if this actually happens.
diag(n, "cgen64 miscompile");
}
return m;
}
cmp = 0;
sh = 0;
......
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