diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/ssa/_gen/LOONG64.rules | 5 | ||||
| -rw-r--r-- | src/cmd/compile/internal/ssa/rewriteLOONG64.go | 40 |
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 |
