summaryrefslogtreecommitdiff
path: root/sys/src/cmd
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-10-06 06:20:01 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-10-06 06:20:01 +0200
commit2d59b15c39dc0412e2722141cb5d48bf72b5665e (patch)
tree943cfe2d4d976101544339a07096b6666e3d30b7 /sys/src/cmd
parent99ddc5b0971c3ce0baddd667ea4c34c635c8e5ab (diff)
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()
Diffstat (limited to 'sys/src/cmd')
-rw-r--r--sys/src/cmd/5c/cgen.c10
-rw-r--r--sys/src/cmd/6c/cgen.c2
-rw-r--r--sys/src/cmd/8c/cgen.c1
-rw-r--r--sys/src/cmd/cc/sub.c6
-rw-r--r--sys/src/cmd/vc/cgen.c10
5 files changed, 21 insertions, 8 deletions
diff --git a/sys/src/cmd/5c/cgen.c b/sys/src/cmd/5c/cgen.c
index 0c0fa4c9b..64d24f704 100644
--- a/sys/src/cmd/5c/cgen.c
+++ b/sys/src/cmd/5c/cgen.c
@@ -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);
diff --git a/sys/src/cmd/6c/cgen.c b/sys/src/cmd/6c/cgen.c
index 6b1e94185..2cfbfbe66 100644
--- a/sys/src/cmd/6c/cgen.c
+++ b/sys/src/cmd/6c/cgen.c
@@ -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);
diff --git a/sys/src/cmd/8c/cgen.c b/sys/src/cmd/8c/cgen.c
index 9436ac698..35559bc15 100644
--- a/sys/src/cmd/8c/cgen.c
+++ b/sys/src/cmd/8c/cgen.c
@@ -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);
diff --git a/sys/src/cmd/cc/sub.c b/sys/src/cmd/cc/sub.c
index d0bbeb89c..231394d41 100644
--- a/sys/src/cmd/cc/sub.c
+++ b/sys/src/cmd/cc/sub.c
@@ -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;
diff --git a/sys/src/cmd/vc/cgen.c b/sys/src/cmd/vc/cgen.c
index a8d52d25b..e5d4fc349 100644
--- a/sys/src/cmd/vc/cgen.c
+++ b/sys/src/cmd/vc/cgen.c
@@ -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);