(MOVHUreg x:(ANDI [c] y)) && c >= 0 && int64(uint16(c)) == c => x
(MOVWUreg x:(ANDI [c] y)) && c >= 0 && int64(uint32(c)) == c => x
+// Combine masking and zero extension.
+(MOVBUreg (ANDI [c] x)) && c < 0 => (ANDI [int64(uint8(c))] x)
+(MOVHUreg (ANDI [c] x)) && c < 0 => (ANDI [int64(uint16(c))] x)
+(MOVWUreg (ANDI [c] x)) && c < 0 => (AND (MOVDconst [int64(uint32(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 (ANDI [c] x))
+ // cond: c < 0
+ // result: (ANDI [int64(uint8(c))] x)
+ for {
+ if v_0.Op != OpRISCV64ANDI {
+ break
+ }
+ c := auxIntToInt64(v_0.AuxInt)
+ x := v_0.Args[0]
+ if !(c < 0) {
+ break
+ }
+ v.reset(OpRISCV64ANDI)
+ v.AuxInt = int64ToAuxInt(int64(uint8(c)))
+ v.AddArg(x)
+ return true
+ }
// match: (MOVBUreg (MOVDconst [c]))
// result: (MOVDconst [int64(uint8(c))])
for {
v.copyOf(x)
return true
}
+ // match: (MOVHUreg (ANDI [c] x))
+ // cond: c < 0
+ // result: (ANDI [int64(uint16(c))] x)
+ for {
+ if v_0.Op != OpRISCV64ANDI {
+ break
+ }
+ c := auxIntToInt64(v_0.AuxInt)
+ x := v_0.Args[0]
+ if !(c < 0) {
+ break
+ }
+ v.reset(OpRISCV64ANDI)
+ v.AuxInt = int64ToAuxInt(int64(uint16(c)))
+ v.AddArg(x)
+ return true
+ }
// match: (MOVHUreg (MOVDconst [c]))
// result: (MOVDconst [int64(uint16(c))])
for {
func rewriteValueRISCV64_OpRISCV64MOVWUreg(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
+ typ := &b.Func.Config.Types
// match: (MOVWUreg x:(ANDI [c] y))
// cond: c >= 0 && int64(uint32(c)) == c
// result: x
v.copyOf(x)
return true
}
+ // match: (MOVWUreg (ANDI [c] x))
+ // cond: c < 0
+ // result: (AND (MOVDconst [int64(uint32(c))]) x)
+ for {
+ if v_0.Op != OpRISCV64ANDI {
+ break
+ }
+ c := auxIntToInt64(v_0.AuxInt)
+ x := v_0.Args[0]
+ if !(c < 0) {
+ break
+ }
+ v.reset(OpRISCV64AND)
+ v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
+ v0.AuxInt = int64ToAuxInt(int64(uint32(c)))
+ v.AddArg2(v0, x)
+ return true
+ }
// match: (MOVWUreg (MOVDconst [c]))
// result: (MOVDconst [int64(uint32(c))])
for {