aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal
diff options
context:
space:
mode:
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>2025-09-08 18:00:52 +0800
committerGopher Robot <gobot@golang.org>2025-09-08 13:34:13 -0700
commit6447ff409ac7e2a621bc8ca5c44b2eaed751fbaa (patch)
treea4f32a23af578be1a9f7708c25ca451e230e9bfc /src/cmd/compile/internal
parent5b218461f98b354ac9bde4fdd4f7046fdf2d2029 (diff)
downloadgo-6447ff409ac7e2a621bc8ca5c44b2eaed751fbaa.tar.xz
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>
Diffstat (limited to 'src/cmd/compile/internal')
-rw-r--r--src/cmd/compile/internal/ssa/_gen/LOONG64.rules3
-rw-r--r--src/cmd/compile/internal/ssa/rewriteLOONG64.go25
2 files changed, 28 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules
index a3dd050d14..d0a64364d6 100644
--- a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules
+++ b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules
@@ -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)
diff --git a/src/cmd/compile/internal/ssa/rewriteLOONG64.go b/src/cmd/compile/internal/ssa/rewriteLOONG64.go
index 036d70a15f..6a9b723c8c 100644
--- a/src/cmd/compile/internal/ssa/rewriteLOONG64.go
+++ b/src/cmd/compile/internal/ssa/rewriteLOONG64.go
@@ -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]