]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/8g: extend elimination of temporaries to SSE2 code.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Wed, 2 Jan 2013 23:44:31 +0000 (00:44 +0100)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Wed, 2 Jan 2013 23:44:31 +0000 (00:44 +0100)
Before:
(erf.go:188)    TEXT     Erf+0(SB),$220
(erf.go:265)    TEXT     Erfc+0(SB),$204
(lgamma.go:174) TEXT     Lgamma+0(SB),$948

After:
(erf.go:188)    TEXT     Erf+0(SB),$84
(erf.go:265)    TEXT     Erfc+0(SB),$84
(lgamma.go:174) TEXT     Lgamma+0(SB),$44

SSE before vs. SSE after:

benchmark             old ns/op    new ns/op    delta
BenchmarkAcosh               81           49  -39.14%
BenchmarkAsinh              109          109   +0.00%
BenchmarkAtanh               73           74   +0.68%
BenchmarkLgamma             138           42  -69.20%
BenchmarkModf                24           15  -36.95%
BenchmarkSqrtGo             565          556   -1.59%

R=rsc
CC=golang-dev
https://golang.org/cl/7028048

src/cmd/8g/reg.c

index 2ae819548b2665fc2fc7b3a3da10d2f76bd158bf..80230bc866877050e556f5f4737a50a82d36b3d2 100644 (file)
@@ -1845,26 +1845,33 @@ fixtemp(Prog *firstp)
        for(p=firstp; p!=P; p=p->link) {
                if(debug['R'] && debug['v'])
                        print("%P\n", p);
-               if(p->link == P
-                       || !RtoB(p->from.type)
-                       || p->to.type != D_AUTO
-                       || isfloat[p->to.etype])
+               if(p->link == P || p->to.type != D_AUTO)
                        continue;
-               switch(p->as) {
-               case AMOVB:
-                       if(p->to.width == 1)
-                               break;
-               case AMOVW:
-                       if(p->to.width == 2)
+               if(isfloat[p->to.etype] && FtoB(p->from.type)) {
+                       switch(p->as) {
+                       case AMOVSS:
+                       case AMOVSD:
                                break;
-               case AMOVL:
-                       if(p->to.width == 4)
-                               break;
-               default:
+                       default:
+                               continue;
+                       }
+               } else if(!isfloat[p->to.etype] && RtoB(p->from.type)) {
+                       switch(p->as) {
+                       case AMOVB:
+                               if(p->to.width == 1)
+                                       break;
+                       case AMOVW:
+                               if(p->to.width == 2)
+                                       break;
+                       case AMOVL:
+                               if(p->to.width == 4)
+                                       break;
+                       default:
+                               continue;
+                       }
+               } else
                        continue;
-               }
                // p is a MOV reg, mem.
-               // and it is not a float.
                p2 = p->link;
                h = hash32to16(fnv1(p->to.sym));
                if(counts[h] != 2) {
@@ -1872,7 +1879,9 @@ fixtemp(Prog *firstp)
                }
                switch(p2->as) {
                case ALEAL:
-               case AFMOVL: 
+               case AFMOVD:
+               case AFMOVF:
+               case AFMOVL:
                case AFMOVW:
                case AFMOVV:
                        // funny