This reduces 744 instructions from the go toolchain binary on loong64.
file before after Δ %
asm 599282 599222 -60 -0.0100%
cgo 513606 513534 -72 -0.0140%
compile
2939250 2939146 -104 -0.0035%
cover 564136 564056 -80 -0.0142%
fix 895622 895546 -76 -0.0085%
link 759460 759376 -84 -0.0111%
preprofile 264960 264916 -44 -0.0166%
vet 869964 869888 -76 -0.0087%
go
1712990 1712890 -100 -0.0058%
gofmt 346416 346368 -48 -0.0139%
total
9465686 9464942 -744 -0.0079%
Change-Id: I32dfa7506d0458ca0b6de83b030c330cd2b82176
Reviewed-on: https://go-review.googlesource.com/c/go/+/725720
Auto-Submit: Keith Randall <khr@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
(MOVBUreg (ANDconst [c] x)) => (ANDconst [c&0xff] x)
+// Avoid extending when already sufficiently shifted.
+(MOVBUreg x:(SRLconst [c] y)) && c >= 24 => x
+(MOVHUreg x:(SRLconst [c] y)) && c >= 16 => x
+(MOVWUreg x:(SRLconst [c] y)) => x
+
// Avoid extending when already sufficiently masked.
(MOVBreg x:(ANDconst [c] y)) && c >= 0 && int64(int8(c)) == c => x
(MOVHreg x:(ANDconst [c] y)) && c >= 0 && int64(int16(c)) == c => x
v.AddArg(x)
return true
}
+ // match: (MOVBUreg x:(SRLconst [c] y))
+ // cond: c >= 24
+ // result: x
+ for {
+ x := v_0
+ if x.Op != OpLOONG64SRLconst {
+ break
+ }
+ c := auxIntToInt64(x.AuxInt)
+ if !(c >= 24) {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
// match: (MOVBUreg x:(ANDconst [c] y))
// cond: c >= 0 && int64(uint8(c)) == c
// result: x
v.AuxInt = int64ToAuxInt(int64(uint16(c)))
return true
}
+ // match: (MOVHUreg x:(SRLconst [c] y))
+ // cond: c >= 16
+ // result: x
+ for {
+ x := v_0
+ if x.Op != OpLOONG64SRLconst {
+ break
+ }
+ c := auxIntToInt64(x.AuxInt)
+ if !(c >= 16) {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
// match: (MOVHUreg x:(ANDconst [c] y))
// cond: c >= 0 && int64(uint16(c)) == c
// result: x
v.AuxInt = int64ToAuxInt(int64(uint32(c)))
return true
}
+ // match: (MOVWUreg x:(SRLconst [c] y))
+ // result: x
+ for {
+ x := v_0
+ if x.Op != OpLOONG64SRLconst {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
// match: (MOVWUreg x:(ANDconst [c] y))
// cond: c >= 0 && int64(uint32(c)) == c
// result: x