5c/6c/8c/vc: import various changes from charles forsyth
- cover more cases that have no side effects - ensure function has complex FNX - pull operators out of OFUNC level - rewrite OSTRUCT lhs to avoid all side-effects, use regalloc() instead of regret()
This commit is contained in:
parent
99ddc5b097
commit
2d59b15c39
5 changed files with 21 additions and 8 deletions
|
@ -298,6 +298,7 @@ cgenrel(Node *n, Node *nn, int inrel)
|
|||
break;
|
||||
|
||||
case OFUNC:
|
||||
l = uncomma(l);
|
||||
if(l->complex >= FNX) {
|
||||
if(l->op != OIND)
|
||||
diag(n, "bad function call");
|
||||
|
@ -573,7 +574,7 @@ genasop(int o, Node *l, Node *r, Node *nn)
|
|||
gopcode(o, &nod1, Z, &nod);
|
||||
gmove(&nod, &nod2);
|
||||
if(nn != Z)
|
||||
gmove(&nod, nn);
|
||||
gmove(&nod2, nn);
|
||||
regfree(&nod);
|
||||
regfree(&nod1);
|
||||
if(hardleft)
|
||||
|
@ -931,12 +932,12 @@ sugen(Node *n, Node *nn, long w)
|
|||
|
||||
case OSTRUCT:
|
||||
/*
|
||||
* rewrite so lhs has no fn call
|
||||
* rewrite so lhs has no side effects
|
||||
*/
|
||||
if(nn != Z && nn->complex >= FNX) {
|
||||
if(nn != Z && side(nn)) {
|
||||
nod1 = *n;
|
||||
nod1.type = typ(TIND, n->type);
|
||||
regret(&nod2, &nod1);
|
||||
regalloc(&nod2, &nod1, Z);
|
||||
lcgen(nn, &nod2);
|
||||
regsalloc(&nod0, &nod1);
|
||||
gopcode(OAS, &nod2, Z, &nod0);
|
||||
|
@ -1026,6 +1027,7 @@ sugen(Node *n, Node *nn, long w)
|
|||
} else
|
||||
nn = nn->left;
|
||||
n = new(OFUNC, n->left, new(OLIST, nn, n->right));
|
||||
n->complex = FNX;
|
||||
n->type = types[TVOID];
|
||||
n->left->type = types[TVOID];
|
||||
cgen(n, Z);
|
||||
|
|
|
@ -875,6 +875,7 @@ cgen(Node *n, Node *nn)
|
|||
break;
|
||||
|
||||
case OFUNC:
|
||||
l = uncomma(l);
|
||||
if(l->complex >= FNX) {
|
||||
if(l->op != OIND)
|
||||
diag(n, "bad function call");
|
||||
|
@ -1536,6 +1537,7 @@ sugen(Node *n, Node *nn, long w)
|
|||
} else
|
||||
nn = nn->left;
|
||||
n = new(OFUNC, n->left, new(OLIST, nn, n->right));
|
||||
n->complex = FNX;
|
||||
n->type = types[TVOID];
|
||||
n->left->type = types[TVOID];
|
||||
cgen(n, Z);
|
||||
|
|
|
@ -1606,6 +1606,7 @@ sugen(Node *n, Node *nn, long w)
|
|||
} else
|
||||
nn = nn->left;
|
||||
n = new(OFUNC, n->left, new(OLIST, nn, n->right));
|
||||
n->complex = FNX;
|
||||
n->type = types[TVOID];
|
||||
n->left->type = types[TVOID];
|
||||
cgen(n, Z);
|
||||
|
|
|
@ -950,6 +950,8 @@ loop:
|
|||
case OOROR:
|
||||
case OCOMMA:
|
||||
case ODOT:
|
||||
case OFAS:
|
||||
case OINDEX:
|
||||
if(side(n->left))
|
||||
break;
|
||||
n = n->right;
|
||||
|
@ -961,6 +963,10 @@ loop:
|
|||
case OSTRING:
|
||||
case OLSTRING:
|
||||
case ONAME:
|
||||
case OREGPAIR:
|
||||
case OEXREG:
|
||||
case OREGISTER:
|
||||
case OINDREG:
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
|
|
|
@ -260,6 +260,7 @@ cgen(Node *n, Node *nn)
|
|||
break;
|
||||
|
||||
case OFUNC:
|
||||
l = uncomma(l);
|
||||
if(l->complex >= FNX) {
|
||||
if(l->op != OIND)
|
||||
diag(n, "bad function call");
|
||||
|
@ -530,7 +531,7 @@ genasop(int o, Node *l, Node *r, Node *nn)
|
|||
gopcode(o, &nod1, Z, &nod);
|
||||
gmove(&nod, &nod2);
|
||||
if(nn != Z)
|
||||
gmove(&nod, nn);
|
||||
gmove(&nod2, nn);
|
||||
regfree(&nod);
|
||||
regfree(&nod1);
|
||||
if(hardleft)
|
||||
|
@ -946,12 +947,12 @@ sugen(Node *n, Node *nn, long w)
|
|||
|
||||
case OSTRUCT:
|
||||
/*
|
||||
* rewrite so lhs has no fn call
|
||||
* rewrite so lhs has no side effects
|
||||
*/
|
||||
if(nn != Z && nn->complex >= FNX) {
|
||||
if(nn != Z && side(nn)) {
|
||||
nod1 = *n;
|
||||
nod1.type = typ(TIND, n->type);
|
||||
regret(&nod2, &nod1);
|
||||
regalloc(&nod2, &nod1, Z);
|
||||
lcgen(nn, &nod2);
|
||||
regsalloc(&nod0, &nod1);
|
||||
gopcode(OAS, &nod2, Z, &nod0);
|
||||
|
@ -1041,6 +1042,7 @@ sugen(Node *n, Node *nn, long w)
|
|||
} else
|
||||
nn = nn->left;
|
||||
n = new(OFUNC, n->left, new(OLIST, nn, n->right));
|
||||
n->complex = FNX;
|
||||
n->type = types[TVOID];
|
||||
n->left->type = types[TVOID];
|
||||
cgen(n, Z);
|
||||
|
|
Loading…
Reference in a new issue