cmd/compile/internal: optimizing add+sll rule using ALSLV instruction on loong64

Reduce the number of go toolchain instructions on loong64 as follows:

	file	    before	after	    Δ 	     %
	go	    1573148	1571708	   -1,440  -0.0915%
	gofmt	    320578	320090	   -488    -0.1522%
	asm	    555066	554406	   -660    -0.1189%
	cgo	    481566	480926	   -640    -0.1329%
	compile	    2475962	2473880	   -2,082  -0.0841%
	cover	    516536	515920	   -616    -0.1193%
	link	    702172	701404	   -768    -0.1094%
	preprofile  238626	238274	   -352    -0.1475%
	vet	    792928	792100	   -828    -0.1044%

Change-Id: I61e462726835959c60e1b4e5256d4020202418ab
Reviewed-on: https://go-review.googlesource.com/c/go/+/693877
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
This commit is contained in:
limeidan 2025-07-18 10:36:06 +08:00 committed by Keith Randall
parent ea55ca3600
commit bd71b94659
3 changed files with 29 additions and 0 deletions

View file

@ -766,6 +766,8 @@
(MULV (NEGV x) (MOVVconst [c])) => (MULV x (MOVVconst [-c]))
(MULV (NEGV x) (NEGV y)) => (MULV x y)
(ADDV x0 x1:(SLLVconst [c] y)) && x1.Uses == 1 && c > 0 && c <= 4 => (ADDshiftLLV x0 y [c])
// div by constant
(DIVVU x (MOVVconst [1])) => x
(DIVVU x (MOVVconst [c])) && isPowerOfTwo(c) => (SRLVconst [log64(c)] x)

View file

@ -1931,6 +1931,28 @@ func rewriteValueLOONG64_OpLOONG64ADDV(v *Value) bool {
}
break
}
// match: (ADDV x0 x1:(SLLVconst [c] y))
// cond: x1.Uses == 1 && c > 0 && c <= 4
// result: (ADDshiftLLV x0 y [c])
for {
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
x0 := v_0
x1 := v_1
if x1.Op != OpLOONG64SLLVconst {
continue
}
c := auxIntToInt64(x1.AuxInt)
y := x1.Args[0]
if !(x1.Uses == 1 && c > 0 && c <= 4) {
continue
}
v.reset(OpLOONG64ADDshiftLLV)
v.AuxInt = int64ToAuxInt(c)
v.AddArg2(x0, y)
return true
}
break
}
// match: (ADDV x (NEGV y))
// result: (SUBV x y)
for {

View file

@ -624,6 +624,11 @@ func AddMul(x int) int {
return 2*x + 1
}
func AddShift(a, b int) int {
// loong64: "ALSLV"
return a + (b << 4)
}
func MULA(a, b, c uint32) (uint32, uint32, uint32) {
// arm:`MULA`,-`MUL\s`
// arm64:`MADDW`,-`MULW`