aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/rewriteARM.go
diff options
context:
space:
mode:
authorsmasher164 <aindurti@gmail.com>2018-10-15 03:14:57 -0400
committerKeith Randall <khr@golang.org>2019-10-21 17:42:47 +0000
commit58b031949b26efa92a80f39cf68a189b9c0ff07f (patch)
treedc73caed45bab6d1fea6485e368c06f6f0aa130a /src/cmd/compile/internal/ssa/rewriteARM.go
parent06ac26279cb93140bb2b03bcef9a3300c166cade (diff)
downloadgo-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.go17
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