mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: fold negation into multiplication on loong64
This change also add corresponding benchmark tests and codegen tests.
The performance improvement on CPU Loongson-3A6000-HV is as follows:
goos: linux
goarch: loong64
pkg: cmd/compile/internal/test
cpu: Loongson-3A6000-HV @ 2500.00MHz
| bench.old | bench.new |
| sec/op | sec/op vs base |
MulNeg 828.4n ± 0% 655.9n ± 0% -20.82% (p=0.000 n=10)
Mul2Neg 1062.0n ± 0% 826.8n ± 0% -22.15% (p=0.000 n=10)
geomean 938.0n 736.4n -21.49%
Change-Id: Ia999732880ec65be0c66cddc757a4868847e5b15
Reviewed-on: https://go-review.googlesource.com/c/go/+/682535
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Mark Freeman <markfreeman@google.com>
This commit is contained in:
parent
e1fd4faf91
commit
a552737418
4 changed files with 77 additions and 0 deletions
|
|
@ -755,6 +755,9 @@
|
||||||
|
|
||||||
(MULV x (MOVVconst [c])) && canMulStrengthReduce(config, c) => {mulStrengthReduce(v, x, c)}
|
(MULV x (MOVVconst [c])) && canMulStrengthReduce(config, c) => {mulStrengthReduce(v, x, c)}
|
||||||
|
|
||||||
|
(MULV (NEGV x) (MOVVconst [c])) => (MULV x (MOVVconst [-c]))
|
||||||
|
(MULV (NEGV x) (NEGV y)) => (MULV x y)
|
||||||
|
|
||||||
// div by constant
|
// div by constant
|
||||||
(DIVVU x (MOVVconst [1])) => x
|
(DIVVU x (MOVVconst [1])) => x
|
||||||
(DIVVU x (MOVVconst [c])) && isPowerOfTwo(c) => (SRLVconst [log64(c)] x)
|
(DIVVU x (MOVVconst [c])) && isPowerOfTwo(c) => (SRLVconst [log64(c)] x)
|
||||||
|
|
|
||||||
|
|
@ -5539,6 +5539,7 @@ func rewriteValueLOONG64_OpLOONG64MULV(v *Value) bool {
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
b := v.Block
|
b := v.Block
|
||||||
config := b.Func.Config
|
config := b.Func.Config
|
||||||
|
typ := &b.Func.Config.Types
|
||||||
// match: (MULV _ (MOVVconst [0]))
|
// match: (MULV _ (MOVVconst [0]))
|
||||||
// result: (MOVVconst [0])
|
// result: (MOVVconst [0])
|
||||||
for {
|
for {
|
||||||
|
|
@ -5583,6 +5584,44 @@ func rewriteValueLOONG64_OpLOONG64MULV(v *Value) bool {
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
// match: (MULV (NEGV x) (MOVVconst [c]))
|
||||||
|
// result: (MULV x (MOVVconst [-c]))
|
||||||
|
for {
|
||||||
|
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
|
||||||
|
if v_0.Op != OpLOONG64NEGV {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
x := v_0.Args[0]
|
||||||
|
if v_1.Op != OpLOONG64MOVVconst {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
c := auxIntToInt64(v_1.AuxInt)
|
||||||
|
v.reset(OpLOONG64MULV)
|
||||||
|
v0 := b.NewValue0(v.Pos, OpLOONG64MOVVconst, typ.UInt64)
|
||||||
|
v0.AuxInt = int64ToAuxInt(-c)
|
||||||
|
v.AddArg2(x, v0)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// match: (MULV (NEGV x) (NEGV y))
|
||||||
|
// result: (MULV x y)
|
||||||
|
for {
|
||||||
|
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
|
||||||
|
if v_0.Op != OpLOONG64NEGV {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
x := v_0.Args[0]
|
||||||
|
if v_1.Op != OpLOONG64NEGV {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
y := v_1.Args[0]
|
||||||
|
v.reset(OpLOONG64MULV)
|
||||||
|
v.AddArg2(x, y)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
// match: (MULV (MOVVconst [c]) (MOVVconst [d]))
|
// match: (MULV (MOVVconst [c]) (MOVVconst [d]))
|
||||||
// result: (MOVVconst [c*d])
|
// result: (MOVVconst [c*d])
|
||||||
for {
|
for {
|
||||||
|
|
|
||||||
|
|
@ -122,3 +122,26 @@ func BenchmarkBitToggleConst(b *testing.B) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkMulNeg(b *testing.B) {
|
||||||
|
x := make([]int64, 1024)
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
var s int64
|
||||||
|
for i := range x {
|
||||||
|
s = (-x[i]) * 11
|
||||||
|
}
|
||||||
|
globl = s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkMul2Neg(b *testing.B) {
|
||||||
|
x := make([]int64, 1024)
|
||||||
|
y := make([]int64, 1024)
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
var s int64
|
||||||
|
for i := range x {
|
||||||
|
s = (-x[i]) * (-y[i])
|
||||||
|
}
|
||||||
|
globl = s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -314,6 +314,18 @@ func MergeMuls5(a, n int) int {
|
||||||
return a*n - 19*n // (a-19)n
|
return a*n - 19*n // (a-19)n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Multiplications folded negation
|
||||||
|
|
||||||
|
func FoldNegMul(a int) int {
|
||||||
|
// loong64:"MULV","MOVV\t[$]-11",-"SUBVU\tR[0-9], R0,"
|
||||||
|
return (-a) * 11
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fold2NegMul(a, b int) int {
|
||||||
|
// loong64:"MULV",-"SUBVU\tR[0-9], R0,"
|
||||||
|
return (-a) * (-b)
|
||||||
|
}
|
||||||
|
|
||||||
// -------------- //
|
// -------------- //
|
||||||
// Division //
|
// Division //
|
||||||
// -------------- //
|
// -------------- //
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue