diff options
author | smasher164 <aindurti@gmail.com> | 2018-10-15 03:14:57 -0400 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2019-10-21 17:42:47 +0000 |
commit | 58b031949b26efa92a80f39cf68a189b9c0ff07f (patch) | |
tree | dc73caed45bab6d1fea6485e368c06f6f0aa130a /src/cmd/compile/internal/ssa/rewriteARM.go | |
parent | 06ac26279cb93140bb2b03bcef9a3300c166cade (diff) | |
download | go-58b031949b26efa92a80f39cf68a189b9c0ff07f.tar.gz go-58b031949b26efa92a80f39cf68a189b9c0ff07f.zip |
cmd/compile: add fma intrinsic for arm
This change introduces an arm intrinsic that generates the FMULAD
instruction for the fused-multiply-add operation on systems that
support it. System support is detected via cpu.ARM.HasVFPv4. A rewrite
rule translates the generic intrinsic to FMULAD.
Updates #25819.
Change-Id: I8459e5dd1cdbdca35f88a78dbeb7d387f1e20efa
Reviewed-on: https://go-review.googlesource.com/c/go/+/142117
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/ssa/rewriteARM.go')
-rw-r--r-- | src/cmd/compile/internal/ssa/rewriteARM.go | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go index ece2fe4fe9..24064bdefb 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM.go +++ b/src/cmd/compile/internal/ssa/rewriteARM.go @@ -538,6 +538,8 @@ func rewriteValueARM(v *Value) bool { return rewriteValueARM_OpEqB_0(v) case OpEqPtr: return rewriteValueARM_OpEqPtr_0(v) + case OpFma: + return rewriteValueARM_OpFma_0(v) case OpGeq16: return rewriteValueARM_OpGeq16_0(v) case OpGeq16U: @@ -17159,6 +17161,21 @@ func rewriteValueARM_OpEqPtr_0(v *Value) bool { return true } } +func rewriteValueARM_OpFma_0(v *Value) bool { + // match: (Fma x y z) + // cond: + // result: (FMULAD z x y) + for { + z := v.Args[2] + x := v.Args[0] + y := v.Args[1] + v.reset(OpARMFMULAD) + v.AddArg(z) + v.AddArg(x) + v.AddArg(y) + return true + } +} func rewriteValueARM_OpGeq16_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types |