aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/ssa/_gen/LOONG64.rules5
-rw-r--r--src/cmd/compile/internal/ssa/rewriteLOONG64.go40
2 files changed, 45 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules
index b15043032c..a40603e93d 100644
--- a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules
+++ b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules
@@ -843,6 +843,11 @@
(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
diff --git a/src/cmd/compile/internal/ssa/rewriteLOONG64.go b/src/cmd/compile/internal/ssa/rewriteLOONG64.go
index 30ce419d40..37aedcbe6e 100644
--- a/src/cmd/compile/internal/ssa/rewriteLOONG64.go
+++ b/src/cmd/compile/internal/ssa/rewriteLOONG64.go
@@ -2677,6 +2677,21 @@ func rewriteValueLOONG64_OpLOONG64MOVBUreg(v *Value) bool {
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
@@ -4067,6 +4082,21 @@ func rewriteValueLOONG64_OpLOONG64MOVHUreg(v *Value) bool {
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
@@ -5301,6 +5331,16 @@ func rewriteValueLOONG64_OpLOONG64MOVWUreg(v *Value) bool {
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