sys.ARM64, sys.PPC64, sys.S390X)
addF("math", "Fma",
func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
+ if !s.config.UseFMA {
+ a := s.call(n, callNormal)
+ s.vars[n] = s.load(types.Types[TFLOAT64], a)
+ return s.variable(n, types.Types[TFLOAT64])
+ }
addr := s.entryNewValue1A(ssa.OpAddr, types.Types[TBOOL].PtrTo(), x86HasFMA, s.sb)
v := s.load(types.Types[TBOOL], addr)
b := s.endBlock()
sys.AMD64)
addF("math", "Fma",
func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
+ if !s.config.UseFMA {
+ a := s.call(n, callNormal)
+ s.vars[n] = s.load(types.Types[TFLOAT64], a)
+ return s.variable(n, types.Types[TFLOAT64])
+ }
addr := s.entryNewValue1A(ssa.OpAddr, types.Types[TBOOL].PtrTo(), armHasVFPv4, s.sb)
v := s.load(types.Types[TBOOL], addr)
b := s.endBlock()
Race bool // race detector enabled
NeedsFpScratch bool // No direct move between GP and FP register sets
BigEndian bool //
+ UseFMA bool // Use hardware FMA operation
}
type (
c.ctxt = ctxt
c.optimize = optimize
c.useSSE = true
+ c.UseFMA = true
- // Don't use Duff's device nor SSE on Plan 9 AMD64, because
- // floating point operations are not allowed in note handler.
- if objabi.GOOS == "plan9" && arch == "amd64" {
- c.noDuffDevice = true
- c.useSSE = false
+ // On Plan 9, floating point operations are not allowed in note handler.
+ if objabi.GOOS == "plan9" {
+ // Don't use FMA on Plan 9
+ c.UseFMA = false
+
+ // Don't use Duff's device and SSE on Plan 9 AMD64.
+ if arch == "amd64" {
+ c.noDuffDevice = true
+ c.useSSE = false
+ }
}
if ctxt.Flag_shared {