mirror of
https://github.com/golang/go
synced 2024-11-23 02:00:03 -07:00
cmd/compile: add intrinsic for MulUintptr on arm64
This CL adds intrinsic for runtime/internal/math.MulUintptr on arm64 Benchmark master ThisCL(ns/op) delta MulUintptr/small 0.95ns 0.79ns -16% MulUintptr/large 1.31ns 0.95ns -27.6% Change-Id: Ic7b453ad502826beffe93ce5531b8ba752312a1b Reviewed-on: https://go-review.googlesource.com/c/go/+/419556 Reviewed-by: Keith Randall <khr@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Run-TryBot: Eric Fang <eric.fang@arm.com> Auto-Submit: Keith Randall <khr@golang.org> Reviewed-by: Joedian Reid <joedian@golang.org>
This commit is contained in:
parent
f15761b50b
commit
d654117075
@ -2977,3 +2977,8 @@
|
|||||||
=> (Move [sz] dst src mem)
|
=> (Move [sz] dst src mem)
|
||||||
|
|
||||||
((REV|REVW) ((REV|REVW) p)) => p
|
((REV|REVW) ((REV|REVW) p)) => p
|
||||||
|
|
||||||
|
// runtime/internal/math.MulUintptr intrinsics
|
||||||
|
|
||||||
|
(Select0 (Mul64uover x y)) => (MUL x y)
|
||||||
|
(Select1 (Mul64uover x y)) => (NotEqual (CMPconst (UMULH <typ.UInt64> x y) [0]))
|
@ -27362,6 +27362,18 @@ func rewriteValueARM64_OpSelect0(v *Value) bool {
|
|||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
// match: (Select0 (Mul64uover x y))
|
||||||
|
// result: (MUL x y)
|
||||||
|
for {
|
||||||
|
if v_0.Op != OpMul64uover {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
y := v_0.Args[1]
|
||||||
|
x := v_0.Args[0]
|
||||||
|
v.reset(OpARM64MUL)
|
||||||
|
v.AddArg2(x, y)
|
||||||
|
return true
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
func rewriteValueARM64_OpSelect1(v *Value) bool {
|
func rewriteValueARM64_OpSelect1(v *Value) bool {
|
||||||
@ -27415,6 +27427,23 @@ func rewriteValueARM64_OpSelect1(v *Value) bool {
|
|||||||
v.AddArg(v0)
|
v.AddArg(v0)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
// match: (Select1 (Mul64uover x y))
|
||||||
|
// result: (NotEqual (CMPconst (UMULH <typ.UInt64> x y) [0]))
|
||||||
|
for {
|
||||||
|
if v_0.Op != OpMul64uover {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
y := v_0.Args[1]
|
||||||
|
x := v_0.Args[0]
|
||||||
|
v.reset(OpARM64NotEqual)
|
||||||
|
v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags)
|
||||||
|
v0.AuxInt = int64ToAuxInt(0)
|
||||||
|
v1 := b.NewValue0(v.Pos, OpARM64UMULH, typ.UInt64)
|
||||||
|
v1.AddArg2(x, y)
|
||||||
|
v0.AddArg(v1)
|
||||||
|
v.AddArg(v0)
|
||||||
|
return true
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
func rewriteValueARM64_OpSelectN(v *Value) bool {
|
func rewriteValueARM64_OpSelectN(v *Value) bool {
|
||||||
|
@ -3908,7 +3908,7 @@ func InitTables() {
|
|||||||
}
|
}
|
||||||
return s.newValue2(ssa.OpMul64uover, types.NewTuple(types.Types[types.TUINT], types.Types[types.TUINT]), args[0], args[1])
|
return s.newValue2(ssa.OpMul64uover, types.NewTuple(types.Types[types.TUINT], types.Types[types.TUINT]), args[0], args[1])
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.I386, sys.Loong64, sys.MIPS64, sys.RISCV64)
|
sys.AMD64, sys.I386, sys.Loong64, sys.MIPS64, sys.RISCV64, sys.ARM64)
|
||||||
alias("runtime", "mulUintptr", "runtime/internal/math", "MulUintptr", all...)
|
alias("runtime", "mulUintptr", "runtime/internal/math", "MulUintptr", all...)
|
||||||
add("runtime", "KeepAlive",
|
add("runtime", "KeepAlive",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
|
Loading…
Reference in New Issue
Block a user