]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: fix liblink rewrite of -0.0
authorTodd Neal <todd@tneal.org>
Wed, 2 Sep 2015 02:25:24 +0000 (21:25 -0500)
committerTodd Neal <todd@tneal.org>
Wed, 2 Sep 2015 10:41:55 +0000 (10:41 +0000)
liblink was rewriting xor by a negative zero (used by SSA
for negation) as XORPS reg,reg.

Fixes strconv.

Change-Id: I627a0a7366618e6b07ba8f0ad0db0e102340c5e3
Reviewed-on: https://go-review.googlesource.com/14200
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/testdata/fp_ssa.go
src/cmd/internal/obj/x86/obj6.go

index 6193983e4c950d4cab3f8e04594382277d607d56..ee3163abb3ae3da35edf83fbb4ad4f2686bb7ada 100644 (file)
@@ -105,6 +105,12 @@ func div64_ssa(a, b float64) float64 {
        return a / b
 }
 
+func neg64_ssa(a, b float64) float64 {
+       switch {
+       }
+       return -a + -1*b
+}
+
 func add32_ssa(a, b float32) float32 {
        switch {
        }
@@ -128,6 +134,12 @@ func div32_ssa(a, b float32) float32 {
        return a / b
 }
 
+func neg32_ssa(a, b float32) float32 {
+       switch {
+       }
+       return -a + -1*b
+}
+
 func conv2Float64_ssa(a int8, b uint8, c int16, d uint16,
        e int32, f uint32, g int64, h uint64, i float32) (aa, bb, cc, dd, ee, ff, gg, hh, ii float64) {
        switch {
@@ -1548,11 +1560,13 @@ func main() {
        fails += fail64("*", mul64_ssa, a, b, 12.0)
        fails += fail64("-", sub64_ssa, a, b, -1.0)
        fails += fail64("/", div64_ssa, a, b, 0.75)
+       fails += fail64("neg", neg64_ssa, a, b, -7)
 
        fails += fail32("+", add32_ssa, c, d, 7.0)
        fails += fail32("*", mul32_ssa, c, d, 12.0)
        fails += fail32("-", sub32_ssa, c, d, -1.0)
        fails += fail32("/", div32_ssa, c, d, 0.75)
+       fails += fail32("neg", neg32_ssa, c, d, -7)
 
        // denorm-squared should underflow to zero.
        fails += fail32("*", mul32_ssa, tiny, tiny, 0)
index d0efffbc0a75bb36d14e2584a6044383135259a1..d55dcc7cac11d9f82a8f82d0200b03019c00adec 100644 (file)
@@ -221,7 +221,8 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
        // Convert AMOVSS $(0), Xx to AXORPS Xx, Xx
        case AMOVSS:
                if p.From.Type == obj.TYPE_FCONST {
-                       if p.From.Val.(float64) == 0 {
+                       //  f == 0 can't be used here due to -0, so use Float64bits
+                       if f := p.From.Val.(float64); math.Float64bits(f) == 0 {
                                if p.To.Type == obj.TYPE_REG && REG_X0 <= p.To.Reg && p.To.Reg <= REG_X15 {
                                        p.As = AXORPS
                                        p.From = p.To
@@ -261,7 +262,8 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
        case AMOVSD:
                // Convert AMOVSD $(0), Xx to AXORPS Xx, Xx
                if p.From.Type == obj.TYPE_FCONST {
-                       if p.From.Val.(float64) == 0 {
+                       //  f == 0 can't be used here due to -0, so use Float64bits
+                       if f := p.From.Val.(float64); math.Float64bits(f) == 0 {
                                if p.To.Type == obj.TYPE_REG && REG_X0 <= p.To.Reg && p.To.Reg <= REG_X15 {
                                        p.As = AXORPS
                                        p.From = p.To