]> Cypherpunks repositories - gostls13.git/commitdiff
better version of op=
authorKen Thompson <ken@golang.org>
Thu, 12 Jun 2008 21:21:09 +0000 (14:21 -0700)
committerKen Thompson <ken@golang.org>
Thu, 12 Jun 2008 21:21:09 +0000 (14:21 -0700)
fixed bugs in /= and %/

SVN=122493

src/cmd/6g/gen.c
src/cmd/6g/gg.h

index b755afacee5440d1aa67c1d42df901dfb235e2ab..4712b0c28c17881265cc16b1f73e05d01f097b73 100644 (file)
@@ -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
index fa89cc8894718ffa65b00e0467b0e9caed3a273c..c2cfc44cbf1927a70685c302d05bb9323cffb5ff 100644 (file)
@@ -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*);