mirror of
https://github.com/golang/go.git
synced 2026-02-02 00:52:04 +03:00
cmd/compile: fold constant in ADDshift op on loong64
Removes 918 instructions from the go binary on loong64.
file before after Δ
go 1633120 1632948 -172
gofmt 323470 323334 -136
asm 568024 568024 -0
cgo 488030 487890 -140
compile 2501050 2500728 -322
cover 530124 530124 -0
link 723532 723520 -12
preprofile 240568 240568 -0
vet 819392 819256 -136
Change-Id: Id4015c66b2073323b7ad257b3ed05bb99f81e9a1
Reviewed-on: https://go-review.googlesource.com/c/go/+/701655
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Auto-Submit: Keith Randall <khr@golang.org>
Reviewed-by: Mark Freeman <markfreeman@google.com>
This commit is contained in:
committed by
Gopher Robot
parent
5b218461f9
commit
6447ff409a
@@ -730,6 +730,9 @@
|
||||
|
||||
(ADDV x0 x1:(SLLVconst [c] y)) && x1.Uses == 1 && c > 0 && c <= 4 => (ADDshiftLLV x0 y [c])
|
||||
|
||||
// fold constant in ADDshift op
|
||||
(ADDshiftLLV x (MOVVconst [c]) [d]) && is12Bit(c<<d) => (ADDVconst x [c<<d])
|
||||
|
||||
// div by constant
|
||||
(DIVVU x (MOVVconst [1])) => x
|
||||
(DIVVU x (MOVVconst [c])) && isPowerOfTwo(c) => (SRLVconst [log64(c)] x)
|
||||
|
||||
@@ -324,6 +324,8 @@ func rewriteValueLOONG64(v *Value) bool {
|
||||
return rewriteValueLOONG64_OpLOONG64ADDV(v)
|
||||
case OpLOONG64ADDVconst:
|
||||
return rewriteValueLOONG64_OpLOONG64ADDVconst(v)
|
||||
case OpLOONG64ADDshiftLLV:
|
||||
return rewriteValueLOONG64_OpLOONG64ADDshiftLLV(v)
|
||||
case OpLOONG64AND:
|
||||
return rewriteValueLOONG64_OpLOONG64AND(v)
|
||||
case OpLOONG64ANDconst:
|
||||
@@ -2024,6 +2026,29 @@ func rewriteValueLOONG64_OpLOONG64ADDVconst(v *Value) bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
func rewriteValueLOONG64_OpLOONG64ADDshiftLLV(v *Value) bool {
|
||||
v_1 := v.Args[1]
|
||||
v_0 := v.Args[0]
|
||||
// match: (ADDshiftLLV x (MOVVconst [c]) [d])
|
||||
// cond: is12Bit(c<<d)
|
||||
// result: (ADDVconst x [c<<d])
|
||||
for {
|
||||
d := auxIntToInt64(v.AuxInt)
|
||||
x := v_0
|
||||
if v_1.Op != OpLOONG64MOVVconst {
|
||||
break
|
||||
}
|
||||
c := auxIntToInt64(v_1.AuxInt)
|
||||
if !(is12Bit(c << d)) {
|
||||
break
|
||||
}
|
||||
v.reset(OpLOONG64ADDVconst)
|
||||
v.AuxInt = int64ToAuxInt(c << d)
|
||||
v.AddArg(x)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
func rewriteValueLOONG64_OpLOONG64AND(v *Value) bool {
|
||||
v_1 := v.Args[1]
|
||||
v_0 := v.Args[0]
|
||||
|
||||
Reference in New Issue
Block a user