]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: intrinsify math.Sqrt by using only the ssa backend
authorMartin Möhrmann <moehrmann@google.com>
Wed, 2 Nov 2016 16:20:22 +0000 (17:20 +0100)
committerMartin Möhrmann <moehrmann@google.com>
Thu, 2 Feb 2017 05:44:44 +0000 (05:44 +0000)
Change-Id: If3cb64f52fe0fd7331b6f1acf3d15dd705dfd633
Reviewed-on: https://go-review.googlesource.com/32591
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/gc/opnames.go
src/cmd/compile/internal/gc/racewalk.go
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/gc/syntax.go
src/cmd/compile/internal/gc/walk.go

index bd56506e4d329d4a46271c6147daddf5a3e00f15..01faaf827e200e80069ce0f4d7d94ce3087e72c2 100644 (file)
@@ -163,7 +163,6 @@ var opnames = []string{
        ORETJMP:          "RETJMP",
        OPS:              "PS",
        OPC:              "PC",
-       OSQRT:            "SQRT",
        OGETG:            "GETG",
        OEND:             "END",
 }
index 671ed1eed7ada152114e688e404af21e41404b61..78335ca76bb279ca70ec7ae8f867843e6cdd9368 100644 (file)
@@ -187,8 +187,7 @@ func instrumentnode(np **Node, init *Nodes, wr int, skip int) {
                OPLUS,
                OREAL,
                OIMAG,
-               OCOM,
-               OSQRT:
+               OCOM:
                instrumentnode(&n.Left, init, wr, 0)
                goto ret
 
index da6b69fc5e26e70c9744673f91f0b77290a39c02..8d0c33a11760b50b6ec05779e39f5cebe67be4bb 100644 (file)
@@ -961,9 +961,6 @@ func (s *state) stmt(n *Node) {
                p := s.expr(n.Left)
                s.nilCheck(p)
 
-       case OSQRT:
-               s.expr(n.Left)
-
        default:
                s.Fatalf("unhandled stmt %v", n.Op)
        }
@@ -1213,8 +1210,6 @@ var opToSSA = map[opAndType]ssa.Op{
        opAndType{OLROT, TUINT16}: ssa.OpLrot16,
        opAndType{OLROT, TUINT32}: ssa.OpLrot32,
        opAndType{OLROT, TUINT64}: ssa.OpLrot64,
-
-       opAndType{OSQRT, TFLOAT64}: ssa.OpSqrt,
 }
 
 func (s *state) concreteEtype(t *Type) EType {
@@ -1953,7 +1948,7 @@ func (s *state) expr(n *Node) *ssa.Value {
                                s.newValue1(negop, tp, s.newValue1(ssa.OpComplexImag, tp, a)))
                }
                return s.newValue1(s.ssaOp(n.Op, n.Type), a.Type, a)
-       case ONOT, OCOM, OSQRT:
+       case ONOT, OCOM:
                a := s.expr(n.Left)
                return s.newValue1(s.ssaOp(n.Op, n.Type), a.Type, a)
        case OIMAG, OREAL:
@@ -2698,6 +2693,11 @@ func intrinsicInit() {
                        s.vars[&memVar] = s.newValue3(ssa.OpAtomicOr8, ssa.TypeMem, args[0], args[1], s.mem())
                        return nil
                }, sys.AMD64, sys.ARM64, sys.MIPS),
+
+               /******** math ********/
+               intrinsicKey{"math", "Sqrt"}: enableOnArch(func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
+                       return s.newValue1(ssa.OpSqrt, Types[TFLOAT64], args[0])
+               }, sys.AMD64, sys.ARM, sys.ARM64, sys.MIPS, sys.PPC64, sys.S390X),
        }
 
        // aliases internal to runtime/internal/atomic
index b0cf77d47919b9643ec62e031763d52480bd2a49..e9e5d8fbe12a0d4e83c29d5301429a3dee333d22 100644 (file)
@@ -505,7 +505,6 @@ const (
        ORETJMP // return to other function
        OPS     // compare parity set (for x86 NaN check)
        OPC     // compare parity clear (for x86 NaN check)
-       OSQRT   // sqrt(float64), on systems that have hw support
        OGETG   // runtime.getg() (read g pointer)
 
        OEND
index 87084bc82ad3c49812c79e89be6234465d63d428..a380f66fb2e4e7199974f9a06126d55e64ffaa18 100644 (file)
@@ -652,16 +652,6 @@ opswitch:
                n.Left = walkexpr(n.Left, init)
                walkexprlist(n.List.Slice(), init)
 
-               if n.Left.Op == ONAME && n.Left.Sym.Name == "Sqrt" &&
-                       (n.Left.Sym.Pkg.Path == "math" || n.Left.Sym.Pkg == localpkg && myimportpath == "math") {
-                       if Thearch.LinkArch.InFamily(sys.AMD64, sys.ARM, sys.ARM64, sys.MIPS, sys.PPC64, sys.S390X) {
-                               n.Op = OSQRT
-                               n.Left = n.List.First()
-                               n.List.Set(nil)
-                               break opswitch
-                       }
-               }
-
                ll := ascompatte(n.Op, n, n.Isddd, t.Params(), n.List.Slice(), 0, init)
                n.List.Set(reorder1(ll))