]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6g, cmd/8g, liblink: improve handling of float constants
authorJosh Bleecher Snyder <josharian@gmail.com>
Mon, 22 Dec 2014 23:12:28 +0000 (15:12 -0800)
committerJosh Bleecher Snyder <josharian@gmail.com>
Wed, 7 Jan 2015 22:26:55 +0000 (22:26 +0000)
* Enable basic constant propagation for floats.
  The constant propagation is still not as aggressive as it could be.
* Implement MOVSS $(0), Xx and MOVSD $(0), Xx as XORPS Xx, Xx.

Sample code:

func f32() float32 {
var f float32
return f
}

func f64() float64 {
var f float64
return f
}

Before:

"".f32 t=1 size=32 value=0 args=0x8 locals=0x0
0x0000 00000 (demo.go:3) TEXT "".f32+0(SB),4,$0-8
0x0000 00000 (demo.go:3) FUNCDATA $0,gclocals·a7a3692b8e27e823add69ec4239ba55f+0(SB)
0x0000 00000 (demo.go:3) FUNCDATA $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)
0x0000 00000 (demo.go:3) MOVSS $f32.00000000+0(SB),X0
0x0008 00008 (demo.go:4) MOVSS $f32.00000000+0(SB),X0
0x0010 00016 (demo.go:5) MOVSS X0,"".~r0+8(FP)
0x0016 00022 (demo.go:5) RET ,
"".f64 t=1 size=32 value=0 args=0x8 locals=0x0
0x0000 00000 (demo.go:8) TEXT "".f64+0(SB),4,$0-8
0x0000 00000 (demo.go:8) FUNCDATA $0,gclocals·a7a3692b8e27e823add69ec4239ba55f+0(SB)
0x0000 00000 (demo.go:8) FUNCDATA $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)
0x0000 00000 (demo.go:8) MOVSD $f64.0000000000000000+0(SB),X0
0x0008 00008 (demo.go:9) MOVSD $f64.0000000000000000+0(SB),X0
0x0010 00016 (demo.go:10) MOVSD X0,"".~r0+8(FP)
0x0016 00022 (demo.go:10) RET ,

After:

"".f32 t=1 size=16 value=0 args=0x8 locals=0x0
0x0000 00000 (demo.go:3) TEXT "".f32+0(SB),4,$0-8
0x0000 00000 (demo.go:3) FUNCDATA $0,gclocals·a7a3692b8e27e823add69ec4239ba55f+0(SB)
0x0000 00000 (demo.go:3) FUNCDATA $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)
0x0000 00000 (demo.go:3) XORPS X0,X0
0x0003 00003 (demo.go:5) MOVSS X0,"".~r0+8(FP)
0x0009 00009 (demo.go:5) RET ,
"".f64 t=1 size=16 value=0 args=0x8 locals=0x0
0x0000 00000 (demo.go:8) TEXT "".f64+0(SB),4,$0-8
0x0000 00000 (demo.go:8) FUNCDATA $0,gclocals·a7a3692b8e27e823add69ec4239ba55f+0(SB)
0x0000 00000 (demo.go:8) FUNCDATA $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)
0x0000 00000 (demo.go:8) XORPS X0,X0
0x0003 00003 (demo.go:10) MOVSD X0,"".~r0+8(FP)
0x0009 00009 (demo.go:10) RET ,

Change-Id: Ie9eb65e324af4f664153d0a7cd22bb16b0fba16d
Reviewed-on: https://go-review.googlesource.com/2053
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/6g/gsubr.c
src/cmd/6g/peep.c
src/cmd/8g/peep.c
src/liblink/obj6.c
src/liblink/obj8.c

index 5bd9246607f6b70cfabd6393d6d76679a503c042..146ead11345caf9bc61ea957e4e745912cb16e1e 100644 (file)
@@ -624,7 +624,6 @@ bignodes(void)
  *     t = f
  * hard part is conversions.
  */
-// TODO: lost special constants for floating point.  XORPD for 0.0?
 void
 gmove(Node *f, Node *t)
 {
index 24617836fed1bbc033a566a83543a7cb78cc15c6..2445081e3e767e33f5b9eceb84e9bb458f155422 100644 (file)
@@ -121,7 +121,7 @@ peep(Prog *firstp)
                case AMOVSS:
                case AMOVSD:
                        if(regtyp(&p->to))
-                       if(p->from.type == D_CONST)
+                       if(p->from.type == D_CONST || p->from.type == D_FCONST)
                                conprop(r);
                        break;
                }
@@ -384,7 +384,7 @@ regtyp(Adr *a)
        t = a->type;
        if(t >= D_AX && t <= D_R15)
                return 1;
-       if(t >= D_X0 && t <= D_X0+15)
+       if(t >= D_X0 && t <= D_X15)
                return 1;
        return 0;
 }
index 91a91d20db41b2b33b72e0e485a9bc62d2c12ae0..c9b489cd2bfa26716a7700e3bc35f7ffc2decac9 100644 (file)
@@ -120,7 +120,7 @@ peep(Prog *firstp)
                case AMOVSS:
                case AMOVSD:
                        if(regtyp(&p->to))
-                       if(p->from.type == D_CONST)
+                       if(p->from.type == D_CONST || p->from.type == D_FCONST)
                                conprop(r);
                        break;
                }
index 2acfd2f70d5babee91863370e881d2aafd454e44..a8a84f72ce330f87ca0a0bc45d351d0fda0fb939 100644 (file)
@@ -241,6 +241,19 @@ progedit(Link *ctxt, Prog *p)
 
        // Rewrite float constants to values stored in memory.
        switch(p->as) {
+       case AMOVSS:
+               // Convert AMOVSS $(0), Xx to AXORPS Xx, Xx
+               if(p->from.type == D_FCONST)
+               if(p->from.u.dval == 0)
+               if(p->to.type >= D_X0)
+               if(p->to.type <= D_X15) {
+                       p->as = AXORPS;
+                       p->from.type = p->to.type;
+                       p->from.index = p->to.index;
+                       break;
+               }
+               // fallthrough
+
        case AFMOVF:
        case AFADDF:
        case AFSUBF:
@@ -250,7 +263,6 @@ progedit(Link *ctxt, Prog *p)
        case AFDIVRF:
        case AFCOMF:
        case AFCOMFP:
-       case AMOVSS:
        case AADDSS:
        case ASUBSS:
        case AMULSS:
@@ -274,6 +286,19 @@ progedit(Link *ctxt, Prog *p)
                        p->from.offset = 0;
                }
                break;
+
+       case AMOVSD:
+               // Convert AMOVSD $(0), Xx to AXORPS Xx, Xx
+               if(p->from.type == D_FCONST)
+               if(p->from.u.dval == 0)
+               if(p->to.type >= D_X0)
+               if(p->to.type <= D_X15) {
+                       p->as = AXORPS;
+                       p->from.type = p->to.type;
+                       p->from.index = p->to.index;
+                       break;
+               }
+               // fallthrough
        
        case AFMOVD:
        case AFADDD:
@@ -284,7 +309,6 @@ progedit(Link *ctxt, Prog *p)
        case AFDIVRD:
        case AFCOMD:
        case AFCOMDP:
-       case AMOVSD:
        case AADDSD:
        case ASUBSD:
        case AMULSD:
index f54153ae9b580e31c8941572abd416c5ec0a80d1..02ef72753f767cab54d4d2e30d90403ca60c1d5e 100644 (file)
@@ -177,6 +177,19 @@ progedit(Link *ctxt, Prog *p)
 
        // Rewrite float constants to values stored in memory.
        switch(p->as) {
+       case AMOVSS:
+               // Convert AMOVSS $(0), Xx to AXORPS Xx, Xx
+               if(p->from.type == D_FCONST)
+               if(p->from.u.dval == 0)
+               if(p->to.type >= D_X0)
+               if(p->to.type <= D_X7) {
+                       p->as = AXORPS;
+                       p->from.type = p->to.type;
+                       p->from.index = p->to.index;
+                       break;
+               }
+               // fallthrough
+
        case AFMOVF:
        case AFADDF:
        case AFSUBF:
@@ -186,7 +199,6 @@ progedit(Link *ctxt, Prog *p)
        case AFDIVRF:
        case AFCOMF:
        case AFCOMFP:
-       case AMOVSS:
        case AADDSS:
        case ASUBSS:
        case AMULSS:
@@ -211,6 +223,19 @@ progedit(Link *ctxt, Prog *p)
                }
                break;
 
+       case AMOVSD:
+               // Convert AMOVSD $(0), Xx to AXORPS Xx, Xx
+               if(p->from.type == D_FCONST)
+               if(p->from.u.dval == 0)
+               if(p->to.type >= D_X0)
+               if(p->to.type <= D_X7) {
+                       p->as = AXORPS;
+                       p->from.type = p->to.type;
+                       p->from.index = p->to.index;
+                       break;
+               }
+               // fallthrough
+
        case AFMOVD:
        case AFADDD:
        case AFSUBD:
@@ -220,7 +245,6 @@ progedit(Link *ctxt, Prog *p)
        case AFDIVRD:
        case AFCOMD:
        case AFCOMDP:
-       case AMOVSD:
        case AADDSD:
        case ASUBSD:
        case AMULSD: