]> Cypherpunks repositories - gostls13.git/commitdiff
gc: better compilation of floating point +=
authorRuss Cox <rsc@golang.org>
Fri, 5 Mar 2010 23:35:09 +0000 (15:35 -0800)
committerRuss Cox <rsc@golang.org>
Fri, 5 Mar 2010 23:35:09 +0000 (15:35 -0800)
R=ken2
CC=golang-dev
https://golang.org/cl/255042

src/cmd/5g/ggen.c
src/cmd/6g/ggen.c
src/cmd/8g/cgen.c
src/cmd/8g/ggen.c
src/cmd/gc/walk.c

index 3f32e601b3051125ecf073055c99c52b5c0465ef..758e140dcec5ea15aa6b0fa503d9c09ddc8d84fe 100644 (file)
@@ -479,27 +479,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);
        goto ret;
 
index 731e922bb6666e560183ec142910e8c46183459c..45fd17b27ee605194e51a1f2f08007940d8a9792 100644 (file)
@@ -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:
index 1185ee49f8e826f867f574b0bc86e4c1ac85f9fd..5adf29a438a484235f24c09001750f968aa619ee 100644 (file)
@@ -18,7 +18,7 @@ mgen(Node *n, Node *n1, Node *rg)
                        reg[n->val.u.reg]++;
                return;
        }
-       if(n->type->width > widthptr)
+       if(n->type->width > widthptr && !isfloat[n->type->etype])
                tempname(n1, n->type);
        else
                regalloc(n1, n->type, rg);
index 549488d16c9a99f5f52a7aa10833569795c930b0..f6fa7da0b023fa68df186fba4121619dfc515a9e 100644 (file)
@@ -471,21 +471,34 @@ cgen_asop(Node *n)
        }
 
 hard:
-       tempname(&n2, nr->type);
-       cgen(nr, &n2);
-
-       igen(nl, &n1, N);
+       n2.op = 0;
+       n1.op = 0;
+       if(nr->ullman >= nl->ullman || nl->addable) {
+               mgen(nr, &n2, N);
+               nr = &n2;
+               nr = &n2;
+       } else {
+               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;
 
-       tempname(&n4, nl->type);
-       cgen(&n3, &n4);
-       gmove(&n4, &n1);
+       mgen(&n3, &n4, N);
+       gmove(&n4, nl);
 
-       regfree(&n1);
+       if(n1.op)
+               regfree(&n1);
+       mfree(&n2);
+       mfree(&n4);
 
 ret:
        ;
index 2f151307abdf15e57da7568efe2bed5c16dc89b6..5ee82eeac7943cbf6310dd4f5da23b7ebc809338 100644 (file)
@@ -823,10 +823,13 @@ walkexpr(Node **np, NodeList **init)
                }
 
                /*
-                * on 32-bit arch, rewrite 64-bit ops into l = l op r
+                * on 32-bit arch, rewrite 64-bit ops into l = l op r.
+                * on 386, rewrite float ops into l = l op r.
+                * TODO(rsc): Maybe this rewrite should be done always?
                 */
                et = n->left->type->etype;
-               if(widthptr == 4 && (et == TUINT64 || et == TINT64)) {
+               if((widthptr == 4 && (et == TUINT64 || et == TINT64)) ||
+                  (thechar == '8' && isfloat[et])) {
                        l = safeexpr(n->left, init);
                        r = nod(OAS, l, nod(n->etype, l, n->right));
                        typecheck(&r, Etop);