]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/internal/obj/x86/obj6.go
[dev.ssa] Merge remote-tracking branch 'origin/master' into mergebranch
[gostls13.git] / src / cmd / internal / obj / x86 / obj6.go
index 8fbe8652190b3d9a49e88835a957df6dd0063d0c..503971a40dbf230272c6471bdeb4ecf6cc931343 100644 (file)
@@ -38,7 +38,7 @@ import (
        "math"
 )
 
-func canuse1insntls(ctxt *obj.Link) bool {
+func CanUse1InsnTLS(ctxt *obj.Link) bool {
        if ctxt.Arch.Regsize == 4 {
                switch ctxt.Headtype {
                case obj.Hlinux,
@@ -120,7 +120,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
        // rewriting the instructions more comprehensively, and it only does because
        // we only support a single TLS variable (g).
 
-       if canuse1insntls(ctxt) {
+       if CanUse1InsnTLS(ctxt) {
                // Reduce 2-instruction sequence to 1-instruction sequence.
                // Sequences like
                //      MOVQ TLS, BX
@@ -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