]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile/internal/ssa: implement OSQRT
authorKeith Randall <khr@golang.org>
Sat, 12 Sep 2015 20:26:57 +0000 (13:26 -0700)
committerKeith Randall <khr@golang.org>
Sat, 12 Sep 2015 20:57:10 +0000 (20:57 +0000)
Change-Id: Iec61ca1bdc064c29ceca6d47f600d5643d0a64dd
Reviewed-on: https://go-review.googlesource.com/14533
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/ssa/gen/AMD64.rules
src/cmd/compile/internal/ssa/gen/AMD64Ops.go
src/cmd/compile/internal/ssa/gen/genericOps.go
src/cmd/compile/internal/ssa/opGen.go
src/cmd/compile/internal/ssa/rewriteAMD64.go

index 7086a4f84a8146e66e6613d95b6a774e0b3e7e33..a0bd07d681bde2e6b729289fe20b3342c09289e5 100644 (file)
@@ -988,6 +988,8 @@ 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) uint8 {
@@ -1643,7 +1645,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:
+       case ONOT, OCOM, OSQRT:
                a := s.expr(n.Left)
                return s.newValue1(s.ssaOp(n.Op, n.Type), a.Type, a)
        case OIMAG, OREAL:
@@ -3325,6 +3327,12 @@ func (s *genState) genValue(v *ssa.Value) {
                p := Prog(v.Op.Asm())
                p.To.Type = obj.TYPE_REG
                p.To.Reg = r
+       case ssa.OpAMD64SQRTSD:
+               p := Prog(v.Op.Asm())
+               p.From.Type = obj.TYPE_REG
+               p.From.Reg = regnum(v.Args[0])
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = regnum(v)
        case ssa.OpSP, ssa.OpSB:
                // nothing to do
        case ssa.OpAMD64SETEQ, ssa.OpAMD64SETNE,
index cba16eadc7570eb924fa424697bb6407102446b3..0591e8f8ef59ba52b1de53995cd0a9964e9361ed 100644 (file)
@@ -89,6 +89,8 @@
 (Com16 x) -> (NOTW x)
 (Com8 x) -> (NOTB x)
 
+(Sqrt x) -> (SQRTSD x)
+
 // Note: we always extend to 64 bits even though some ops don't need that many result bits.
 (SignExt8to16 x) -> (MOVBQSX x)
 (SignExt8to32 x) -> (MOVBQSX x)
index 0eee551f32e3185470ae0b4ce9b2c4bf346b55ba..d5bd5b38e011af4755a45929fe0e7ce0e8bed160 100644 (file)
@@ -307,6 +307,8 @@ func init() {
                {name: "NOTW", reg: gp11, asm: "NOTW"}, // ^arg0
                {name: "NOTB", reg: gp11, asm: "NOTB"}, // ^arg0
 
+               {name: "SQRTSD", reg: fp11, asm: "SQRTSD"}, // sqrt(arg0)
+
                {name: "SBBQcarrymask", reg: flagsgp, asm: "SBBQ"}, // (int64)(-1) if carry is set, 0 if carry is clear.
                {name: "SBBLcarrymask", reg: flagsgp, asm: "SBBL"}, // (int32)(-1) if carry is set, 0 if carry is clear.
                // Note: SBBW and SBBB are subsumed by SBBL
index a9497644e88d22a1874641b8fefb1c6c4490562d..dcaff959c3882764e279678d542bb015ec4f92b4 100644 (file)
@@ -232,6 +232,8 @@ var genericOps = []opData{
        {name: "Com32"},
        {name: "Com64"},
 
+       {name: "Sqrt"}, // sqrt(arg0), float64 only
+
        // Data movement
        {name: "Phi"},  // select an argument based on which predecessor block we came from
        {name: "Copy"}, // output = arg0
index 7918c209a471b1a5b2b16e46495fd46f3a2a8ab3..f7f1ca30687fad6d0531a90155cb7db878075f03 100644 (file)
@@ -203,6 +203,7 @@ const (
        OpAMD64NOTL
        OpAMD64NOTW
        OpAMD64NOTB
+       OpAMD64SQRTSD
        OpAMD64SBBQcarrymask
        OpAMD64SBBLcarrymask
        OpAMD64SETEQ
@@ -448,6 +449,7 @@ const (
        OpCom16
        OpCom32
        OpCom64
+       OpSqrt
        OpPhi
        OpCopy
        OpConstBool
@@ -2361,6 +2363,18 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
+       {
+               name: "SQRTSD",
+               asm:  x86.ASQRTSD,
+               reg: regInfo{
+                       inputs: []inputInfo{
+                               {0, 4294901760}, // .X0 .X1 .X2 .X3 .X4 .X5 .X6 .X7 .X8 .X9 .X10 .X11 .X12 .X13 .X14 .X15
+                       },
+                       outputs: []regMask{
+                               4294901760, // .X0 .X1 .X2 .X3 .X4 .X5 .X6 .X7 .X8 .X9 .X10 .X11 .X12 .X13 .X14 .X15
+                       },
+               },
+       },
        {
                name: "SBBQcarrymask",
                asm:  x86.ASBBQ,
@@ -3809,6 +3823,10 @@ var opcodeTable = [...]opInfo{
                name:    "Com64",
                generic: true,
        },
+       {
+               name:    "Sqrt",
+               generic: true,
+       },
        {
                name:    "Phi",
                generic: true,
index 7917d8d97119811cbdcb05d2cb0828095c6384d7..cb6405d44d25916dd7724f43fcfa56a55e661276 100644 (file)
@@ -9391,6 +9391,22 @@ func rewriteValueAMD64(v *Value, config *Config) bool {
                goto endcef6d6001d3f25cf5dacee11a46e5c8c
        endcef6d6001d3f25cf5dacee11a46e5c8c:
                ;
+       case OpSqrt:
+               // match: (Sqrt x)
+               // cond:
+               // result: (SQRTSD x)
+               {
+                       x := v.Args[0]
+                       v.Op = OpAMD64SQRTSD
+                       v.AuxInt = 0
+                       v.Aux = nil
+                       v.resetArgs()
+                       v.AddArg(x)
+                       return true
+               }
+               goto end72f79ca9ec139e15856aaa03338cf543
+       end72f79ca9ec139e15856aaa03338cf543:
+               ;
        case OpStaticCall:
                // match: (StaticCall [argwid] {target} mem)
                // cond: