Commit 50f11577 authored by Meng Zhuo's avatar Meng Zhuo Committed by Cherry Zhang

cmd/compile: add math/bits.Mul64 intrinsic on mips64x

Benchmark:
name   old time/op  new time/op  delta
Mul    36.0ns ± 1%   2.8ns ± 0%  -92.31%  (p=0.000 n=10+10)
Mul32  4.37ns ± 0%  4.37ns ± 0%     ~     (p=0.429 n=6+10)
Mul64  36.4ns ± 0%   2.8ns ± 0%  -92.37%  (p=0.000 n=10+9)

Change-Id: Ic4f4e5958adbf24999abcee721d0180b5413fca7
Reviewed-on: https://go-review.googlesource.com/c/go/+/200582Reviewed-by: default avatarKeith Randall <khr@golang.org>
Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 9f95a309
...@@ -3600,8 +3600,8 @@ func init() { ...@@ -3600,8 +3600,8 @@ func init() {
func(s *state, n *Node, args []*ssa.Value) *ssa.Value { func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
return s.newValue2(ssa.OpMul64uhilo, types.NewTuple(types.Types[TUINT64], types.Types[TUINT64]), args[0], args[1]) return s.newValue2(ssa.OpMul64uhilo, types.NewTuple(types.Types[TUINT64], types.Types[TUINT64]), args[0], args[1])
}, },
sys.AMD64, sys.ARM64, sys.PPC64, sys.S390X) sys.AMD64, sys.ARM64, sys.PPC64, sys.S390X, sys.MIPS64)
alias("math/bits", "Mul", "math/bits", "Mul64", sys.ArchAMD64, sys.ArchARM64, sys.ArchPPC64, sys.ArchS390X) alias("math/bits", "Mul", "math/bits", "Mul64", sys.ArchAMD64, sys.ArchARM64, sys.ArchPPC64, sys.ArchS390X, sys.ArchMIPS64, sys.ArchMIPS64LE)
addF("math/bits", "Add64", addF("math/bits", "Add64",
func(s *state, n *Node, args []*ssa.Value) *ssa.Value { func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
return s.newValue3(ssa.OpAdd64carry, types.NewTuple(types.Types[TUINT64], types.Types[TUINT64]), args[0], args[1], args[2]) return s.newValue3(ssa.OpAdd64carry, types.NewTuple(types.Types[TUINT64], types.Types[TUINT64]), args[0], args[1], args[2])
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
(Mul(64|32|16|8) x y) -> (Select1 (MULVU x y)) (Mul(64|32|16|8) x y) -> (Select1 (MULVU x y))
(Mul(32|64)F x y) -> (MUL(F|D) x y) (Mul(32|64)F x y) -> (MUL(F|D) x y)
(Mul64uhilo x y) -> (MULVU x y)
(Hmul64 x y) -> (Select0 (MULV x y)) (Hmul64 x y) -> (Select0 (MULV x y))
(Hmul64u x y) -> (Select0 (MULVU x y)) (Hmul64u x y) -> (Select0 (MULVU x y))
......
...@@ -415,6 +415,8 @@ func rewriteValueMIPS64(v *Value) bool { ...@@ -415,6 +415,8 @@ func rewriteValueMIPS64(v *Value) bool {
return rewriteValueMIPS64_OpMul64_0(v) return rewriteValueMIPS64_OpMul64_0(v)
case OpMul64F: case OpMul64F:
return rewriteValueMIPS64_OpMul64F_0(v) return rewriteValueMIPS64_OpMul64F_0(v)
case OpMul64uhilo:
return rewriteValueMIPS64_OpMul64uhilo_0(v)
case OpMul8: case OpMul8:
return rewriteValueMIPS64_OpMul8_0(v) return rewriteValueMIPS64_OpMul8_0(v)
case OpNeg16: case OpNeg16:
...@@ -6796,6 +6798,18 @@ func rewriteValueMIPS64_OpMul64F_0(v *Value) bool { ...@@ -6796,6 +6798,18 @@ func rewriteValueMIPS64_OpMul64F_0(v *Value) bool {
return true return true
} }
} }
func rewriteValueMIPS64_OpMul64uhilo_0(v *Value) bool {
// match: (Mul64uhilo x y)
// result: (MULVU x y)
for {
y := v.Args[1]
x := v.Args[0]
v.reset(OpMIPS64MULVU)
v.AddArg(x)
v.AddArg(y)
return true
}
}
func rewriteValueMIPS64_OpMul8_0(v *Value) bool { func rewriteValueMIPS64_OpMul8_0(v *Value) bool {
b := v.Block b := v.Block
typ := &b.Func.Config.Types typ := &b.Func.Config.Types
......
...@@ -558,6 +558,7 @@ func Mul(x, y uint) (hi, lo uint) { ...@@ -558,6 +558,7 @@ func Mul(x, y uint) (hi, lo uint) {
// ppc64:"MULHDU","MULLD" // ppc64:"MULHDU","MULLD"
// ppc64le:"MULHDU","MULLD" // ppc64le:"MULHDU","MULLD"
// s390x:"MLGR" // s390x:"MLGR"
// mips64: "MULVU"
return bits.Mul(x, y) return bits.Mul(x, y)
} }
...@@ -567,6 +568,7 @@ func Mul64(x, y uint64) (hi, lo uint64) { ...@@ -567,6 +568,7 @@ func Mul64(x, y uint64) (hi, lo uint64) {
// ppc64:"MULHDU","MULLD" // ppc64:"MULHDU","MULLD"
// ppc64le:"MULHDU","MULLD" // ppc64le:"MULHDU","MULLD"
// s390x:"MLGR" // s390x:"MLGR"
// mips64: "MULVU"
return bits.Mul64(x, y) return bits.Mul64(x, y)
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment