(MOVBUreg x:((SEQZ|SNEZ) _)) => x
(MOVBUreg x:((SLT|SLTU) _ _)) => x
+// Avoid extending when already sufficiently masked.
+(MOVBreg x:(ANDI [c] y)) && c >= 0 && int64(int8(c)) == c => x
+(MOVHreg x:(ANDI [c] y)) && c >= 0 && int64(int16(c)) == c => x
+(MOVWreg x:(ANDI [c] y)) && c >= 0 && int64(int32(c)) == c => x
+(MOVBUreg x:(ANDI [c] y)) && c >= 0 && int64(uint8(c)) == c => x
+(MOVHUreg x:(ANDI [c] y)) && c >= 0 && int64(uint16(c)) == c => x
+(MOVWUreg x:(ANDI [c] y)) && c >= 0 && int64(uint32(c)) == c => x
+
// Avoid sign/zero extension for consts.
(MOVBreg (MOVDconst [c])) => (MOVDconst [int64(int8(c))])
(MOVHreg (MOVDconst [c])) => (MOVDconst [int64(int16(c))])
v.copyOf(x)
return true
}
+ // match: (MOVBUreg x:(ANDI [c] y))
+ // cond: c >= 0 && int64(uint8(c)) == c
+ // result: x
+ for {
+ x := v_0
+ if x.Op != OpRISCV64ANDI {
+ break
+ }
+ c := auxIntToInt64(x.AuxInt)
+ if !(c >= 0 && int64(uint8(c)) == c) {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
// match: (MOVBUreg (MOVDconst [c]))
// result: (MOVDconst [int64(uint8(c))])
for {
func rewriteValueRISCV64_OpRISCV64MOVBreg(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
+ // match: (MOVBreg x:(ANDI [c] y))
+ // cond: c >= 0 && int64(int8(c)) == c
+ // result: x
+ for {
+ x := v_0
+ if x.Op != OpRISCV64ANDI {
+ break
+ }
+ c := auxIntToInt64(x.AuxInt)
+ if !(c >= 0 && int64(int8(c)) == c) {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
// match: (MOVBreg (MOVDconst [c]))
// result: (MOVDconst [int64(int8(c))])
for {
func rewriteValueRISCV64_OpRISCV64MOVHUreg(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
+ // match: (MOVHUreg x:(ANDI [c] y))
+ // cond: c >= 0 && int64(uint16(c)) == c
+ // result: x
+ for {
+ x := v_0
+ if x.Op != OpRISCV64ANDI {
+ break
+ }
+ c := auxIntToInt64(x.AuxInt)
+ if !(c >= 0 && int64(uint16(c)) == c) {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
// match: (MOVHUreg (MOVDconst [c]))
// result: (MOVDconst [int64(uint16(c))])
for {
func rewriteValueRISCV64_OpRISCV64MOVHreg(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
+ // match: (MOVHreg x:(ANDI [c] y))
+ // cond: c >= 0 && int64(int16(c)) == c
+ // result: x
+ for {
+ x := v_0
+ if x.Op != OpRISCV64ANDI {
+ break
+ }
+ c := auxIntToInt64(x.AuxInt)
+ if !(c >= 0 && int64(int16(c)) == c) {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
// match: (MOVHreg (MOVDconst [c]))
// result: (MOVDconst [int64(int16(c))])
for {
func rewriteValueRISCV64_OpRISCV64MOVWUreg(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
+ // match: (MOVWUreg x:(ANDI [c] y))
+ // cond: c >= 0 && int64(uint32(c)) == c
+ // result: x
+ for {
+ x := v_0
+ if x.Op != OpRISCV64ANDI {
+ break
+ }
+ c := auxIntToInt64(x.AuxInt)
+ if !(c >= 0 && int64(uint32(c)) == c) {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
// match: (MOVWUreg (MOVDconst [c]))
// result: (MOVDconst [int64(uint32(c))])
for {
func rewriteValueRISCV64_OpRISCV64MOVWreg(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
+ // match: (MOVWreg x:(ANDI [c] y))
+ // cond: c >= 0 && int64(int32(c)) == c
+ // result: x
+ for {
+ x := v_0
+ if x.Op != OpRISCV64ANDI {
+ break
+ }
+ c := auxIntToInt64(x.AuxInt)
+ if !(c >= 0 && int64(int32(c)) == c) {
+ break
+ }
+ v.copyOf(x)
+ return true
+ }
// match: (MOVWreg (MOVDconst [c]))
// result: (MOVDconst [int64(int32(c))])
for {