func rewriteValueARM64_OpARM64OR()

in src/cmd/compile/internal/ssa/rewriteARM64.go [16063:18081]


func rewriteValueARM64_OpARM64OR(v *Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (OR x (MOVDconst [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 != OpARM64MOVDconst {
				continue
			}
			c := auxIntToInt64(v_1.AuxInt)
			v.reset(OpARM64ORconst)
			v.AuxInt = int64ToAuxInt(c)
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (OR x x)
	// result: x
	for {
		x := v_0
		if x != v_1 {
			break
		}
		v.copyOf(x)
		return true
	}
	// match: (OR x (MVN y))
	// result: (ORN x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != OpARM64MVN {
				continue
			}
			y := v_1.Args[0]
			v.reset(OpARM64ORN)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (OR x0 x1:(SLLconst [c] y))
	// cond: clobberIfDead(x1)
	// result: (ORshiftLL x0 y [c])
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x0 := v_0
			x1 := v_1
			if x1.Op != OpARM64SLLconst {
				continue
			}
			c := auxIntToInt64(x1.AuxInt)
			y := x1.Args[0]
			if !(clobberIfDead(x1)) {
				continue
			}
			v.reset(OpARM64ORshiftLL)
			v.AuxInt = int64ToAuxInt(c)
			v.AddArg2(x0, y)
			return true
		}
		break
	}
	// match: (OR x0 x1:(SRLconst [c] y))
	// cond: clobberIfDead(x1)
	// result: (ORshiftRL x0 y [c])
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x0 := v_0
			x1 := v_1
			if x1.Op != OpARM64SRLconst {
				continue
			}
			c := auxIntToInt64(x1.AuxInt)
			y := x1.Args[0]
			if !(clobberIfDead(x1)) {
				continue
			}
			v.reset(OpARM64ORshiftRL)
			v.AuxInt = int64ToAuxInt(c)
			v.AddArg2(x0, y)
			return true
		}
		break
	}
	// match: (OR x0 x1:(SRAconst [c] y))
	// cond: clobberIfDead(x1)
	// result: (ORshiftRA x0 y [c])
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x0 := v_0
			x1 := v_1
			if x1.Op != OpARM64SRAconst {
				continue
			}
			c := auxIntToInt64(x1.AuxInt)
			y := x1.Args[0]
			if !(clobberIfDead(x1)) {
				continue
			}
			v.reset(OpARM64ORshiftRA)
			v.AuxInt = int64ToAuxInt(c)
			v.AddArg2(x0, y)
			return true
		}
		break
	}
	// match: (OR x0 x1:(RORconst [c] y))
	// cond: clobberIfDead(x1)
	// result: (ORshiftRO x0 y [c])
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x0 := v_0
			x1 := v_1
			if x1.Op != OpARM64RORconst {
				continue
			}
			c := auxIntToInt64(x1.AuxInt)
			y := x1.Args[0]
			if !(clobberIfDead(x1)) {
				continue
			}
			v.reset(OpARM64ORshiftRO)
			v.AuxInt = int64ToAuxInt(c)
			v.AddArg2(x0, y)
			return true
		}
		break
	}
	// match: (OR (SLL x (ANDconst <t> [63] y)) (CSEL0 <typ.UInt64> [cc] (SRL <typ.UInt64> x (SUB <t> (MOVDconst [64]) (ANDconst <t> [63] y))) (CMPconst [64] (SUB <t> (MOVDconst [64]) (ANDconst <t> [63] y)))))
	// cond: cc == OpARM64LessThanU
	// result: (ROR x (NEG <t> y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != OpARM64SLL {
				continue
			}
			_ = v_0.Args[1]
			x := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != OpARM64ANDconst {
				continue
			}
			t := v_0_1.Type
			if auxIntToInt64(v_0_1.AuxInt) != 63 {
				continue
			}
			y := v_0_1.Args[0]
			if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 {
				continue
			}
			cc := auxIntToOp(v_1.AuxInt)
			_ = v_1.Args[1]
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 {
				continue
			}
			_ = v_1_0.Args[1]
			if x != v_1_0.Args[0] {
				continue
			}
			v_1_0_1 := v_1_0.Args[1]
			if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t {
				continue
			}
			_ = v_1_0_1.Args[1]
			v_1_0_1_0 := v_1_0_1.Args[0]
			if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 64 {
				continue
			}
			v_1_0_1_1 := v_1_0_1.Args[1]
			if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 63 || y != v_1_0_1_1.Args[0] {
				continue
			}
			v_1_1 := v_1.Args[1]
			if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 {
				continue
			}
			v_1_1_0 := v_1_1.Args[0]
			if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t {
				continue
			}
			_ = v_1_1_0.Args[1]
			v_1_1_0_0 := v_1_1_0.Args[0]
			if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 64 {
				continue
			}
			v_1_1_0_1 := v_1_1_0.Args[1]
			if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) {
				continue
			}
			v.reset(OpARM64ROR)
			v0 := b.NewValue0(v.Pos, OpARM64NEG, t)
			v0.AddArg(y)
			v.AddArg2(x, v0)
			return true
		}
		break
	}
	// match: (OR (SRL <typ.UInt64> x (ANDconst <t> [63] y)) (CSEL0 <typ.UInt64> [cc] (SLL x (SUB <t> (MOVDconst [64]) (ANDconst <t> [63] y))) (CMPconst [64] (SUB <t> (MOVDconst [64]) (ANDconst <t> [63] y)))))
	// cond: cc == OpARM64LessThanU
	// result: (ROR x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt64 {
				continue
			}
			_ = v_0.Args[1]
			x := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != OpARM64ANDconst {
				continue
			}
			t := v_0_1.Type
			if auxIntToInt64(v_0_1.AuxInt) != 63 {
				continue
			}
			y := v_0_1.Args[0]
			if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 {
				continue
			}
			cc := auxIntToOp(v_1.AuxInt)
			_ = v_1.Args[1]
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != OpARM64SLL {
				continue
			}
			_ = v_1_0.Args[1]
			if x != v_1_0.Args[0] {
				continue
			}
			v_1_0_1 := v_1_0.Args[1]
			if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t {
				continue
			}
			_ = v_1_0_1.Args[1]
			v_1_0_1_0 := v_1_0_1.Args[0]
			if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 64 {
				continue
			}
			v_1_0_1_1 := v_1_0_1.Args[1]
			if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 63 || y != v_1_0_1_1.Args[0] {
				continue
			}
			v_1_1 := v_1.Args[1]
			if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 {
				continue
			}
			v_1_1_0 := v_1_1.Args[0]
			if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t {
				continue
			}
			_ = v_1_1_0.Args[1]
			v_1_1_0_0 := v_1_1_0.Args[0]
			if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 64 {
				continue
			}
			v_1_1_0_1 := v_1_1_0.Args[1]
			if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) {
				continue
			}
			v.reset(OpARM64ROR)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (OR (SLL x (ANDconst <t> [31] y)) (CSEL0 <typ.UInt32> [cc] (SRL <typ.UInt32> (MOVWUreg x) (SUB <t> (MOVDconst [32]) (ANDconst <t> [31] y))) (CMPconst [64] (SUB <t> (MOVDconst [32]) (ANDconst <t> [31] y)))))
	// cond: cc == OpARM64LessThanU
	// result: (RORW x (NEG <t> y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != OpARM64SLL {
				continue
			}
			_ = v_0.Args[1]
			x := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != OpARM64ANDconst {
				continue
			}
			t := v_0_1.Type
			if auxIntToInt64(v_0_1.AuxInt) != 31 {
				continue
			}
			y := v_0_1.Args[0]
			if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 {
				continue
			}
			cc := auxIntToOp(v_1.AuxInt)
			_ = v_1.Args[1]
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 {
				continue
			}
			_ = v_1_0.Args[1]
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != OpARM64MOVWUreg || x != v_1_0_0.Args[0] {
				continue
			}
			v_1_0_1 := v_1_0.Args[1]
			if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t {
				continue
			}
			_ = v_1_0_1.Args[1]
			v_1_0_1_0 := v_1_0_1.Args[0]
			if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 32 {
				continue
			}
			v_1_0_1_1 := v_1_0_1.Args[1]
			if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 31 || y != v_1_0_1_1.Args[0] {
				continue
			}
			v_1_1 := v_1.Args[1]
			if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 {
				continue
			}
			v_1_1_0 := v_1_1.Args[0]
			if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t {
				continue
			}
			_ = v_1_1_0.Args[1]
			v_1_1_0_0 := v_1_1_0.Args[0]
			if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 32 {
				continue
			}
			v_1_1_0_1 := v_1_1_0.Args[1]
			if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) {
				continue
			}
			v.reset(OpARM64RORW)
			v0 := b.NewValue0(v.Pos, OpARM64NEG, t)
			v0.AddArg(y)
			v.AddArg2(x, v0)
			return true
		}
		break
	}
	// match: (OR (SRL <typ.UInt32> (MOVWUreg x) (ANDconst <t> [31] y)) (CSEL0 <typ.UInt32> [cc] (SLL x (SUB <t> (MOVDconst [32]) (ANDconst <t> [31] y))) (CMPconst [64] (SUB <t> (MOVDconst [32]) (ANDconst <t> [31] y)))))
	// cond: cc == OpARM64LessThanU
	// result: (RORW x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt32 {
				continue
			}
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != OpARM64MOVWUreg {
				continue
			}
			x := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != OpARM64ANDconst {
				continue
			}
			t := v_0_1.Type
			if auxIntToInt64(v_0_1.AuxInt) != 31 {
				continue
			}
			y := v_0_1.Args[0]
			if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 {
				continue
			}
			cc := auxIntToOp(v_1.AuxInt)
			_ = v_1.Args[1]
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != OpARM64SLL {
				continue
			}
			_ = v_1_0.Args[1]
			if x != v_1_0.Args[0] {
				continue
			}
			v_1_0_1 := v_1_0.Args[1]
			if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t {
				continue
			}
			_ = v_1_0_1.Args[1]
			v_1_0_1_0 := v_1_0_1.Args[0]
			if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 32 {
				continue
			}
			v_1_0_1_1 := v_1_0_1.Args[1]
			if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 31 || y != v_1_0_1_1.Args[0] {
				continue
			}
			v_1_1 := v_1.Args[1]
			if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 {
				continue
			}
			v_1_1_0 := v_1_1.Args[0]
			if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t {
				continue
			}
			_ = v_1_1_0.Args[1]
			v_1_1_0_0 := v_1_1_0.Args[0]
			if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 32 {
				continue
			}
			v_1_1_0_1 := v_1_1_0.Args[1]
			if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) {
				continue
			}
			v.reset(OpARM64RORW)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (OR (UBFIZ [bfc] x) (ANDconst [ac] y))
	// cond: ac == ^((1<<uint(bfc.getARM64BFwidth())-1) << uint(bfc.getARM64BFlsb()))
	// result: (BFI [bfc] y x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != OpARM64UBFIZ {
				continue
			}
			bfc := auxIntToArm64BitField(v_0.AuxInt)
			x := v_0.Args[0]
			if v_1.Op != OpARM64ANDconst {
				continue
			}
			ac := auxIntToInt64(v_1.AuxInt)
			y := v_1.Args[0]
			if !(ac == ^((1<<uint(bfc.getARM64BFwidth()) - 1) << uint(bfc.getARM64BFlsb()))) {
				continue
			}
			v.reset(OpARM64BFI)
			v.AuxInt = arm64BitFieldToAuxInt(bfc)
			v.AddArg2(y, x)
			return true
		}
		break
	}
	// match: (OR (UBFX [bfc] x) (ANDconst [ac] y))
	// cond: ac == ^(1<<uint(bfc.getARM64BFwidth())-1)
	// result: (BFXIL [bfc] y x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != OpARM64UBFX {
				continue
			}
			bfc := auxIntToArm64BitField(v_0.AuxInt)
			x := v_0.Args[0]
			if v_1.Op != OpARM64ANDconst {
				continue
			}
			ac := auxIntToInt64(v_1.AuxInt)
			y := v_1.Args[0]
			if !(ac == ^(1<<uint(bfc.getARM64BFwidth()) - 1)) {
				continue
			}
			v.reset(OpARM64BFXIL)
			v.AuxInt = arm64BitFieldToAuxInt(bfc)
			v.AddArg2(y, x)
			return true
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i1] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i0] {s} p mem)))
	// cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
	// result: @mergePoint(b,x0,x1,x2,x3) (MOVWUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			s0 := o1.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUload {
				continue
			}
			i3 := auxIntToInt32(x0.AuxInt)
			s := auxToSym(x0.Aux)
			mem := x0.Args[1]
			p := x0.Args[0]
			y1 := o1.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUload {
				continue
			}
			i2 := auxIntToInt32(x1.AuxInt)
			if auxToSym(x1.Aux) != s {
				continue
			}
			_ = x1.Args[1]
			if p != x1.Args[0] || mem != x1.Args[1] {
				continue
			}
			y2 := o0.Args[1]
			if y2.Op != OpARM64MOVDnop {
				continue
			}
			x2 := y2.Args[0]
			if x2.Op != OpARM64MOVBUload {
				continue
			}
			i1 := auxIntToInt32(x2.AuxInt)
			if auxToSym(x2.Aux) != s {
				continue
			}
			_ = x2.Args[1]
			if p != x2.Args[0] || mem != x2.Args[1] {
				continue
			}
			y3 := v_1
			if y3.Op != OpARM64MOVDnop {
				continue
			}
			x3 := y3.Args[0]
			if x3.Op != OpARM64MOVBUload {
				continue
			}
			i0 := auxIntToInt32(x3.AuxInt)
			if auxToSym(x3.Aux) != s {
				continue
			}
			_ = x3.Args[1]
			if p != x3.Args[0] || mem != x3.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
				continue
			}
			b = mergePoint(b, x0, x1, x2, x3)
			v0 := b.NewValue0(x3.Pos, OpARM64MOVWUload, t)
			v.copyOf(v0)
			v0.Aux = symToAux(s)
			v1 := b.NewValue0(x3.Pos, OpOffPtr, p.Type)
			v1.AuxInt = int64ToAuxInt(int64(i0))
			v1.AddArg(p)
			v0.AddArg2(v1, mem)
			return true
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr0 idx0 mem)))
	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
	// result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx <t> ptr0 idx0 mem)
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			s0 := o1.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUload || auxIntToInt32(x0.AuxInt) != 3 {
				continue
			}
			s := auxToSym(x0.Aux)
			mem := x0.Args[1]
			p := x0.Args[0]
			y1 := o1.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 2 || auxToSym(x1.Aux) != s {
				continue
			}
			_ = x1.Args[1]
			if p != x1.Args[0] || mem != x1.Args[1] {
				continue
			}
			y2 := o0.Args[1]
			if y2.Op != OpARM64MOVDnop {
				continue
			}
			x2 := y2.Args[0]
			if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 1 || auxToSym(x2.Aux) != s {
				continue
			}
			_ = x2.Args[1]
			p1 := x2.Args[0]
			if p1.Op != OpARM64ADD {
				continue
			}
			_ = p1.Args[1]
			p1_0 := p1.Args[0]
			p1_1 := p1.Args[1]
			for _i1 := 0; _i1 <= 1; _i1, p1_0, p1_1 = _i1+1, p1_1, p1_0 {
				ptr1 := p1_0
				idx1 := p1_1
				if mem != x2.Args[1] {
					continue
				}
				y3 := v_1
				if y3.Op != OpARM64MOVDnop {
					continue
				}
				x3 := y3.Args[0]
				if x3.Op != OpARM64MOVBUloadidx {
					continue
				}
				_ = x3.Args[2]
				ptr0 := x3.Args[0]
				idx0 := x3.Args[1]
				if mem != x3.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
					continue
				}
				b = mergePoint(b, x0, x1, x2, x3)
				v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t)
				v.copyOf(v0)
				v0.AddArg3(ptr0, idx0, mem)
				return true
			}
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr idx mem)))
	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
	// result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx <t> ptr idx mem)
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			s0 := o1.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUloadidx {
				continue
			}
			mem := x0.Args[2]
			ptr := x0.Args[0]
			x0_1 := x0.Args[1]
			if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 3 {
				continue
			}
			idx := x0_1.Args[0]
			y1 := o1.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x1.Args[2]
			if ptr != x1.Args[0] {
				continue
			}
			x1_1 := x1.Args[1]
			if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] {
				continue
			}
			y2 := o0.Args[1]
			if y2.Op != OpARM64MOVDnop {
				continue
			}
			x2 := y2.Args[0]
			if x2.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x2.Args[2]
			if ptr != x2.Args[0] {
				continue
			}
			x2_1 := x2.Args[1]
			if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 1 || idx != x2_1.Args[0] || mem != x2.Args[2] {
				continue
			}
			y3 := v_1
			if y3.Op != OpARM64MOVDnop {
				continue
			}
			x3 := y3.Args[0]
			if x3.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x3.Args[2]
			if ptr != x3.Args[0] || idx != x3.Args[1] || mem != x3.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
				continue
			}
			b = mergePoint(b, x0, x1, x2, x3)
			v0 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t)
			v.copyOf(v0)
			v0.AddArg3(ptr, idx, mem)
			return true
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i1] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i0] {s} p mem)))
	// cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem)
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			o2 := o1.Args[0]
			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
				continue
			}
			_ = o2.Args[1]
			o3 := o2.Args[0]
			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
				continue
			}
			_ = o3.Args[1]
			o4 := o3.Args[0]
			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
				continue
			}
			_ = o4.Args[1]
			o5 := o4.Args[0]
			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
				continue
			}
			_ = o5.Args[1]
			s0 := o5.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUload {
				continue
			}
			i7 := auxIntToInt32(x0.AuxInt)
			s := auxToSym(x0.Aux)
			mem := x0.Args[1]
			p := x0.Args[0]
			y1 := o5.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUload {
				continue
			}
			i6 := auxIntToInt32(x1.AuxInt)
			if auxToSym(x1.Aux) != s {
				continue
			}
			_ = x1.Args[1]
			if p != x1.Args[0] || mem != x1.Args[1] {
				continue
			}
			y2 := o4.Args[1]
			if y2.Op != OpARM64MOVDnop {
				continue
			}
			x2 := y2.Args[0]
			if x2.Op != OpARM64MOVBUload {
				continue
			}
			i5 := auxIntToInt32(x2.AuxInt)
			if auxToSym(x2.Aux) != s {
				continue
			}
			_ = x2.Args[1]
			if p != x2.Args[0] || mem != x2.Args[1] {
				continue
			}
			y3 := o3.Args[1]
			if y3.Op != OpARM64MOVDnop {
				continue
			}
			x3 := y3.Args[0]
			if x3.Op != OpARM64MOVBUload {
				continue
			}
			i4 := auxIntToInt32(x3.AuxInt)
			if auxToSym(x3.Aux) != s {
				continue
			}
			_ = x3.Args[1]
			if p != x3.Args[0] || mem != x3.Args[1] {
				continue
			}
			y4 := o2.Args[1]
			if y4.Op != OpARM64MOVDnop {
				continue
			}
			x4 := y4.Args[0]
			if x4.Op != OpARM64MOVBUload {
				continue
			}
			i3 := auxIntToInt32(x4.AuxInt)
			if auxToSym(x4.Aux) != s {
				continue
			}
			_ = x4.Args[1]
			if p != x4.Args[0] || mem != x4.Args[1] {
				continue
			}
			y5 := o1.Args[1]
			if y5.Op != OpARM64MOVDnop {
				continue
			}
			x5 := y5.Args[0]
			if x5.Op != OpARM64MOVBUload {
				continue
			}
			i2 := auxIntToInt32(x5.AuxInt)
			if auxToSym(x5.Aux) != s {
				continue
			}
			_ = x5.Args[1]
			if p != x5.Args[0] || mem != x5.Args[1] {
				continue
			}
			y6 := o0.Args[1]
			if y6.Op != OpARM64MOVDnop {
				continue
			}
			x6 := y6.Args[0]
			if x6.Op != OpARM64MOVBUload {
				continue
			}
			i1 := auxIntToInt32(x6.AuxInt)
			if auxToSym(x6.Aux) != s {
				continue
			}
			_ = x6.Args[1]
			if p != x6.Args[0] || mem != x6.Args[1] {
				continue
			}
			y7 := v_1
			if y7.Op != OpARM64MOVDnop {
				continue
			}
			x7 := y7.Args[0]
			if x7.Op != OpARM64MOVBUload {
				continue
			}
			i0 := auxIntToInt32(x7.AuxInt)
			if auxToSym(x7.Aux) != s {
				continue
			}
			_ = x7.Args[1]
			if p != x7.Args[0] || mem != x7.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
				continue
			}
			b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
			v0 := b.NewValue0(x7.Pos, OpARM64MOVDload, t)
			v.copyOf(v0)
			v0.Aux = symToAux(s)
			v1 := b.NewValue0(x7.Pos, OpOffPtr, p.Type)
			v1.AuxInt = int64ToAuxInt(int64(i0))
			v1.AddArg(p)
			v0.AddArg2(v1, mem)
			return true
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr0 idx0 mem)))
	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx <t> ptr0 idx0 mem)
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			o2 := o1.Args[0]
			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
				continue
			}
			_ = o2.Args[1]
			o3 := o2.Args[0]
			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
				continue
			}
			_ = o3.Args[1]
			o4 := o3.Args[0]
			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
				continue
			}
			_ = o4.Args[1]
			o5 := o4.Args[0]
			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
				continue
			}
			_ = o5.Args[1]
			s0 := o5.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUload || auxIntToInt32(x0.AuxInt) != 7 {
				continue
			}
			s := auxToSym(x0.Aux)
			mem := x0.Args[1]
			p := x0.Args[0]
			y1 := o5.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 6 || auxToSym(x1.Aux) != s {
				continue
			}
			_ = x1.Args[1]
			if p != x1.Args[0] || mem != x1.Args[1] {
				continue
			}
			y2 := o4.Args[1]
			if y2.Op != OpARM64MOVDnop {
				continue
			}
			x2 := y2.Args[0]
			if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 5 || auxToSym(x2.Aux) != s {
				continue
			}
			_ = x2.Args[1]
			if p != x2.Args[0] || mem != x2.Args[1] {
				continue
			}
			y3 := o3.Args[1]
			if y3.Op != OpARM64MOVDnop {
				continue
			}
			x3 := y3.Args[0]
			if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 4 || auxToSym(x3.Aux) != s {
				continue
			}
			_ = x3.Args[1]
			if p != x3.Args[0] || mem != x3.Args[1] {
				continue
			}
			y4 := o2.Args[1]
			if y4.Op != OpARM64MOVDnop {
				continue
			}
			x4 := y4.Args[0]
			if x4.Op != OpARM64MOVBUload || auxIntToInt32(x4.AuxInt) != 3 || auxToSym(x4.Aux) != s {
				continue
			}
			_ = x4.Args[1]
			if p != x4.Args[0] || mem != x4.Args[1] {
				continue
			}
			y5 := o1.Args[1]
			if y5.Op != OpARM64MOVDnop {
				continue
			}
			x5 := y5.Args[0]
			if x5.Op != OpARM64MOVBUload || auxIntToInt32(x5.AuxInt) != 2 || auxToSym(x5.Aux) != s {
				continue
			}
			_ = x5.Args[1]
			if p != x5.Args[0] || mem != x5.Args[1] {
				continue
			}
			y6 := o0.Args[1]
			if y6.Op != OpARM64MOVDnop {
				continue
			}
			x6 := y6.Args[0]
			if x6.Op != OpARM64MOVBUload || auxIntToInt32(x6.AuxInt) != 1 || auxToSym(x6.Aux) != s {
				continue
			}
			_ = x6.Args[1]
			p1 := x6.Args[0]
			if p1.Op != OpARM64ADD {
				continue
			}
			_ = p1.Args[1]
			p1_0 := p1.Args[0]
			p1_1 := p1.Args[1]
			for _i1 := 0; _i1 <= 1; _i1, p1_0, p1_1 = _i1+1, p1_1, p1_0 {
				ptr1 := p1_0
				idx1 := p1_1
				if mem != x6.Args[1] {
					continue
				}
				y7 := v_1
				if y7.Op != OpARM64MOVDnop {
					continue
				}
				x7 := y7.Args[0]
				if x7.Op != OpARM64MOVBUloadidx {
					continue
				}
				_ = x7.Args[2]
				ptr0 := x7.Args[0]
				idx0 := x7.Args[1]
				if mem != x7.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
					continue
				}
				b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
				v0 := b.NewValue0(x6.Pos, OpARM64MOVDloadidx, t)
				v.copyOf(v0)
				v0.AddArg3(ptr0, idx0, mem)
				return true
			}
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [7] idx) mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr idx mem)))
	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx <t> ptr idx mem)
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			o2 := o1.Args[0]
			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
				continue
			}
			_ = o2.Args[1]
			o3 := o2.Args[0]
			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
				continue
			}
			_ = o3.Args[1]
			o4 := o3.Args[0]
			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
				continue
			}
			_ = o4.Args[1]
			o5 := o4.Args[0]
			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
				continue
			}
			_ = o5.Args[1]
			s0 := o5.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUloadidx {
				continue
			}
			mem := x0.Args[2]
			ptr := x0.Args[0]
			x0_1 := x0.Args[1]
			if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 7 {
				continue
			}
			idx := x0_1.Args[0]
			y1 := o5.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x1.Args[2]
			if ptr != x1.Args[0] {
				continue
			}
			x1_1 := x1.Args[1]
			if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 6 || idx != x1_1.Args[0] || mem != x1.Args[2] {
				continue
			}
			y2 := o4.Args[1]
			if y2.Op != OpARM64MOVDnop {
				continue
			}
			x2 := y2.Args[0]
			if x2.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x2.Args[2]
			if ptr != x2.Args[0] {
				continue
			}
			x2_1 := x2.Args[1]
			if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] {
				continue
			}
			y3 := o3.Args[1]
			if y3.Op != OpARM64MOVDnop {
				continue
			}
			x3 := y3.Args[0]
			if x3.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x3.Args[2]
			if ptr != x3.Args[0] {
				continue
			}
			x3_1 := x3.Args[1]
			if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 4 || idx != x3_1.Args[0] || mem != x3.Args[2] {
				continue
			}
			y4 := o2.Args[1]
			if y4.Op != OpARM64MOVDnop {
				continue
			}
			x4 := y4.Args[0]
			if x4.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x4.Args[2]
			if ptr != x4.Args[0] {
				continue
			}
			x4_1 := x4.Args[1]
			if x4_1.Op != OpARM64ADDconst || auxIntToInt64(x4_1.AuxInt) != 3 || idx != x4_1.Args[0] || mem != x4.Args[2] {
				continue
			}
			y5 := o1.Args[1]
			if y5.Op != OpARM64MOVDnop {
				continue
			}
			x5 := y5.Args[0]
			if x5.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x5.Args[2]
			if ptr != x5.Args[0] {
				continue
			}
			x5_1 := x5.Args[1]
			if x5_1.Op != OpARM64ADDconst || auxIntToInt64(x5_1.AuxInt) != 2 || idx != x5_1.Args[0] || mem != x5.Args[2] {
				continue
			}
			y6 := o0.Args[1]
			if y6.Op != OpARM64MOVDnop {
				continue
			}
			x6 := y6.Args[0]
			if x6.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x6.Args[2]
			if ptr != x6.Args[0] {
				continue
			}
			x6_1 := x6.Args[1]
			if x6_1.Op != OpARM64ADDconst || auxIntToInt64(x6_1.AuxInt) != 1 || idx != x6_1.Args[0] || mem != x6.Args[2] {
				continue
			}
			y7 := v_1
			if y7.Op != OpARM64MOVDnop {
				continue
			}
			x7 := y7.Args[0]
			if x7.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x7.Args[2]
			if ptr != x7.Args[0] || idx != x7.Args[1] || mem != x7.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
				continue
			}
			b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
			v0 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t)
			v.copyOf(v0)
			v0.AddArg3(ptr, idx, mem)
			return true
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem)))
	// cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
	// result: @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem))
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			s0 := o1.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUload {
				continue
			}
			i0 := auxIntToInt32(x0.AuxInt)
			s := auxToSym(x0.Aux)
			mem := x0.Args[1]
			p := x0.Args[0]
			y1 := o1.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUload {
				continue
			}
			i1 := auxIntToInt32(x1.AuxInt)
			if auxToSym(x1.Aux) != s {
				continue
			}
			_ = x1.Args[1]
			if p != x1.Args[0] || mem != x1.Args[1] {
				continue
			}
			y2 := o0.Args[1]
			if y2.Op != OpARM64MOVDnop {
				continue
			}
			x2 := y2.Args[0]
			if x2.Op != OpARM64MOVBUload {
				continue
			}
			i2 := auxIntToInt32(x2.AuxInt)
			if auxToSym(x2.Aux) != s {
				continue
			}
			_ = x2.Args[1]
			if p != x2.Args[0] || mem != x2.Args[1] {
				continue
			}
			y3 := v_1
			if y3.Op != OpARM64MOVDnop {
				continue
			}
			x3 := y3.Args[0]
			if x3.Op != OpARM64MOVBUload {
				continue
			}
			i3 := auxIntToInt32(x3.AuxInt)
			if auxToSym(x3.Aux) != s {
				continue
			}
			_ = x3.Args[1]
			if p != x3.Args[0] || mem != x3.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
				continue
			}
			b = mergePoint(b, x0, x1, x2, x3)
			v0 := b.NewValue0(x3.Pos, OpARM64REVW, t)
			v.copyOf(v0)
			v1 := b.NewValue0(x3.Pos, OpARM64MOVWUload, t)
			v1.Aux = symToAux(s)
			v2 := b.NewValue0(x3.Pos, OpOffPtr, p.Type)
			v2.AuxInt = int64ToAuxInt(int64(i0))
			v2.AddArg(p)
			v1.AddArg2(v2, mem)
			v0.AddArg(v1)
			return true
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem)))
	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
	// result: @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUloadidx <t> ptr0 idx0 mem))
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			s0 := o1.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUloadidx {
				continue
			}
			mem := x0.Args[2]
			ptr0 := x0.Args[0]
			idx0 := x0.Args[1]
			y1 := o1.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 1 {
				continue
			}
			s := auxToSym(x1.Aux)
			_ = x1.Args[1]
			p1 := x1.Args[0]
			if p1.Op != OpARM64ADD {
				continue
			}
			_ = p1.Args[1]
			p1_0 := p1.Args[0]
			p1_1 := p1.Args[1]
			for _i1 := 0; _i1 <= 1; _i1, p1_0, p1_1 = _i1+1, p1_1, p1_0 {
				ptr1 := p1_0
				idx1 := p1_1
				if mem != x1.Args[1] {
					continue
				}
				y2 := o0.Args[1]
				if y2.Op != OpARM64MOVDnop {
					continue
				}
				x2 := y2.Args[0]
				if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 2 || auxToSym(x2.Aux) != s {
					continue
				}
				_ = x2.Args[1]
				p := x2.Args[0]
				if mem != x2.Args[1] {
					continue
				}
				y3 := v_1
				if y3.Op != OpARM64MOVDnop {
					continue
				}
				x3 := y3.Args[0]
				if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 3 || auxToSym(x3.Aux) != s {
					continue
				}
				_ = x3.Args[1]
				if p != x3.Args[0] || mem != x3.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
					continue
				}
				b = mergePoint(b, x0, x1, x2, x3)
				v0 := b.NewValue0(x3.Pos, OpARM64REVW, t)
				v.copyOf(v0)
				v1 := b.NewValue0(x3.Pos, OpARM64MOVWUloadidx, t)
				v1.AddArg3(ptr0, idx0, mem)
				v0.AddArg(v1)
				return true
			}
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem)))
	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)
	// result: @mergePoint(b,x0,x1,x2,x3) (REVW <t> (MOVWUloadidx <t> ptr idx mem))
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			s0 := o1.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUloadidx {
				continue
			}
			mem := x0.Args[2]
			ptr := x0.Args[0]
			idx := x0.Args[1]
			y1 := o1.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x1.Args[2]
			if ptr != x1.Args[0] {
				continue
			}
			x1_1 := x1.Args[1]
			if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] {
				continue
			}
			y2 := o0.Args[1]
			if y2.Op != OpARM64MOVDnop {
				continue
			}
			x2 := y2.Args[0]
			if x2.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x2.Args[2]
			if ptr != x2.Args[0] {
				continue
			}
			x2_1 := x2.Args[1]
			if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] {
				continue
			}
			y3 := v_1
			if y3.Op != OpARM64MOVDnop {
				continue
			}
			x3 := y3.Args[0]
			if x3.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x3.Args[2]
			if ptr != x3.Args[0] {
				continue
			}
			x3_1 := x3.Args[1]
			if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0, x1, x2, x3, y0, y1, y2, y3, o0, o1, s0)) {
				continue
			}
			b = mergePoint(b, x0, x1, x2, x3)
			v0 := b.NewValue0(v.Pos, OpARM64REVW, t)
			v.copyOf(v0)
			v1 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t)
			v1.AddArg3(ptr, idx, mem)
			v0.AddArg(v1)
			return true
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i7] {s} p mem)))
	// cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDload <t> {s} (OffPtr <p.Type> [int64(i0)] p) mem))
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			o2 := o1.Args[0]
			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
				continue
			}
			_ = o2.Args[1]
			o3 := o2.Args[0]
			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
				continue
			}
			_ = o3.Args[1]
			o4 := o3.Args[0]
			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
				continue
			}
			_ = o4.Args[1]
			o5 := o4.Args[0]
			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
				continue
			}
			_ = o5.Args[1]
			s0 := o5.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUload {
				continue
			}
			i0 := auxIntToInt32(x0.AuxInt)
			s := auxToSym(x0.Aux)
			mem := x0.Args[1]
			p := x0.Args[0]
			y1 := o5.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUload {
				continue
			}
			i1 := auxIntToInt32(x1.AuxInt)
			if auxToSym(x1.Aux) != s {
				continue
			}
			_ = x1.Args[1]
			if p != x1.Args[0] || mem != x1.Args[1] {
				continue
			}
			y2 := o4.Args[1]
			if y2.Op != OpARM64MOVDnop {
				continue
			}
			x2 := y2.Args[0]
			if x2.Op != OpARM64MOVBUload {
				continue
			}
			i2 := auxIntToInt32(x2.AuxInt)
			if auxToSym(x2.Aux) != s {
				continue
			}
			_ = x2.Args[1]
			if p != x2.Args[0] || mem != x2.Args[1] {
				continue
			}
			y3 := o3.Args[1]
			if y3.Op != OpARM64MOVDnop {
				continue
			}
			x3 := y3.Args[0]
			if x3.Op != OpARM64MOVBUload {
				continue
			}
			i3 := auxIntToInt32(x3.AuxInt)
			if auxToSym(x3.Aux) != s {
				continue
			}
			_ = x3.Args[1]
			if p != x3.Args[0] || mem != x3.Args[1] {
				continue
			}
			y4 := o2.Args[1]
			if y4.Op != OpARM64MOVDnop {
				continue
			}
			x4 := y4.Args[0]
			if x4.Op != OpARM64MOVBUload {
				continue
			}
			i4 := auxIntToInt32(x4.AuxInt)
			if auxToSym(x4.Aux) != s {
				continue
			}
			_ = x4.Args[1]
			if p != x4.Args[0] || mem != x4.Args[1] {
				continue
			}
			y5 := o1.Args[1]
			if y5.Op != OpARM64MOVDnop {
				continue
			}
			x5 := y5.Args[0]
			if x5.Op != OpARM64MOVBUload {
				continue
			}
			i5 := auxIntToInt32(x5.AuxInt)
			if auxToSym(x5.Aux) != s {
				continue
			}
			_ = x5.Args[1]
			if p != x5.Args[0] || mem != x5.Args[1] {
				continue
			}
			y6 := o0.Args[1]
			if y6.Op != OpARM64MOVDnop {
				continue
			}
			x6 := y6.Args[0]
			if x6.Op != OpARM64MOVBUload {
				continue
			}
			i6 := auxIntToInt32(x6.AuxInt)
			if auxToSym(x6.Aux) != s {
				continue
			}
			_ = x6.Args[1]
			if p != x6.Args[0] || mem != x6.Args[1] {
				continue
			}
			y7 := v_1
			if y7.Op != OpARM64MOVDnop {
				continue
			}
			x7 := y7.Args[0]
			if x7.Op != OpARM64MOVBUload {
				continue
			}
			i7 := auxIntToInt32(x7.AuxInt)
			if auxToSym(x7.Aux) != s {
				continue
			}
			_ = x7.Args[1]
			if p != x7.Args[0] || mem != x7.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
				continue
			}
			b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
			v0 := b.NewValue0(x7.Pos, OpARM64REV, t)
			v.copyOf(v0)
			v1 := b.NewValue0(x7.Pos, OpARM64MOVDload, t)
			v1.Aux = symToAux(s)
			v2 := b.NewValue0(x7.Pos, OpOffPtr, p.Type)
			v2.AuxInt = int64ToAuxInt(int64(i0))
			v2.AddArg(p)
			v1.AddArg2(v2, mem)
			v0.AddArg(v1)
			return true
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [7] {s} p mem)))
	// cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDloadidx <t> ptr0 idx0 mem))
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			o2 := o1.Args[0]
			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
				continue
			}
			_ = o2.Args[1]
			o3 := o2.Args[0]
			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
				continue
			}
			_ = o3.Args[1]
			o4 := o3.Args[0]
			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
				continue
			}
			_ = o4.Args[1]
			o5 := o4.Args[0]
			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
				continue
			}
			_ = o5.Args[1]
			s0 := o5.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUloadidx {
				continue
			}
			mem := x0.Args[2]
			ptr0 := x0.Args[0]
			idx0 := x0.Args[1]
			y1 := o5.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 1 {
				continue
			}
			s := auxToSym(x1.Aux)
			_ = x1.Args[1]
			p1 := x1.Args[0]
			if p1.Op != OpARM64ADD {
				continue
			}
			_ = p1.Args[1]
			p1_0 := p1.Args[0]
			p1_1 := p1.Args[1]
			for _i1 := 0; _i1 <= 1; _i1, p1_0, p1_1 = _i1+1, p1_1, p1_0 {
				ptr1 := p1_0
				idx1 := p1_1
				if mem != x1.Args[1] {
					continue
				}
				y2 := o4.Args[1]
				if y2.Op != OpARM64MOVDnop {
					continue
				}
				x2 := y2.Args[0]
				if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 2 || auxToSym(x2.Aux) != s {
					continue
				}
				_ = x2.Args[1]
				p := x2.Args[0]
				if mem != x2.Args[1] {
					continue
				}
				y3 := o3.Args[1]
				if y3.Op != OpARM64MOVDnop {
					continue
				}
				x3 := y3.Args[0]
				if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 3 || auxToSym(x3.Aux) != s {
					continue
				}
				_ = x3.Args[1]
				if p != x3.Args[0] || mem != x3.Args[1] {
					continue
				}
				y4 := o2.Args[1]
				if y4.Op != OpARM64MOVDnop {
					continue
				}
				x4 := y4.Args[0]
				if x4.Op != OpARM64MOVBUload || auxIntToInt32(x4.AuxInt) != 4 || auxToSym(x4.Aux) != s {
					continue
				}
				_ = x4.Args[1]
				if p != x4.Args[0] || mem != x4.Args[1] {
					continue
				}
				y5 := o1.Args[1]
				if y5.Op != OpARM64MOVDnop {
					continue
				}
				x5 := y5.Args[0]
				if x5.Op != OpARM64MOVBUload || auxIntToInt32(x5.AuxInt) != 5 || auxToSym(x5.Aux) != s {
					continue
				}
				_ = x5.Args[1]
				if p != x5.Args[0] || mem != x5.Args[1] {
					continue
				}
				y6 := o0.Args[1]
				if y6.Op != OpARM64MOVDnop {
					continue
				}
				x6 := y6.Args[0]
				if x6.Op != OpARM64MOVBUload || auxIntToInt32(x6.AuxInt) != 6 || auxToSym(x6.Aux) != s {
					continue
				}
				_ = x6.Args[1]
				if p != x6.Args[0] || mem != x6.Args[1] {
					continue
				}
				y7 := v_1
				if y7.Op != OpARM64MOVDnop {
					continue
				}
				x7 := y7.Args[0]
				if x7.Op != OpARM64MOVBUload || auxIntToInt32(x7.AuxInt) != 7 || auxToSym(x7.Aux) != s {
					continue
				}
				_ = x7.Args[1]
				if p != x7.Args[0] || mem != x7.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
					continue
				}
				b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
				v0 := b.NewValue0(x7.Pos, OpARM64REV, t)
				v.copyOf(v0)
				v1 := b.NewValue0(x7.Pos, OpARM64MOVDloadidx, t)
				v1.AddArg3(ptr0, idx0, mem)
				v0.AddArg(v1)
				return true
			}
		}
		break
	}
	// match: (OR <t> o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr (ADDconst [7] idx) mem)))
	// cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)
	// result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV <t> (MOVDloadidx <t> ptr idx mem))
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			o0 := v_0
			if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 {
				continue
			}
			_ = o0.Args[1]
			o1 := o0.Args[0]
			if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 {
				continue
			}
			_ = o1.Args[1]
			o2 := o1.Args[0]
			if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 {
				continue
			}
			_ = o2.Args[1]
			o3 := o2.Args[0]
			if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 {
				continue
			}
			_ = o3.Args[1]
			o4 := o3.Args[0]
			if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 {
				continue
			}
			_ = o4.Args[1]
			o5 := o4.Args[0]
			if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 {
				continue
			}
			_ = o5.Args[1]
			s0 := o5.Args[0]
			if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 {
				continue
			}
			y0 := s0.Args[0]
			if y0.Op != OpARM64MOVDnop {
				continue
			}
			x0 := y0.Args[0]
			if x0.Op != OpARM64MOVBUloadidx {
				continue
			}
			mem := x0.Args[2]
			ptr := x0.Args[0]
			idx := x0.Args[1]
			y1 := o5.Args[1]
			if y1.Op != OpARM64MOVDnop {
				continue
			}
			x1 := y1.Args[0]
			if x1.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x1.Args[2]
			if ptr != x1.Args[0] {
				continue
			}
			x1_1 := x1.Args[1]
			if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] {
				continue
			}
			y2 := o4.Args[1]
			if y2.Op != OpARM64MOVDnop {
				continue
			}
			x2 := y2.Args[0]
			if x2.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x2.Args[2]
			if ptr != x2.Args[0] {
				continue
			}
			x2_1 := x2.Args[1]
			if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] {
				continue
			}
			y3 := o3.Args[1]
			if y3.Op != OpARM64MOVDnop {
				continue
			}
			x3 := y3.Args[0]
			if x3.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x3.Args[2]
			if ptr != x3.Args[0] {
				continue
			}
			x3_1 := x3.Args[1]
			if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] {
				continue
			}
			y4 := o2.Args[1]
			if y4.Op != OpARM64MOVDnop {
				continue
			}
			x4 := y4.Args[0]
			if x4.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x4.Args[2]
			if ptr != x4.Args[0] {
				continue
			}
			x4_1 := x4.Args[1]
			if x4_1.Op != OpARM64ADDconst || auxIntToInt64(x4_1.AuxInt) != 4 || idx != x4_1.Args[0] || mem != x4.Args[2] {
				continue
			}
			y5 := o1.Args[1]
			if y5.Op != OpARM64MOVDnop {
				continue
			}
			x5 := y5.Args[0]
			if x5.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x5.Args[2]
			if ptr != x5.Args[0] {
				continue
			}
			x5_1 := x5.Args[1]
			if x5_1.Op != OpARM64ADDconst || auxIntToInt64(x5_1.AuxInt) != 5 || idx != x5_1.Args[0] || mem != x5.Args[2] {
				continue
			}
			y6 := o0.Args[1]
			if y6.Op != OpARM64MOVDnop {
				continue
			}
			x6 := y6.Args[0]
			if x6.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x6.Args[2]
			if ptr != x6.Args[0] {
				continue
			}
			x6_1 := x6.Args[1]
			if x6_1.Op != OpARM64ADDconst || auxIntToInt64(x6_1.AuxInt) != 6 || idx != x6_1.Args[0] || mem != x6.Args[2] {
				continue
			}
			y7 := v_1
			if y7.Op != OpARM64MOVDnop {
				continue
			}
			x7 := y7.Args[0]
			if x7.Op != OpARM64MOVBUloadidx {
				continue
			}
			_ = x7.Args[2]
			if ptr != x7.Args[0] {
				continue
			}
			x7_1 := x7.Args[1]
			if x7_1.Op != OpARM64ADDconst || auxIntToInt64(x7_1.AuxInt) != 7 || idx != x7_1.Args[0] || mem != x7.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7, o0, o1, o2, o3, o4, o5, s0)) {
				continue
			}
			b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7)
			v0 := b.NewValue0(v.Pos, OpARM64REV, t)
			v.copyOf(v0)
			v1 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t)
			v1.AddArg3(ptr, idx, mem)
			v0.AddArg(v1)
			return true
		}
		break
	}
	return false
}