(XORL x x) -> (MOVLconst [0])
// checking AND against 0.
-(CMP(L|W|B)const (ANDL x y) [0]) -> (TEST(L|W|B) x y)
-(CMPLconst (ANDLconst [c] x) [0]) -> (TESTLconst [c] x)
-(CMPWconst (ANDLconst [c] x) [0]) -> (TESTWconst [int64(int16(c))] x)
-(CMPBconst (ANDLconst [c] x) [0]) -> (TESTBconst [int64(int8(c))] x)
+(CMP(L|W|B)const l:(ANDL x y) [0]) && l.Uses==1 -> (TEST(L|W|B) x y)
+(CMPLconst l:(ANDLconst [c] x) [0]) && l.Uses==1 -> (TESTLconst [c] x)
+(CMPWconst l:(ANDLconst [c] x) [0]) && l.Uses==1 -> (TESTWconst [int64(int16(c))] x)
+(CMPBconst l:(ANDLconst [c] x) [0]) && l.Uses==1 -> (TESTBconst [int64(int8(c))] x)
// TEST %reg,%reg is shorter than CMP
(CMP(L|W|B)const x [0]) -> (TEST(L|W|B) x x)
v.reset(Op386FlagLT_ULT)
return true
}
- // match: (CMPBconst (ANDL x y) [0])
- // cond:
+ // match: (CMPBconst l:(ANDL x y) [0])
+ // cond: l.Uses==1
// result: (TESTB x y)
for {
if v.AuxInt != 0 {
break
}
- v_0 := v.Args[0]
- if v_0.Op != Op386ANDL {
+ l := v.Args[0]
+ if l.Op != Op386ANDL {
+ break
+ }
+ _ = l.Args[1]
+ x := l.Args[0]
+ y := l.Args[1]
+ if !(l.Uses == 1) {
break
}
- _ = v_0.Args[1]
- x := v_0.Args[0]
- y := v_0.Args[1]
v.reset(Op386TESTB)
v.AddArg(x)
v.AddArg(y)
return true
}
- // match: (CMPBconst (ANDLconst [c] x) [0])
- // cond:
+ // match: (CMPBconst l:(ANDLconst [c] x) [0])
+ // cond: l.Uses==1
// result: (TESTBconst [int64(int8(c))] x)
for {
if v.AuxInt != 0 {
break
}
- v_0 := v.Args[0]
- if v_0.Op != Op386ANDLconst {
+ l := v.Args[0]
+ if l.Op != Op386ANDLconst {
+ break
+ }
+ c := l.AuxInt
+ x := l.Args[0]
+ if !(l.Uses == 1) {
break
}
- c := v_0.AuxInt
- x := v_0.Args[0]
v.reset(Op386TESTBconst)
v.AuxInt = int64(int8(c))
v.AddArg(x)
v.reset(Op386FlagLT_ULT)
return true
}
- // match: (CMPLconst (ANDL x y) [0])
- // cond:
+ // match: (CMPLconst l:(ANDL x y) [0])
+ // cond: l.Uses==1
// result: (TESTL x y)
for {
if v.AuxInt != 0 {
break
}
- v_0 := v.Args[0]
- if v_0.Op != Op386ANDL {
+ l := v.Args[0]
+ if l.Op != Op386ANDL {
+ break
+ }
+ _ = l.Args[1]
+ x := l.Args[0]
+ y := l.Args[1]
+ if !(l.Uses == 1) {
break
}
- _ = v_0.Args[1]
- x := v_0.Args[0]
- y := v_0.Args[1]
v.reset(Op386TESTL)
v.AddArg(x)
v.AddArg(y)
return true
}
- // match: (CMPLconst (ANDLconst [c] x) [0])
- // cond:
+ // match: (CMPLconst l:(ANDLconst [c] x) [0])
+ // cond: l.Uses==1
// result: (TESTLconst [c] x)
for {
if v.AuxInt != 0 {
break
}
- v_0 := v.Args[0]
- if v_0.Op != Op386ANDLconst {
+ l := v.Args[0]
+ if l.Op != Op386ANDLconst {
+ break
+ }
+ c := l.AuxInt
+ x := l.Args[0]
+ if !(l.Uses == 1) {
break
}
- c := v_0.AuxInt
- x := v_0.Args[0]
v.reset(Op386TESTLconst)
v.AuxInt = c
v.AddArg(x)
v.reset(Op386FlagLT_ULT)
return true
}
- // match: (CMPWconst (ANDL x y) [0])
- // cond:
+ // match: (CMPWconst l:(ANDL x y) [0])
+ // cond: l.Uses==1
// result: (TESTW x y)
for {
if v.AuxInt != 0 {
break
}
- v_0 := v.Args[0]
- if v_0.Op != Op386ANDL {
+ l := v.Args[0]
+ if l.Op != Op386ANDL {
+ break
+ }
+ _ = l.Args[1]
+ x := l.Args[0]
+ y := l.Args[1]
+ if !(l.Uses == 1) {
break
}
- _ = v_0.Args[1]
- x := v_0.Args[0]
- y := v_0.Args[1]
v.reset(Op386TESTW)
v.AddArg(x)
v.AddArg(y)
return true
}
- // match: (CMPWconst (ANDLconst [c] x) [0])
- // cond:
+ // match: (CMPWconst l:(ANDLconst [c] x) [0])
+ // cond: l.Uses==1
// result: (TESTWconst [int64(int16(c))] x)
for {
if v.AuxInt != 0 {
break
}
- v_0 := v.Args[0]
- if v_0.Op != Op386ANDLconst {
+ l := v.Args[0]
+ if l.Op != Op386ANDLconst {
+ break
+ }
+ c := l.AuxInt
+ x := l.Args[0]
+ if !(l.Uses == 1) {
break
}
- c := v_0.AuxInt
- x := v_0.Args[0]
v.reset(Op386TESTWconst)
v.AuxInt = int64(int16(c))
v.AddArg(x)