aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2008-06-12 14:21:09 -0700
committerKen Thompson <ken@golang.org>2008-06-12 14:21:09 -0700
commitef61a4cb1ec9ba332ee2d5a788c509d9ae851f19 (patch)
tree3eb0e5ce155d67668d14eb2f2c5b77117bc5595b /src/cmd
parentdbf1da6b376831a4b73695a3e993da21da38fa76 (diff)
downloadgo-ef61a4cb1ec9ba332ee2d5a788c509d9ae851f19.tar.xz
better version of op=
fixed bugs in /= and %/ SVN=122493
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/6g/gen.c46
-rw-r--r--src/cmd/6g/gg.h2
2 files changed, 24 insertions, 24 deletions
diff --git a/src/cmd/6g/gen.c b/src/cmd/6g/gen.c
index b755afacee..4712b0c28c 100644
--- a/src/cmd/6g/gen.c
+++ b/src/cmd/6g/gen.c
@@ -275,7 +275,7 @@ loop:
break;
case OASOP:
- cgen_asop(n->left, n->right, n->etype);
+ cgen_asop(n);
break;
case OAS:
@@ -683,40 +683,40 @@ cgen_ret(Node *n)
}
void
-cgen_asop(Node *nl, Node *nr, int op)
+cgen_asop(Node *n)
{
- Node n1, n2;
- int a;
+ Node n1, n2, n3, n4;
+ Node *nl, *nr;
+
+ nl = n->left;
+ nr = n->right;
if(nr->ullman >= UINF && nl->ullman >= UINF) {
fatal("cgen_asop both sides call");
}
-// BOTCH make special case for DIVQ
-
- a = optoas(op, nl->type);
- if(nl->addable) {
- regalloc(&n2, nr->type, N);
+ if(nr->ullman > nl->ullman) {
+ regalloc(&n2, nl->type, N);
+ cgen(nr, &n2);
+ igen(nl, &n1, N);
+ } else {
+ igen(nl, &n1, N);
+ regalloc(&n2, nl->type, N);
cgen(nr, &n2);
- regalloc(&n1, nl->type, N);
- cgen(nl, &n1);
- gins(a, &n2, &n1);
- gmove(&n1, nl);
- regfree(&n1);
- regfree(&n2);
- return;
}
- if(nr->ullman > nl->ullman) {
- fatal("gcgen_asopen");
- }
+ n3 = *n;
+ n3.left = &n1;
+ n3.right = &n2;
+ n3.op = n->etype;
+
+ regalloc(&n4, nr->type, N);
+ cgen(&n3, &n4);
+ gmove(&n4, &n1);
- regalloc(&n1, nl->type, N);
- igen(nl, &n2, N);
- cgen(nr, &n1);
- gins(a, &n1, &n2);
regfree(&n1);
regfree(&n2);
+ regfree(&n4);
}
void
diff --git a/src/cmd/6g/gg.h b/src/cmd/6g/gg.h
index fa89cc8894..c2cfc44cbf 100644
--- a/src/cmd/6g/gg.h
+++ b/src/cmd/6g/gg.h
@@ -109,7 +109,7 @@ Node* lookdot(Node*, Node*, int);
void inarggen(void);
void agen_inter(Node*, Node*);
void cgen_as(Node*, Node*, int);
-void cgen_asop(Node*, Node*, int);
+void cgen_asop(Node*);
void cgen_ret(Node*);
void cgen_call(Node*);
void cgen_callmeth(Node*);