}
}
+ v = w == 8;
if(n->complex >= FNX && nn != nil && nn->complex >= FNX) {
t = nn->type;
nn->type = types[TLONG];
}
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) {
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;