in src/cmd/compile/internal/ssa/rewritePPC64.go [11486:13016]
func rewriteValuePPC64_OpPPC64OR(v *Value) bool {
v_1 := v.Args[1]
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
typ := &b.Func.Config.Types
// match: ( OR (SLDconst x [c]) (SRDconst x [d]))
// cond: d == 64-c
// result: (ROTLconst [c] x)
for {
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
if v_0.Op != OpPPC64SLDconst {
continue
}
c := auxIntToInt64(v_0.AuxInt)
x := v_0.Args[0]
if v_1.Op != OpPPC64SRDconst {
continue
}
d := auxIntToInt64(v_1.AuxInt)
if x != v_1.Args[0] || !(d == 64-c) {
continue
}
v.reset(OpPPC64ROTLconst)
v.AuxInt = int64ToAuxInt(c)
v.AddArg(x)
return true
}
break
}
// match: ( OR (SLWconst x [c]) (SRWconst x [d]))
// cond: d == 32-c
// result: (ROTLWconst [c] x)
for {
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
if v_0.Op != OpPPC64SLWconst {
continue
}
c := auxIntToInt64(v_0.AuxInt)
x := v_0.Args[0]
if v_1.Op != OpPPC64SRWconst {
continue
}
d := auxIntToInt64(v_1.AuxInt)
if x != v_1.Args[0] || !(d == 32-c) {
continue
}
v.reset(OpPPC64ROTLWconst)
v.AuxInt = int64ToAuxInt(c)
v.AddArg(x)
return true
}
break
}
// match: ( OR (SLD x (ANDconst <typ.Int64> [63] y)) (SRD x (SUB <typ.UInt> (MOVDconst [64]) (ANDconst <typ.UInt> [63] y))))
// result: (ROTL x y)
for {
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
if v_0.Op != OpPPC64SLD {
continue
}
_ = v_0.Args[1]
x := v_0.Args[0]
v_0_1 := v_0.Args[1]
if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || auxIntToInt64(v_0_1.AuxInt) != 63 {
continue
}
y := v_0_1.Args[0]
if v_1.Op != OpPPC64SRD {
continue
}
_ = v_1.Args[1]
if x != v_1.Args[0] {
continue
}
v_1_1 := v_1.Args[1]
if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt {
continue
}
_ = v_1_1.Args[1]
v_1_1_0 := v_1_1.Args[0]
if v_1_1_0.Op != OpPPC64MOVDconst || auxIntToInt64(v_1_1_0.AuxInt) != 64 {
continue
}
v_1_1_1 := v_1_1.Args[1]
if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || auxIntToInt64(v_1_1_1.AuxInt) != 63 || y != v_1_1_1.Args[0] {
continue
}
v.reset(OpPPC64ROTL)
v.AddArg2(x, y)
return true
}
break
}
// match: ( OR (SLD x (ANDconst <typ.Int64> [63] y)) (SRD x (SUBFCconst <typ.UInt> [64] (ANDconst <typ.UInt> [63] y))))
// result: (ROTL x y)
for {
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
if v_0.Op != OpPPC64SLD {
continue
}
_ = v_0.Args[1]
x := v_0.Args[0]
v_0_1 := v_0.Args[1]
if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || auxIntToInt64(v_0_1.AuxInt) != 63 {
continue
}
y := v_0_1.Args[0]
if v_1.Op != OpPPC64SRD {
continue
}
_ = v_1.Args[1]
if x != v_1.Args[0] {
continue
}
v_1_1 := v_1.Args[1]
if v_1_1.Op != OpPPC64SUBFCconst || v_1_1.Type != typ.UInt || auxIntToInt64(v_1_1.AuxInt) != 64 {
continue
}
v_1_1_0 := v_1_1.Args[0]
if v_1_1_0.Op != OpPPC64ANDconst || v_1_1_0.Type != typ.UInt || auxIntToInt64(v_1_1_0.AuxInt) != 63 || y != v_1_1_0.Args[0] {
continue
}
v.reset(OpPPC64ROTL)
v.AddArg2(x, y)
return true
}
break
}
// match: ( OR (SLW x (ANDconst <typ.Int32> [31] y)) (SRW x (SUBFCconst <typ.UInt> [32] (ANDconst <typ.UInt> [31] y))))
// result: (ROTLW x y)
for {
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
if v_0.Op != OpPPC64SLW {
continue
}
_ = v_0.Args[1]
x := v_0.Args[0]
v_0_1 := v_0.Args[1]
if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || auxIntToInt64(v_0_1.AuxInt) != 31 {
continue
}
y := v_0_1.Args[0]
if v_1.Op != OpPPC64SRW {
continue
}
_ = v_1.Args[1]
if x != v_1.Args[0] {
continue
}
v_1_1 := v_1.Args[1]
if v_1_1.Op != OpPPC64SUBFCconst || v_1_1.Type != typ.UInt || auxIntToInt64(v_1_1.AuxInt) != 32 {
continue
}
v_1_1_0 := v_1_1.Args[0]
if v_1_1_0.Op != OpPPC64ANDconst || v_1_1_0.Type != typ.UInt || auxIntToInt64(v_1_1_0.AuxInt) != 31 || y != v_1_1_0.Args[0] {
continue
}
v.reset(OpPPC64ROTLW)
v.AddArg2(x, y)
return true
}
break
}
// match: ( OR (SLW x (ANDconst <typ.Int32> [31] y)) (SRW x (SUB <typ.UInt> (MOVDconst [32]) (ANDconst <typ.UInt> [31] y))))
// result: (ROTLW x y)
for {
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
if v_0.Op != OpPPC64SLW {
continue
}
_ = v_0.Args[1]
x := v_0.Args[0]
v_0_1 := v_0.Args[1]
if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || auxIntToInt64(v_0_1.AuxInt) != 31 {
continue
}
y := v_0_1.Args[0]
if v_1.Op != OpPPC64SRW {
continue
}
_ = v_1.Args[1]
if x != v_1.Args[0] {
continue
}
v_1_1 := v_1.Args[1]
if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt {
continue
}
_ = v_1_1.Args[1]
v_1_1_0 := v_1_1.Args[0]
if v_1_1_0.Op != OpPPC64MOVDconst || auxIntToInt64(v_1_1_0.AuxInt) != 32 {
continue
}
v_1_1_1 := v_1_1.Args[1]
if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || auxIntToInt64(v_1_1_1.AuxInt) != 31 || y != v_1_1_1.Args[0] {
continue
}
v.reset(OpPPC64ROTLW)
v.AddArg2(x, y)
return true
}
break
}
// match: (OR (MOVDconst [c]) (MOVDconst [d]))
// result: (MOVDconst [c|d])
for {
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
if v_0.Op != OpPPC64MOVDconst {
continue
}
c := auxIntToInt64(v_0.AuxInt)
if v_1.Op != OpPPC64MOVDconst {
continue
}
d := auxIntToInt64(v_1.AuxInt)
v.reset(OpPPC64MOVDconst)
v.AuxInt = int64ToAuxInt(c | d)
return true
}
break
}
// match: (OR x (MOVDconst [c]))
// cond: isU32Bit(c)
// result: (ORconst [c] x)
for {
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
x := v_0
if v_1.Op != OpPPC64MOVDconst {
continue
}
c := auxIntToInt64(v_1.AuxInt)
if !(isU32Bit(c)) {
continue
}
v.reset(OpPPC64ORconst)
v.AuxInt = int64ToAuxInt(c)
v.AddArg(x)
return true
}
break
}
// match: (OR <t> x0:(MOVBZload [i0] {s} p mem) o1:(SLWconst x1:(MOVBZload [i1] {s} p mem) [8]))
// cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)
// result: @mergePoint(b,x0,x1) (MOVHZload <t> {s} [i0] p mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
x0 := v_0
if x0.Op != OpPPC64MOVBZload {
continue
}
i0 := auxIntToInt32(x0.AuxInt)
s := auxToSym(x0.Aux)
mem := x0.Args[1]
p := x0.Args[0]
o1 := v_1
if o1.Op != OpPPC64SLWconst || auxIntToInt64(o1.AuxInt) != 8 {
continue
}
x1 := o1.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i1 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)) {
continue
}
b = mergePoint(b, x0, x1)
v0 := b.NewValue0(x1.Pos, OpPPC64MOVHZload, t)
v.copyOf(v0)
v0.AuxInt = int32ToAuxInt(i0)
v0.Aux = symToAux(s)
v0.AddArg2(p, mem)
return true
}
break
}
// match: (OR <t> x0:(MOVBZload [i0] {s} p mem) o1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [8]))
// cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)
// result: @mergePoint(b,x0,x1) (MOVHZload <t> {s} [i0] p mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
x0 := v_0
if x0.Op != OpPPC64MOVBZload {
continue
}
i0 := auxIntToInt32(x0.AuxInt)
s := auxToSym(x0.Aux)
mem := x0.Args[1]
p := x0.Args[0]
o1 := v_1
if o1.Op != OpPPC64SLDconst || auxIntToInt64(o1.AuxInt) != 8 {
continue
}
x1 := o1.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i1 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)) {
continue
}
b = mergePoint(b, x0, x1)
v0 := b.NewValue0(x1.Pos, OpPPC64MOVHZload, t)
v.copyOf(v0)
v0.AuxInt = int32ToAuxInt(i0)
v0.Aux = symToAux(s)
v0.AddArg2(p, mem)
return true
}
break
}
// match: (OR <t> x0:(MOVBZload [i1] {s} p mem) o1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [8]))
// cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)
// result: @mergePoint(b,x0,x1) (MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
x0 := v_0
if x0.Op != OpPPC64MOVBZload {
continue
}
i1 := auxIntToInt32(x0.AuxInt)
s := auxToSym(x0.Aux)
mem := x0.Args[1]
p := x0.Args[0]
o1 := v_1
if o1.Op != OpPPC64SLWconst || auxIntToInt64(o1.AuxInt) != 8 {
continue
}
x1 := o1.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i0 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)) {
continue
}
b = mergePoint(b, x0, x1)
v0 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t)
v.copyOf(v0)
v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v1.AuxInt = int32ToAuxInt(i0)
v1.Aux = symToAux(s)
v1.AddArg(p)
v0.AddArg2(v1, mem)
return true
}
break
}
// match: (OR <t> x0:(MOVBZload [i1] {s} p mem) o1:(SLDconst x1:(MOVBZload [i0] {s} p mem) [8]))
// cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)
// result: @mergePoint(b,x0,x1) (MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
x0 := v_0
if x0.Op != OpPPC64MOVBZload {
continue
}
i1 := auxIntToInt32(x0.AuxInt)
s := auxToSym(x0.Aux)
mem := x0.Args[1]
p := x0.Args[0]
o1 := v_1
if o1.Op != OpPPC64SLDconst || auxIntToInt64(o1.AuxInt) != 8 {
continue
}
x1 := o1.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i0 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, o1)) {
continue
}
b = mergePoint(b, x0, x1)
v0 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t)
v.copyOf(v0)
v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v1.AuxInt = int32ToAuxInt(i0)
v1.Aux = symToAux(s)
v1.AddArg(p)
v0.AddArg2(v1, mem)
return true
}
break
}
// match: (OR <t> s0:(SLWconst x0:(MOVBZload [i1] {s} p mem) [n1]) s1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [n2]))
// cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, s0, s1)
// result: @mergePoint(b,x0,x1) (SLDconst <t> (MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [n1])
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
s0 := v_0
if s0.Op != OpPPC64SLWconst {
continue
}
n1 := auxIntToInt64(s0.AuxInt)
x0 := s0.Args[0]
if x0.Op != OpPPC64MOVBZload {
continue
}
i1 := auxIntToInt32(x0.AuxInt)
s := auxToSym(x0.Aux)
mem := x0.Args[1]
p := x0.Args[0]
s1 := v_1
if s1.Op != OpPPC64SLWconst {
continue
}
n2 := auxIntToInt64(s1.AuxInt)
x1 := s1.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i0 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, s0, s1)) {
continue
}
b = mergePoint(b, x0, x1)
v0 := b.NewValue0(x1.Pos, OpPPC64SLDconst, t)
v.copyOf(v0)
v0.AuxInt = int64ToAuxInt(n1)
v1 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t)
v2 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v2.AuxInt = int32ToAuxInt(i0)
v2.Aux = symToAux(s)
v2.AddArg(p)
v1.AddArg2(v2, mem)
v0.AddArg(v1)
return true
}
break
}
// match: (OR <t> s0:(SLDconst x0:(MOVBZload [i1] {s} p mem) [n1]) s1:(SLDconst x1:(MOVBZload [i0] {s} p mem) [n2]))
// cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, s0, s1)
// result: @mergePoint(b,x0,x1) (SLDconst <t> (MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [n1])
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
s0 := v_0
if s0.Op != OpPPC64SLDconst {
continue
}
n1 := auxIntToInt64(s0.AuxInt)
x0 := s0.Args[0]
if x0.Op != OpPPC64MOVBZload {
continue
}
i1 := auxIntToInt32(x0.AuxInt)
s := auxToSym(x0.Aux)
mem := x0.Args[1]
p := x0.Args[0]
s1 := v_1
if s1.Op != OpPPC64SLDconst {
continue
}
n2 := auxIntToInt64(s1.AuxInt)
x1 := s1.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i0 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0, x1, s0, s1)) {
continue
}
b = mergePoint(b, x0, x1)
v0 := b.NewValue0(x1.Pos, OpPPC64SLDconst, t)
v.copyOf(v0)
v0.AuxInt = int64ToAuxInt(n1)
v1 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t)
v2 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v2.AuxInt = int32ToAuxInt(i0)
v2.Aux = symToAux(s)
v2.AddArg(p)
v1.AddArg2(v2, mem)
v0.AddArg(v1)
return true
}
break
}
// match: (OR <t> s1:(SLWconst x2:(MOVBZload [i3] {s} p mem) [24]) o0:(OR <t> s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem)))
// cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
// result: @mergePoint(b,x0,x1,x2) (MOVWZload <t> {s} [i0] p mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
s1 := v_0
if s1.Op != OpPPC64SLWconst || auxIntToInt64(s1.AuxInt) != 24 {
continue
}
x2 := s1.Args[0]
if x2.Op != OpPPC64MOVBZload {
continue
}
i3 := auxIntToInt32(x2.AuxInt)
s := auxToSym(x2.Aux)
mem := x2.Args[1]
p := x2.Args[0]
o0 := v_1
if o0.Op != OpPPC64OR || o0.Type != t {
continue
}
_ = o0.Args[1]
o0_0 := o0.Args[0]
o0_1 := o0.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
s0 := o0_0
if s0.Op != OpPPC64SLWconst || auxIntToInt64(s0.AuxInt) != 16 {
continue
}
x1 := s0.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i2 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] {
continue
}
x0 := o0_1
if x0.Op != OpPPC64MOVHZload {
continue
}
i0 := auxIntToInt32(x0.AuxInt)
if auxToSym(x0.Aux) != s {
continue
}
_ = x0.Args[1]
if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
continue
}
b = mergePoint(b, x0, x1, x2)
v0 := b.NewValue0(x0.Pos, OpPPC64MOVWZload, t)
v.copyOf(v0)
v0.AuxInt = int32ToAuxInt(i0)
v0.Aux = symToAux(s)
v0.AddArg2(p, mem)
return true
}
}
break
}
// match: (OR <t> s1:(SLDconst x2:(MOVBZload [i3] {s} p mem) [24]) o0:(OR <t> s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem)))
// cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
// result: @mergePoint(b,x0,x1,x2) (MOVWZload <t> {s} [i0] p mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
s1 := v_0
if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 24 {
continue
}
x2 := s1.Args[0]
if x2.Op != OpPPC64MOVBZload {
continue
}
i3 := auxIntToInt32(x2.AuxInt)
s := auxToSym(x2.Aux)
mem := x2.Args[1]
p := x2.Args[0]
o0 := v_1
if o0.Op != OpPPC64OR || o0.Type != t {
continue
}
_ = o0.Args[1]
o0_0 := o0.Args[0]
o0_1 := o0.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
s0 := o0_0
if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 16 {
continue
}
x1 := s0.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i2 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] {
continue
}
x0 := o0_1
if x0.Op != OpPPC64MOVHZload {
continue
}
i0 := auxIntToInt32(x0.AuxInt)
if auxToSym(x0.Aux) != s {
continue
}
_ = x0.Args[1]
if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
continue
}
b = mergePoint(b, x0, x1, x2)
v0 := b.NewValue0(x0.Pos, OpPPC64MOVWZload, t)
v.copyOf(v0)
v0.AuxInt = int32ToAuxInt(i0)
v0.Aux = symToAux(s)
v0.AddArg2(p, mem)
return true
}
}
break
}
// match: (OR <t> s1:(SLWconst x2:(MOVBZload [i0] {s} p mem) [24]) o0:(OR <t> s0:(SLWconst x1:(MOVBZload [i1] {s} p mem) [16]) x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i2] {s} p) mem)))
// cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
// result: @mergePoint(b,x0,x1,x2) (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
s1 := v_0
if s1.Op != OpPPC64SLWconst || auxIntToInt64(s1.AuxInt) != 24 {
continue
}
x2 := s1.Args[0]
if x2.Op != OpPPC64MOVBZload {
continue
}
i0 := auxIntToInt32(x2.AuxInt)
s := auxToSym(x2.Aux)
mem := x2.Args[1]
p := x2.Args[0]
o0 := v_1
if o0.Op != OpPPC64OR || o0.Type != t {
continue
}
_ = o0.Args[1]
o0_0 := o0.Args[0]
o0_1 := o0.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
s0 := o0_0
if s0.Op != OpPPC64SLWconst || auxIntToInt64(s0.AuxInt) != 16 {
continue
}
x1 := s0.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i1 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] {
continue
}
x0 := o0_1
if x0.Op != OpPPC64MOVHBRload || x0.Type != t {
continue
}
_ = x0.Args[1]
x0_0 := x0.Args[0]
if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr {
continue
}
i2 := auxIntToInt32(x0_0.AuxInt)
if auxToSym(x0_0.Aux) != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
continue
}
b = mergePoint(b, x0, x1, x2)
v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t)
v.copyOf(v0)
v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v1.AuxInt = int32ToAuxInt(i0)
v1.Aux = symToAux(s)
v1.AddArg(p)
v0.AddArg2(v1, mem)
return true
}
}
break
}
// match: (OR <t> s1:(SLDconst x2:(MOVBZload [i0] {s} p mem) [24]) o0:(OR <t> s0:(SLDconst x1:(MOVBZload [i1] {s} p mem) [16]) x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i2] {s} p) mem)))
// cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
// result: @mergePoint(b,x0,x1,x2) (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
s1 := v_0
if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 24 {
continue
}
x2 := s1.Args[0]
if x2.Op != OpPPC64MOVBZload {
continue
}
i0 := auxIntToInt32(x2.AuxInt)
s := auxToSym(x2.Aux)
mem := x2.Args[1]
p := x2.Args[0]
o0 := v_1
if o0.Op != OpPPC64OR || o0.Type != t {
continue
}
_ = o0.Args[1]
o0_0 := o0.Args[0]
o0_1 := o0.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
s0 := o0_0
if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 16 {
continue
}
x1 := s0.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i1 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] {
continue
}
x0 := o0_1
if x0.Op != OpPPC64MOVHBRload || x0.Type != t {
continue
}
_ = x0.Args[1]
x0_0 := x0.Args[0]
if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr {
continue
}
i2 := auxIntToInt32(x0_0.AuxInt)
if auxToSym(x0_0.Aux) != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
continue
}
b = mergePoint(b, x0, x1, x2)
v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t)
v.copyOf(v0)
v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v1.AuxInt = int32ToAuxInt(i0)
v1.Aux = symToAux(s)
v1.AddArg(p)
v0.AddArg2(v1, mem)
return true
}
}
break
}
// match: (OR <t> x0:(MOVBZload [i3] {s} p mem) o0:(OR <t> s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLWconst x2:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [16])))
// cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
// result: @mergePoint(b,x0,x1,x2) (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
x0 := v_0
if x0.Op != OpPPC64MOVBZload {
continue
}
i3 := auxIntToInt32(x0.AuxInt)
s := auxToSym(x0.Aux)
mem := x0.Args[1]
p := x0.Args[0]
o0 := v_1
if o0.Op != OpPPC64OR || o0.Type != t {
continue
}
_ = o0.Args[1]
o0_0 := o0.Args[0]
o0_1 := o0.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
s0 := o0_0
if s0.Op != OpPPC64SLWconst || auxIntToInt64(s0.AuxInt) != 8 {
continue
}
x1 := s0.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i2 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] {
continue
}
s1 := o0_1
if s1.Op != OpPPC64SLWconst || auxIntToInt64(s1.AuxInt) != 16 {
continue
}
x2 := s1.Args[0]
if x2.Op != OpPPC64MOVHBRload || x2.Type != t {
continue
}
_ = x2.Args[1]
x2_0 := x2.Args[0]
if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr {
continue
}
i0 := auxIntToInt32(x2_0.AuxInt)
if auxToSym(x2_0.Aux) != s || p != x2_0.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
continue
}
b = mergePoint(b, x0, x1, x2)
v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t)
v.copyOf(v0)
v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v1.AuxInt = int32ToAuxInt(i0)
v1.Aux = symToAux(s)
v1.AddArg(p)
v0.AddArg2(v1, mem)
return true
}
}
break
}
// match: (OR <t> x0:(MOVBZload [i3] {s} p mem) o0:(OR <t> s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLDconst x2:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [16])))
// cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)
// result: @mergePoint(b,x0,x1,x2) (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
x0 := v_0
if x0.Op != OpPPC64MOVBZload {
continue
}
i3 := auxIntToInt32(x0.AuxInt)
s := auxToSym(x0.Aux)
mem := x0.Args[1]
p := x0.Args[0]
o0 := v_1
if o0.Op != OpPPC64OR || o0.Type != t {
continue
}
_ = o0.Args[1]
o0_0 := o0.Args[0]
o0_1 := o0.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
s0 := o0_0
if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 8 {
continue
}
x1 := s0.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i2 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] {
continue
}
s1 := o0_1
if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 16 {
continue
}
x2 := s1.Args[0]
if x2.Op != OpPPC64MOVHBRload || x2.Type != t {
continue
}
_ = x2.Args[1]
x2_0 := x2.Args[0]
if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr {
continue
}
i0 := auxIntToInt32(x2_0.AuxInt)
if auxToSym(x2_0.Aux) != s || p != x2_0.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, o0)) {
continue
}
b = mergePoint(b, x0, x1, x2)
v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t)
v.copyOf(v0)
v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v1.AuxInt = int32ToAuxInt(i0)
v1.Aux = symToAux(s)
v1.AddArg(p)
v0.AddArg2(v1, mem)
return true
}
}
break
}
// match: (OR <t> s2:(SLDconst x2:(MOVBZload [i3] {s} p mem) [32]) o0:(OR <t> s1:(SLDconst x1:(MOVBZload [i2] {s} p mem) [40]) s0:(SLDconst x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [48])))
// cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, s2, o0)
// result: @mergePoint(b,x0,x1,x2) (SLDconst <t> (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
s2 := v_0
if s2.Op != OpPPC64SLDconst || auxIntToInt64(s2.AuxInt) != 32 {
continue
}
x2 := s2.Args[0]
if x2.Op != OpPPC64MOVBZload {
continue
}
i3 := auxIntToInt32(x2.AuxInt)
s := auxToSym(x2.Aux)
mem := x2.Args[1]
p := x2.Args[0]
o0 := v_1
if o0.Op != OpPPC64OR || o0.Type != t {
continue
}
_ = o0.Args[1]
o0_0 := o0.Args[0]
o0_1 := o0.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
s1 := o0_0
if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 40 {
continue
}
x1 := s1.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i2 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] {
continue
}
s0 := o0_1
if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 48 {
continue
}
x0 := s0.Args[0]
if x0.Op != OpPPC64MOVHBRload || x0.Type != t {
continue
}
_ = x0.Args[1]
x0_0 := x0.Args[0]
if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr {
continue
}
i0 := auxIntToInt32(x0_0.AuxInt)
if auxToSym(x0_0.Aux) != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, s2, o0)) {
continue
}
b = mergePoint(b, x0, x1, x2)
v0 := b.NewValue0(x0.Pos, OpPPC64SLDconst, t)
v.copyOf(v0)
v0.AuxInt = int64ToAuxInt(32)
v1 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t)
v2 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v2.AuxInt = int32ToAuxInt(i0)
v2.Aux = symToAux(s)
v2.AddArg(p)
v1.AddArg2(v2, mem)
v0.AddArg(v1)
return true
}
}
break
}
// match: (OR <t> s2:(SLDconst x2:(MOVBZload [i0] {s} p mem) [56]) o0:(OR <t> s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) s0:(SLDconst x0:(MOVHBRload <t> (MOVDaddr <typ.Uintptr> [i2] {s} p) mem) [32])))
// cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, s2, o0)
// result: @mergePoint(b,x0,x1,x2) (SLDconst <t> (MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
s2 := v_0
if s2.Op != OpPPC64SLDconst || auxIntToInt64(s2.AuxInt) != 56 {
continue
}
x2 := s2.Args[0]
if x2.Op != OpPPC64MOVBZload {
continue
}
i0 := auxIntToInt32(x2.AuxInt)
s := auxToSym(x2.Aux)
mem := x2.Args[1]
p := x2.Args[0]
o0 := v_1
if o0.Op != OpPPC64OR || o0.Type != t {
continue
}
_ = o0.Args[1]
o0_0 := o0.Args[0]
o0_1 := o0.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
s1 := o0_0
if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 48 {
continue
}
x1 := s1.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i1 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] {
continue
}
s0 := o0_1
if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 32 {
continue
}
x0 := s0.Args[0]
if x0.Op != OpPPC64MOVHBRload || x0.Type != t {
continue
}
_ = x0.Args[1]
x0_0 := x0.Args[0]
if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr {
continue
}
i2 := auxIntToInt32(x0_0.AuxInt)
if auxToSym(x0_0.Aux) != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0, x1, x2, s0, s1, s2, o0)) {
continue
}
b = mergePoint(b, x0, x1, x2)
v0 := b.NewValue0(x0.Pos, OpPPC64SLDconst, t)
v.copyOf(v0)
v0.AuxInt = int64ToAuxInt(32)
v1 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t)
v2 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v2.AuxInt = int32ToAuxInt(i0)
v2.Aux = symToAux(s)
v2.AddArg(p)
v1.AddArg2(v2, mem)
v0.AddArg(v1)
return true
}
}
break
}
// match: (OR <t> s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR <t> s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR <t> s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR <t> s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem)))))
// cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0, x4, x5, x6, x7, s3, s4, s5, s6, o3, o4, o5)
// result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload <t> {s} [i0] p mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
s6 := v_0
if s6.Op != OpPPC64SLDconst || auxIntToInt64(s6.AuxInt) != 56 {
continue
}
x7 := s6.Args[0]
if x7.Op != OpPPC64MOVBZload {
continue
}
i7 := auxIntToInt32(x7.AuxInt)
s := auxToSym(x7.Aux)
mem := x7.Args[1]
p := x7.Args[0]
o5 := v_1
if o5.Op != OpPPC64OR || o5.Type != t {
continue
}
_ = o5.Args[1]
o5_0 := o5.Args[0]
o5_1 := o5.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o5_0, o5_1 = _i1+1, o5_1, o5_0 {
s5 := o5_0
if s5.Op != OpPPC64SLDconst || auxIntToInt64(s5.AuxInt) != 48 {
continue
}
x6 := s5.Args[0]
if x6.Op != OpPPC64MOVBZload {
continue
}
i6 := auxIntToInt32(x6.AuxInt)
if auxToSym(x6.Aux) != s {
continue
}
_ = x6.Args[1]
if p != x6.Args[0] || mem != x6.Args[1] {
continue
}
o4 := o5_1
if o4.Op != OpPPC64OR || o4.Type != t {
continue
}
_ = o4.Args[1]
o4_0 := o4.Args[0]
o4_1 := o4.Args[1]
for _i2 := 0; _i2 <= 1; _i2, o4_0, o4_1 = _i2+1, o4_1, o4_0 {
s4 := o4_0
if s4.Op != OpPPC64SLDconst || auxIntToInt64(s4.AuxInt) != 40 {
continue
}
x5 := s4.Args[0]
if x5.Op != OpPPC64MOVBZload {
continue
}
i5 := auxIntToInt32(x5.AuxInt)
if auxToSym(x5.Aux) != s {
continue
}
_ = x5.Args[1]
if p != x5.Args[0] || mem != x5.Args[1] {
continue
}
o3 := o4_1
if o3.Op != OpPPC64OR || o3.Type != t {
continue
}
_ = o3.Args[1]
o3_0 := o3.Args[0]
o3_1 := o3.Args[1]
for _i3 := 0; _i3 <= 1; _i3, o3_0, o3_1 = _i3+1, o3_1, o3_0 {
s3 := o3_0
if s3.Op != OpPPC64SLDconst || auxIntToInt64(s3.AuxInt) != 32 {
continue
}
x4 := s3.Args[0]
if x4.Op != OpPPC64MOVBZload {
continue
}
i4 := auxIntToInt32(x4.AuxInt)
if auxToSym(x4.Aux) != s {
continue
}
_ = x4.Args[1]
if p != x4.Args[0] || mem != x4.Args[1] {
continue
}
x0 := o3_1
if x0.Op != OpPPC64MOVWZload {
continue
}
i0 := auxIntToInt32(x0.AuxInt)
if auxToSym(x0.Aux) != s {
continue
}
_ = x0.Args[1]
if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0, x4, x5, x6, x7, s3, s4, s5, s6, o3, o4, o5)) {
continue
}
b = mergePoint(b, x0, x4, x5, x6, x7)
v0 := b.NewValue0(x0.Pos, OpPPC64MOVDload, t)
v.copyOf(v0)
v0.AuxInt = int32ToAuxInt(i0)
v0.Aux = symToAux(s)
v0.AddArg2(p, mem)
return true
}
}
}
}
break
}
// match: (OR <t> s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR <t> s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR <t> s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR <t> s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i4] p) mem)))))
// cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0, x1, x2, x3, x4, o0, o1, o2, s0, s1, s2, s3)
// result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
s0 := v_0
if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 56 {
continue
}
x0 := s0.Args[0]
if x0.Op != OpPPC64MOVBZload {
continue
}
i0 := auxIntToInt32(x0.AuxInt)
s := auxToSym(x0.Aux)
mem := x0.Args[1]
p := x0.Args[0]
o0 := v_1
if o0.Op != OpPPC64OR || o0.Type != t {
continue
}
_ = o0.Args[1]
o0_0 := o0.Args[0]
o0_1 := o0.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o0_0, o0_1 = _i1+1, o0_1, o0_0 {
s1 := o0_0
if s1.Op != OpPPC64SLDconst || auxIntToInt64(s1.AuxInt) != 48 {
continue
}
x1 := s1.Args[0]
if x1.Op != OpPPC64MOVBZload {
continue
}
i1 := auxIntToInt32(x1.AuxInt)
if auxToSym(x1.Aux) != s {
continue
}
_ = x1.Args[1]
if p != x1.Args[0] || mem != x1.Args[1] {
continue
}
o1 := o0_1
if o1.Op != OpPPC64OR || o1.Type != t {
continue
}
_ = o1.Args[1]
o1_0 := o1.Args[0]
o1_1 := o1.Args[1]
for _i2 := 0; _i2 <= 1; _i2, o1_0, o1_1 = _i2+1, o1_1, o1_0 {
s2 := o1_0
if s2.Op != OpPPC64SLDconst || auxIntToInt64(s2.AuxInt) != 40 {
continue
}
x2 := s2.Args[0]
if x2.Op != OpPPC64MOVBZload {
continue
}
i2 := auxIntToInt32(x2.AuxInt)
if auxToSym(x2.Aux) != s {
continue
}
_ = x2.Args[1]
if p != x2.Args[0] || mem != x2.Args[1] {
continue
}
o2 := o1_1
if o2.Op != OpPPC64OR || o2.Type != t {
continue
}
_ = o2.Args[1]
o2_0 := o2.Args[0]
o2_1 := o2.Args[1]
for _i3 := 0; _i3 <= 1; _i3, o2_0, o2_1 = _i3+1, o2_1, o2_0 {
s3 := o2_0
if s3.Op != OpPPC64SLDconst || auxIntToInt64(s3.AuxInt) != 32 {
continue
}
x3 := s3.Args[0]
if x3.Op != OpPPC64MOVBZload {
continue
}
i3 := auxIntToInt32(x3.AuxInt)
if auxToSym(x3.Aux) != s {
continue
}
_ = x3.Args[1]
if p != x3.Args[0] || mem != x3.Args[1] {
continue
}
x4 := o2_1
if x4.Op != OpPPC64MOVWBRload || x4.Type != t {
continue
}
_ = x4.Args[1]
x4_0 := x4.Args[0]
if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr {
continue
}
i4 := auxIntToInt32(x4_0.AuxInt)
if p != x4_0.Args[0] || mem != x4.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0, x1, x2, x3, x4, o0, o1, o2, s0, s1, s2, s3)) {
continue
}
b = mergePoint(b, x0, x1, x2, x3, x4)
v0 := b.NewValue0(x4.Pos, OpPPC64MOVDBRload, t)
v.copyOf(v0)
v1 := b.NewValue0(x4.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v1.AuxInt = int32ToAuxInt(i0)
v1.Aux = symToAux(s)
v1.AddArg(p)
v0.AddArg2(v1, mem)
return true
}
}
}
}
break
}
// match: (OR <t> x7:(MOVBZload [i7] {s} p mem) o5:(OR <t> s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR <t> s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR <t> s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])))))
// cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3, x4, x5, x6, x7, o3, o4, o5, s0, s4, s5, s6)
// result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
x7 := v_0
if x7.Op != OpPPC64MOVBZload {
continue
}
i7 := auxIntToInt32(x7.AuxInt)
s := auxToSym(x7.Aux)
mem := x7.Args[1]
p := x7.Args[0]
o5 := v_1
if o5.Op != OpPPC64OR || o5.Type != t {
continue
}
_ = o5.Args[1]
o5_0 := o5.Args[0]
o5_1 := o5.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o5_0, o5_1 = _i1+1, o5_1, o5_0 {
s6 := o5_0
if s6.Op != OpPPC64SLDconst || auxIntToInt64(s6.AuxInt) != 8 {
continue
}
x6 := s6.Args[0]
if x6.Op != OpPPC64MOVBZload {
continue
}
i6 := auxIntToInt32(x6.AuxInt)
if auxToSym(x6.Aux) != s {
continue
}
_ = x6.Args[1]
if p != x6.Args[0] || mem != x6.Args[1] {
continue
}
o4 := o5_1
if o4.Op != OpPPC64OR || o4.Type != t {
continue
}
_ = o4.Args[1]
o4_0 := o4.Args[0]
o4_1 := o4.Args[1]
for _i2 := 0; _i2 <= 1; _i2, o4_0, o4_1 = _i2+1, o4_1, o4_0 {
s5 := o4_0
if s5.Op != OpPPC64SLDconst || auxIntToInt64(s5.AuxInt) != 16 {
continue
}
x5 := s5.Args[0]
if x5.Op != OpPPC64MOVBZload {
continue
}
i5 := auxIntToInt32(x5.AuxInt)
if auxToSym(x5.Aux) != s {
continue
}
_ = x5.Args[1]
if p != x5.Args[0] || mem != x5.Args[1] {
continue
}
o3 := o4_1
if o3.Op != OpPPC64OR || o3.Type != t {
continue
}
_ = o3.Args[1]
o3_0 := o3.Args[0]
o3_1 := o3.Args[1]
for _i3 := 0; _i3 <= 1; _i3, o3_0, o3_1 = _i3+1, o3_1, o3_0 {
s4 := o3_0
if s4.Op != OpPPC64SLDconst || auxIntToInt64(s4.AuxInt) != 24 {
continue
}
x4 := s4.Args[0]
if x4.Op != OpPPC64MOVBZload {
continue
}
i4 := auxIntToInt32(x4.AuxInt)
if auxToSym(x4.Aux) != s {
continue
}
_ = x4.Args[1]
if p != x4.Args[0] || mem != x4.Args[1] {
continue
}
s0 := o3_1
if s0.Op != OpPPC64SLWconst || auxIntToInt64(s0.AuxInt) != 32 {
continue
}
x3 := s0.Args[0]
if x3.Op != OpPPC64MOVWBRload || x3.Type != t {
continue
}
_ = x3.Args[1]
x3_0 := x3.Args[0]
if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr {
continue
}
i0 := auxIntToInt32(x3_0.AuxInt)
if auxToSym(x3_0.Aux) != s || p != x3_0.Args[0] || mem != x3.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3, x4, x5, x6, x7, o3, o4, o5, s0, s4, s5, s6)) {
continue
}
b = mergePoint(b, x3, x4, x5, x6, x7)
v0 := b.NewValue0(x3.Pos, OpPPC64MOVDBRload, t)
v.copyOf(v0)
v1 := b.NewValue0(x3.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v1.AuxInt = int32ToAuxInt(i0)
v1.Aux = symToAux(s)
v1.AddArg(p)
v0.AddArg2(v1, mem)
return true
}
}
}
}
break
}
// match: (OR <t> x7:(MOVBZload [i7] {s} p mem) o5:(OR <t> s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR <t> s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR <t> s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem) [32])))))
// cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3, x4, x5, x6, x7, o3, o4, o5, s0, s4, s5, s6)
// result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload <t> (MOVDaddr <typ.Uintptr> [i0] {s} p) mem)
for {
t := v.Type
for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
x7 := v_0
if x7.Op != OpPPC64MOVBZload {
continue
}
i7 := auxIntToInt32(x7.AuxInt)
s := auxToSym(x7.Aux)
mem := x7.Args[1]
p := x7.Args[0]
o5 := v_1
if o5.Op != OpPPC64OR || o5.Type != t {
continue
}
_ = o5.Args[1]
o5_0 := o5.Args[0]
o5_1 := o5.Args[1]
for _i1 := 0; _i1 <= 1; _i1, o5_0, o5_1 = _i1+1, o5_1, o5_0 {
s6 := o5_0
if s6.Op != OpPPC64SLDconst || auxIntToInt64(s6.AuxInt) != 8 {
continue
}
x6 := s6.Args[0]
if x6.Op != OpPPC64MOVBZload {
continue
}
i6 := auxIntToInt32(x6.AuxInt)
if auxToSym(x6.Aux) != s {
continue
}
_ = x6.Args[1]
if p != x6.Args[0] || mem != x6.Args[1] {
continue
}
o4 := o5_1
if o4.Op != OpPPC64OR || o4.Type != t {
continue
}
_ = o4.Args[1]
o4_0 := o4.Args[0]
o4_1 := o4.Args[1]
for _i2 := 0; _i2 <= 1; _i2, o4_0, o4_1 = _i2+1, o4_1, o4_0 {
s5 := o4_0
if s5.Op != OpPPC64SLDconst || auxIntToInt64(s5.AuxInt) != 16 {
continue
}
x5 := s5.Args[0]
if x5.Op != OpPPC64MOVBZload {
continue
}
i5 := auxIntToInt32(x5.AuxInt)
if auxToSym(x5.Aux) != s {
continue
}
_ = x5.Args[1]
if p != x5.Args[0] || mem != x5.Args[1] {
continue
}
o3 := o4_1
if o3.Op != OpPPC64OR || o3.Type != t {
continue
}
_ = o3.Args[1]
o3_0 := o3.Args[0]
o3_1 := o3.Args[1]
for _i3 := 0; _i3 <= 1; _i3, o3_0, o3_1 = _i3+1, o3_1, o3_0 {
s4 := o3_0
if s4.Op != OpPPC64SLDconst || auxIntToInt64(s4.AuxInt) != 24 {
continue
}
x4 := s4.Args[0]
if x4.Op != OpPPC64MOVBZload {
continue
}
i4 := auxIntToInt32(x4.AuxInt)
if auxToSym(x4.Aux) != s {
continue
}
_ = x4.Args[1]
if p != x4.Args[0] || mem != x4.Args[1] {
continue
}
s0 := o3_1
if s0.Op != OpPPC64SLDconst || auxIntToInt64(s0.AuxInt) != 32 {
continue
}
x3 := s0.Args[0]
if x3.Op != OpPPC64MOVWBRload || x3.Type != t {
continue
}
_ = x3.Args[1]
x3_0 := x3.Args[0]
if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr {
continue
}
i0 := auxIntToInt32(x3_0.AuxInt)
if auxToSym(x3_0.Aux) != s || p != x3_0.Args[0] || mem != x3.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3, x4, x5, x6, x7, o3, o4, o5, s0, s4, s5, s6)) {
continue
}
b = mergePoint(b, x3, x4, x5, x6, x7)
v0 := b.NewValue0(x3.Pos, OpPPC64MOVDBRload, t)
v.copyOf(v0)
v1 := b.NewValue0(x3.Pos, OpPPC64MOVDaddr, typ.Uintptr)
v1.AuxInt = int32ToAuxInt(i0)
v1.Aux = symToAux(s)
v1.AddArg(p)
v0.AddArg2(v1, mem)
return true
}
}
}
}
break
}
return false
}