summaryrefslogtreecommitdiff
path: root/src/cmd/6g/ggen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/6g/ggen.c')
-rw-r--r--src/cmd/6g/ggen.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/cmd/6g/ggen.c b/src/cmd/6g/ggen.c
index 731e922bb..45fd17b27 100644
--- a/src/cmd/6g/ggen.c
+++ b/src/cmd/6g/ggen.c
@@ -432,27 +432,35 @@ cgen_asop(Node *n)
}
hard:
- if(nr->ullman > nl->ullman) {
+ n2.op = 0;
+ n1.op = 0;
+ if(nr->ullman >= nl->ullman || nl->addable) {
regalloc(&n2, nr->type, N);
cgen(nr, &n2);
- igen(nl, &n1, N);
+ nr = &n2;
} else {
- igen(nl, &n1, N);
- regalloc(&n2, nr->type, N);
+ tempname(&n2, nr->type);
cgen(nr, &n2);
+ nr = &n2;
+ }
+ if(!nl->addable) {
+ igen(nl, &n1, N);
+ nl = &n1;
}
n3 = *n;
- n3.left = &n1;
- n3.right = &n2;
+ n3.left = nl;
+ n3.right = nr;
n3.op = n->etype;
regalloc(&n4, nl->type, N);
cgen(&n3, &n4);
- gmove(&n4, &n1);
+ gmove(&n4, nl);
- regfree(&n1);
- regfree(&n2);
+ if(n1.op)
+ regfree(&n1);
+ if(n2.op == OREGISTER)
+ regfree(&n2);
regfree(&n4);
ret: