]> Cypherpunks repositories - gostls13.git/commitdiff
better code for += -= ^= |= and &=
authorKen Thompson <ken@golang.org>
Tue, 25 Nov 2008 01:51:26 +0000 (17:51 -0800)
committerKen Thompson <ken@golang.org>
Tue, 25 Nov 2008 01:51:26 +0000 (17:51 -0800)
R=r
OCL=19953
CL=19953

src/cmd/6g/gen.c

index 3d47360be80896e9a730f475045a8f40ccecb284..980122b0eb33ee86845a3acbca95acfd7a26ca10 100644 (file)
@@ -921,26 +921,35 @@ cgen_asop(Node *n)
        switch(n->etype) {
        case OADD:
                if(!isint[nl->type->etype])
-                       goto com;
+                       break;
                if(mpgetfix(nr->val.u.xval) != 1)
-                       goto com;
+                       break;
                gins(optoas(OINC, nl->type), N, nl);
                goto ret;
        case OSUB:
                if(!isint[nl->type->etype])
-                       goto com;
+                       break;
                if(mpgetfix(nr->val.u.xval) != 1)
-                       goto com;
+                       break;
                gins(optoas(ODEC, nl->type), N, nl);
                goto ret;
+       }
 
-       com:
+       if(nl->addable)
+       switch(n->etype) {
        case OXOR:
        case OAND:
        case OOR:
+       case OADD:
+       case OSUB:
                if(!isint[nl->type->etype])
                        break;
-               gins(optoas(n->etype, nl->type), nr, nl);
+               if(!isint[nr->type->etype])
+                       break;
+               regalloc(&n2, nr->type, N);
+               cgen(nr, &n2);
+               gins(optoas(n->etype, nl->type), &n2, nl);
+               regfree(&n2);
                goto ret;
        }