]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/internal/obj/x86/obj6.go
[dev.ssa] Merge remote-tracking branch 'origin/master' into ssamerge
[gostls13.git] / src / cmd / internal / obj / x86 / obj6.go
index 6332b7e4d9f0bd03acc5b14e5d6ea1ec2a319dcc..3f8426ae3867acea64184f2a37531ef5fac6a298 100644 (file)
@@ -38,7 +38,7 @@ import (
        "math"
 )
 
-func canuse1insntls(ctxt *obj.Link) bool {
+func CanUse1InsnTLS(ctxt *obj.Link) bool {
        if isAndroid {
                // For android, we use a disgusting hack that assumes
                // the thread-local storage slot for g is allocated
@@ -130,7 +130,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
@@ -231,7 +231,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
@@ -271,7 +272,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
@@ -375,7 +377,7 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) {
        }
        if p.From.Type == obj.TYPE_ADDR && p.From.Name == obj.NAME_EXTERN && !p.From.Sym.Local {
                // $MOV $sym, Rx becomes $MOV sym@GOT, Rx
-               // $MOV $sym+<off>, Rx becomes $MOV sym@GOT, Rx; $ADD <off>, Rx
+               // $MOV $sym+<off>, Rx becomes $MOV sym@GOT, Rx; $LEA <off>(Rx), Rx
                // On 386 only, more complicated things like PUSHL $sym become $MOV sym@GOT, CX; PUSHL CX
                cmplxdest := false
                pAs := p.As
@@ -397,8 +399,9 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) {
                q := p
                if p.From.Offset != 0 {
                        q = obj.Appendp(ctxt, p)
-                       q.As = add
-                       q.From.Type = obj.TYPE_CONST
+                       q.As = lea
+                       q.From.Type = obj.TYPE_MEM
+                       q.From.Reg = p.To.Reg
                        q.From.Offset = p.From.Offset
                        q.To = p.To
                        p.From.Offset = 0
@@ -1212,16 +1215,16 @@ loop:
                q = p.Pcond
                if q != nil && q.As != obj.ATEXT {
                        /* mark instruction as done and continue layout at target of jump */
-                       p.Mark = 1
+                       p.Mark |= DONE
 
                        p = q
-                       if p.Mark == 0 {
+                       if p.Mark&DONE == 0 {
                                goto loop
                        }
                }
        }
 
-       if p.Mark != 0 {
+       if p.Mark&DONE != 0 {
                /*
                 * p goes here, but already used it elsewhere.
                 * copy up to 4 instructions or else branch to other copy.
@@ -1244,7 +1247,7 @@ loop:
                        if nofollow(a) || pushpop(a) {
                                break // NOTE(rsc): arm does goto copy
                        }
-                       if q.Pcond == nil || q.Pcond.Mark != 0 {
+                       if q.Pcond == nil || q.Pcond.Mark&DONE != 0 {
                                continue
                        }
                        if a == obj.ACALL || a == ALOOP {
@@ -1258,10 +1261,10 @@ loop:
 
                                q = obj.Copyp(ctxt, p)
                                p = p.Link
-                               q.Mark = 1
+                               q.Mark |= DONE
                                (*last).Link = q
                                *last = q
-                               if int(q.As) != a || q.Pcond == nil || q.Pcond.Mark != 0 {
+                               if int(q.As) != a || q.Pcond == nil || q.Pcond.Mark&DONE != 0 {
                                        continue
                                }
 
@@ -1271,7 +1274,7 @@ loop:
                                q.Link = p
                                xfol(ctxt, q.Link, last)
                                p = q.Link
-                               if p.Mark != 0 {
+                               if p.Mark&DONE != 0 {
                                        return
                                }
                                goto loop
@@ -1288,7 +1291,7 @@ loop:
        }
 
        /* emit p */
-       p.Mark = 1
+       p.Mark |= DONE
 
        (*last).Link = p
        *last = p
@@ -1326,7 +1329,7 @@ loop:
                        }
                } else {
                        q = p.Link
-                       if q.Mark != 0 {
+                       if q.Mark&DONE != 0 {
                                if a != ALOOP {
                                        p.As = relinv(int16(a))
                                        p.Link = p.Pcond
@@ -1336,7 +1339,7 @@ loop:
                }
 
                xfol(ctxt, p.Link, last)
-               if p.Pcond.Mark != 0 {
+               if p.Pcond.Mark&DONE != 0 {
                        return
                }
                p = p.Pcond