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 {
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:
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,
(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)
{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
{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
OpAMD64NOTL
OpAMD64NOTW
OpAMD64NOTB
+ OpAMD64SQRTSD
OpAMD64SBBQcarrymask
OpAMD64SBBLcarrymask
OpAMD64SETEQ
OpCom16
OpCom32
OpCom64
+ OpSqrt
OpPhi
OpCopy
OpConstBool
},
},
},
+ {
+ 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,
name: "Com64",
generic: true,
},
+ {
+ name: "Sqrt",
+ generic: true,
+ },
{
name: "Phi",
generic: true,
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: