func rewriteValueARM64_OpARM64ADD(v *Value) bool {
v_1 := v.Args[1]
v_0 := v.Args[0]
+ b := v.Block
// match: (ADD x (MOVDconst <t> [c]))
// cond: !t.IsPtr()
// result: (ADDconst [c] x)
}
break
}
+ // match: (ADD a p:(ADDconst [c] m:(MUL _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (ADDconst [c] (ADD <v.Type> a m))
+ for {
+ for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64ADDconst {
+ continue
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MUL || !(p.Uses == 1 && m.Uses == 1) {
+ continue
+ }
+ v.reset(OpARM64ADDconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ break
+ }
+ // match: (ADD a p:(ADDconst [c] m:(MULW _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (ADDconst [c] (ADD <v.Type> a m))
+ for {
+ for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64ADDconst {
+ continue
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MULW || !(p.Uses == 1 && m.Uses == 1) {
+ continue
+ }
+ v.reset(OpARM64ADDconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ break
+ }
+ // match: (ADD a p:(ADDconst [c] m:(MNEG _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (ADDconst [c] (ADD <v.Type> a m))
+ for {
+ for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64ADDconst {
+ continue
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MNEG || !(p.Uses == 1 && m.Uses == 1) {
+ continue
+ }
+ v.reset(OpARM64ADDconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ break
+ }
+ // match: (ADD a p:(ADDconst [c] m:(MNEGW _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (ADDconst [c] (ADD <v.Type> a m))
+ for {
+ for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64ADDconst {
+ continue
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MNEGW || !(p.Uses == 1 && m.Uses == 1) {
+ continue
+ }
+ v.reset(OpARM64ADDconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ break
+ }
+ // match: (ADD a p:(SUBconst [c] m:(MUL _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (SUBconst [c] (ADD <v.Type> a m))
+ for {
+ for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64SUBconst {
+ continue
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MUL || !(p.Uses == 1 && m.Uses == 1) {
+ continue
+ }
+ v.reset(OpARM64SUBconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ break
+ }
+ // match: (ADD a p:(SUBconst [c] m:(MULW _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (SUBconst [c] (ADD <v.Type> a m))
+ for {
+ for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64SUBconst {
+ continue
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MULW || !(p.Uses == 1 && m.Uses == 1) {
+ continue
+ }
+ v.reset(OpARM64SUBconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ break
+ }
+ // match: (ADD a p:(SUBconst [c] m:(MNEG _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (SUBconst [c] (ADD <v.Type> a m))
+ for {
+ for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64SUBconst {
+ continue
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MNEG || !(p.Uses == 1 && m.Uses == 1) {
+ continue
+ }
+ v.reset(OpARM64SUBconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ break
+ }
+ // match: (ADD a p:(SUBconst [c] m:(MNEGW _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (SUBconst [c] (ADD <v.Type> a m))
+ for {
+ for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64SUBconst {
+ continue
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MNEGW || !(p.Uses == 1 && m.Uses == 1) {
+ continue
+ }
+ v.reset(OpARM64SUBconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ break
+ }
// match: (ADD x (NEG y))
// result: (SUB x y)
for {
v.AddArg3(a, x, y)
return true
}
+ // match: (SUB a p:(ADDconst [c] m:(MUL _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (ADDconst [c] (SUB <v.Type> a m))
+ for {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64ADDconst {
+ break
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MUL || !(p.Uses == 1 && m.Uses == 1) {
+ break
+ }
+ v.reset(OpARM64ADDconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64SUB, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ // match: (SUB a p:(ADDconst [c] m:(MULW _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (ADDconst [c] (SUB <v.Type> a m))
+ for {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64ADDconst {
+ break
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MULW || !(p.Uses == 1 && m.Uses == 1) {
+ break
+ }
+ v.reset(OpARM64ADDconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64SUB, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ // match: (SUB a p:(ADDconst [c] m:(MNEG _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (ADDconst [c] (SUB <v.Type> a m))
+ for {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64ADDconst {
+ break
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MNEG || !(p.Uses == 1 && m.Uses == 1) {
+ break
+ }
+ v.reset(OpARM64ADDconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64SUB, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ // match: (SUB a p:(ADDconst [c] m:(MNEGW _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (ADDconst [c] (SUB <v.Type> a m))
+ for {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64ADDconst {
+ break
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MNEGW || !(p.Uses == 1 && m.Uses == 1) {
+ break
+ }
+ v.reset(OpARM64ADDconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64SUB, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ // match: (SUB a p:(SUBconst [c] m:(MUL _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (SUBconst [c] (SUB <v.Type> a m))
+ for {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64SUBconst {
+ break
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MUL || !(p.Uses == 1 && m.Uses == 1) {
+ break
+ }
+ v.reset(OpARM64SUBconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64SUB, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ // match: (SUB a p:(SUBconst [c] m:(MULW _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (SUBconst [c] (SUB <v.Type> a m))
+ for {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64SUBconst {
+ break
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MULW || !(p.Uses == 1 && m.Uses == 1) {
+ break
+ }
+ v.reset(OpARM64SUBconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64SUB, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ // match: (SUB a p:(SUBconst [c] m:(MNEG _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (SUBconst [c] (SUB <v.Type> a m))
+ for {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64SUBconst {
+ break
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MNEG || !(p.Uses == 1 && m.Uses == 1) {
+ break
+ }
+ v.reset(OpARM64SUBconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64SUB, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
+ // match: (SUB a p:(SUBconst [c] m:(MNEGW _ _)))
+ // cond: p.Uses==1 && m.Uses==1
+ // result: (SUBconst [c] (SUB <v.Type> a m))
+ for {
+ a := v_0
+ p := v_1
+ if p.Op != OpARM64SUBconst {
+ break
+ }
+ c := auxIntToInt64(p.AuxInt)
+ m := p.Args[0]
+ if m.Op != OpARM64MNEGW || !(p.Uses == 1 && m.Uses == 1) {
+ break
+ }
+ v.reset(OpARM64SUBconst)
+ v.AuxInt = int64ToAuxInt(c)
+ v0 := b.NewValue0(v.Pos, OpARM64SUB, v.Type)
+ v0.AddArg2(a, m)
+ v.AddArg(v0)
+ return true
+ }
// match: (SUB x x)
// result: (MOVDconst [0])
for {