func rewriteValuePPC64_OpPPC64OR()

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
}