// autogenerated from gen/generic.rules: do not edit!
// generated with: cd gen; go run *.go
package ssa

import "math"

var _ = math.MinInt8 // in case not otherwise used
func rewriteValuegeneric(v *Value, config *Config) bool {
	switch v.Op {
	case OpAdd16:
		return rewriteValuegeneric_OpAdd16(v, config)
	case OpAdd32:
		return rewriteValuegeneric_OpAdd32(v, config)
	case OpAdd64:
		return rewriteValuegeneric_OpAdd64(v, config)
	case OpAdd8:
		return rewriteValuegeneric_OpAdd8(v, config)
	case OpAnd16:
		return rewriteValuegeneric_OpAnd16(v, config)
	case OpAnd32:
		return rewriteValuegeneric_OpAnd32(v, config)
	case OpAnd64:
		return rewriteValuegeneric_OpAnd64(v, config)
	case OpAnd8:
		return rewriteValuegeneric_OpAnd8(v, config)
	case OpArg:
		return rewriteValuegeneric_OpArg(v, config)
	case OpArrayIndex:
		return rewriteValuegeneric_OpArrayIndex(v, config)
	case OpCom16:
		return rewriteValuegeneric_OpCom16(v, config)
	case OpCom32:
		return rewriteValuegeneric_OpCom32(v, config)
	case OpCom64:
		return rewriteValuegeneric_OpCom64(v, config)
	case OpCom8:
		return rewriteValuegeneric_OpCom8(v, config)
	case OpComplexImag:
		return rewriteValuegeneric_OpComplexImag(v, config)
	case OpComplexReal:
		return rewriteValuegeneric_OpComplexReal(v, config)
	case OpConstInterface:
		return rewriteValuegeneric_OpConstInterface(v, config)
	case OpConstSlice:
		return rewriteValuegeneric_OpConstSlice(v, config)
	case OpConstString:
		return rewriteValuegeneric_OpConstString(v, config)
	case OpConvert:
		return rewriteValuegeneric_OpConvert(v, config)
	case OpEq16:
		return rewriteValuegeneric_OpEq16(v, config)
	case OpEq32:
		return rewriteValuegeneric_OpEq32(v, config)
	case OpEq64:
		return rewriteValuegeneric_OpEq64(v, config)
	case OpEq8:
		return rewriteValuegeneric_OpEq8(v, config)
	case OpEqInter:
		return rewriteValuegeneric_OpEqInter(v, config)
	case OpEqPtr:
		return rewriteValuegeneric_OpEqPtr(v, config)
	case OpEqSlice:
		return rewriteValuegeneric_OpEqSlice(v, config)
	case OpGeq16:
		return rewriteValuegeneric_OpGeq16(v, config)
	case OpGeq16U:
		return rewriteValuegeneric_OpGeq16U(v, config)
	case OpGeq32:
		return rewriteValuegeneric_OpGeq32(v, config)
	case OpGeq32U:
		return rewriteValuegeneric_OpGeq32U(v, config)
	case OpGeq64:
		return rewriteValuegeneric_OpGeq64(v, config)
	case OpGeq64U:
		return rewriteValuegeneric_OpGeq64U(v, config)
	case OpGeq8:
		return rewriteValuegeneric_OpGeq8(v, config)
	case OpGeq8U:
		return rewriteValuegeneric_OpGeq8U(v, config)
	case OpGreater16:
		return rewriteValuegeneric_OpGreater16(v, config)
	case OpGreater16U:
		return rewriteValuegeneric_OpGreater16U(v, config)
	case OpGreater32:
		return rewriteValuegeneric_OpGreater32(v, config)
	case OpGreater32U:
		return rewriteValuegeneric_OpGreater32U(v, config)
	case OpGreater64:
		return rewriteValuegeneric_OpGreater64(v, config)
	case OpGreater64U:
		return rewriteValuegeneric_OpGreater64U(v, config)
	case OpGreater8:
		return rewriteValuegeneric_OpGreater8(v, config)
	case OpGreater8U:
		return rewriteValuegeneric_OpGreater8U(v, config)
	case OpIData:
		return rewriteValuegeneric_OpIData(v, config)
	case OpITab:
		return rewriteValuegeneric_OpITab(v, config)
	case OpIsInBounds:
		return rewriteValuegeneric_OpIsInBounds(v, config)
	case OpIsSliceInBounds:
		return rewriteValuegeneric_OpIsSliceInBounds(v, config)
	case OpLeq16:
		return rewriteValuegeneric_OpLeq16(v, config)
	case OpLeq16U:
		return rewriteValuegeneric_OpLeq16U(v, config)
	case OpLeq32:
		return rewriteValuegeneric_OpLeq32(v, config)
	case OpLeq32U:
		return rewriteValuegeneric_OpLeq32U(v, config)
	case OpLeq64:
		return rewriteValuegeneric_OpLeq64(v, config)
	case OpLeq64U:
		return rewriteValuegeneric_OpLeq64U(v, config)
	case OpLeq8:
		return rewriteValuegeneric_OpLeq8(v, config)
	case OpLeq8U:
		return rewriteValuegeneric_OpLeq8U(v, config)
	case OpLess16:
		return rewriteValuegeneric_OpLess16(v, config)
	case OpLess16U:
		return rewriteValuegeneric_OpLess16U(v, config)
	case OpLess32:
		return rewriteValuegeneric_OpLess32(v, config)
	case OpLess32U:
		return rewriteValuegeneric_OpLess32U(v, config)
	case OpLess64:
		return rewriteValuegeneric_OpLess64(v, config)
	case OpLess64U:
		return rewriteValuegeneric_OpLess64U(v, config)
	case OpLess8:
		return rewriteValuegeneric_OpLess8(v, config)
	case OpLess8U:
		return rewriteValuegeneric_OpLess8U(v, config)
	case OpLoad:
		return rewriteValuegeneric_OpLoad(v, config)
	case OpLsh16x16:
		return rewriteValuegeneric_OpLsh16x16(v, config)
	case OpLsh16x32:
		return rewriteValuegeneric_OpLsh16x32(v, config)
	case OpLsh16x64:
		return rewriteValuegeneric_OpLsh16x64(v, config)
	case OpLsh16x8:
		return rewriteValuegeneric_OpLsh16x8(v, config)
	case OpLsh32x16:
		return rewriteValuegeneric_OpLsh32x16(v, config)
	case OpLsh32x32:
		return rewriteValuegeneric_OpLsh32x32(v, config)
	case OpLsh32x64:
		return rewriteValuegeneric_OpLsh32x64(v, config)
	case OpLsh32x8:
		return rewriteValuegeneric_OpLsh32x8(v, config)
	case OpLsh64x16:
		return rewriteValuegeneric_OpLsh64x16(v, config)
	case OpLsh64x32:
		return rewriteValuegeneric_OpLsh64x32(v, config)
	case OpLsh64x64:
		return rewriteValuegeneric_OpLsh64x64(v, config)
	case OpLsh64x8:
		return rewriteValuegeneric_OpLsh64x8(v, config)
	case OpLsh8x16:
		return rewriteValuegeneric_OpLsh8x16(v, config)
	case OpLsh8x32:
		return rewriteValuegeneric_OpLsh8x32(v, config)
	case OpLsh8x64:
		return rewriteValuegeneric_OpLsh8x64(v, config)
	case OpLsh8x8:
		return rewriteValuegeneric_OpLsh8x8(v, config)
	case OpMul16:
		return rewriteValuegeneric_OpMul16(v, config)
	case OpMul32:
		return rewriteValuegeneric_OpMul32(v, config)
	case OpMul64:
		return rewriteValuegeneric_OpMul64(v, config)
	case OpMul8:
		return rewriteValuegeneric_OpMul8(v, config)
	case OpNeq16:
		return rewriteValuegeneric_OpNeq16(v, config)
	case OpNeq32:
		return rewriteValuegeneric_OpNeq32(v, config)
	case OpNeq64:
		return rewriteValuegeneric_OpNeq64(v, config)
	case OpNeq8:
		return rewriteValuegeneric_OpNeq8(v, config)
	case OpNeqInter:
		return rewriteValuegeneric_OpNeqInter(v, config)
	case OpNeqPtr:
		return rewriteValuegeneric_OpNeqPtr(v, config)
	case OpNeqSlice:
		return rewriteValuegeneric_OpNeqSlice(v, config)
	case OpOr16:
		return rewriteValuegeneric_OpOr16(v, config)
	case OpOr32:
		return rewriteValuegeneric_OpOr32(v, config)
	case OpOr64:
		return rewriteValuegeneric_OpOr64(v, config)
	case OpOr8:
		return rewriteValuegeneric_OpOr8(v, config)
	case OpPtrIndex:
		return rewriteValuegeneric_OpPtrIndex(v, config)
	case OpRsh16Ux16:
		return rewriteValuegeneric_OpRsh16Ux16(v, config)
	case OpRsh16Ux32:
		return rewriteValuegeneric_OpRsh16Ux32(v, config)
	case OpRsh16Ux64:
		return rewriteValuegeneric_OpRsh16Ux64(v, config)
	case OpRsh16Ux8:
		return rewriteValuegeneric_OpRsh16Ux8(v, config)
	case OpRsh16x16:
		return rewriteValuegeneric_OpRsh16x16(v, config)
	case OpRsh16x32:
		return rewriteValuegeneric_OpRsh16x32(v, config)
	case OpRsh16x64:
		return rewriteValuegeneric_OpRsh16x64(v, config)
	case OpRsh16x8:
		return rewriteValuegeneric_OpRsh16x8(v, config)
	case OpRsh32Ux16:
		return rewriteValuegeneric_OpRsh32Ux16(v, config)
	case OpRsh32Ux32:
		return rewriteValuegeneric_OpRsh32Ux32(v, config)
	case OpRsh32Ux64:
		return rewriteValuegeneric_OpRsh32Ux64(v, config)
	case OpRsh32Ux8:
		return rewriteValuegeneric_OpRsh32Ux8(v, config)
	case OpRsh32x16:
		return rewriteValuegeneric_OpRsh32x16(v, config)
	case OpRsh32x32:
		return rewriteValuegeneric_OpRsh32x32(v, config)
	case OpRsh32x64:
		return rewriteValuegeneric_OpRsh32x64(v, config)
	case OpRsh32x8:
		return rewriteValuegeneric_OpRsh32x8(v, config)
	case OpRsh64Ux16:
		return rewriteValuegeneric_OpRsh64Ux16(v, config)
	case OpRsh64Ux32:
		return rewriteValuegeneric_OpRsh64Ux32(v, config)
	case OpRsh64Ux64:
		return rewriteValuegeneric_OpRsh64Ux64(v, config)
	case OpRsh64Ux8:
		return rewriteValuegeneric_OpRsh64Ux8(v, config)
	case OpRsh64x16:
		return rewriteValuegeneric_OpRsh64x16(v, config)
	case OpRsh64x32:
		return rewriteValuegeneric_OpRsh64x32(v, config)
	case OpRsh64x64:
		return rewriteValuegeneric_OpRsh64x64(v, config)
	case OpRsh64x8:
		return rewriteValuegeneric_OpRsh64x8(v, config)
	case OpRsh8Ux16:
		return rewriteValuegeneric_OpRsh8Ux16(v, config)
	case OpRsh8Ux32:
		return rewriteValuegeneric_OpRsh8Ux32(v, config)
	case OpRsh8Ux64:
		return rewriteValuegeneric_OpRsh8Ux64(v, config)
	case OpRsh8Ux8:
		return rewriteValuegeneric_OpRsh8Ux8(v, config)
	case OpRsh8x16:
		return rewriteValuegeneric_OpRsh8x16(v, config)
	case OpRsh8x32:
		return rewriteValuegeneric_OpRsh8x32(v, config)
	case OpRsh8x64:
		return rewriteValuegeneric_OpRsh8x64(v, config)
	case OpRsh8x8:
		return rewriteValuegeneric_OpRsh8x8(v, config)
	case OpSliceCap:
		return rewriteValuegeneric_OpSliceCap(v, config)
	case OpSliceLen:
		return rewriteValuegeneric_OpSliceLen(v, config)
	case OpSlicePtr:
		return rewriteValuegeneric_OpSlicePtr(v, config)
	case OpStore:
		return rewriteValuegeneric_OpStore(v, config)
	case OpStringLen:
		return rewriteValuegeneric_OpStringLen(v, config)
	case OpStringPtr:
		return rewriteValuegeneric_OpStringPtr(v, config)
	case OpStructSelect:
		return rewriteValuegeneric_OpStructSelect(v, config)
	case OpSub16:
		return rewriteValuegeneric_OpSub16(v, config)
	case OpSub32:
		return rewriteValuegeneric_OpSub32(v, config)
	case OpSub64:
		return rewriteValuegeneric_OpSub64(v, config)
	case OpSub8:
		return rewriteValuegeneric_OpSub8(v, config)
	case OpXor16:
		return rewriteValuegeneric_OpXor16(v, config)
	case OpXor32:
		return rewriteValuegeneric_OpXor32(v, config)
	case OpXor64:
		return rewriteValuegeneric_OpXor64(v, config)
	case OpXor8:
		return rewriteValuegeneric_OpXor8(v, config)
	}
	return false
}
func rewriteValuegeneric_OpAdd16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Add16 (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (Const16 [c+d])
	{
		if v.Args[0].Op != OpConst16 {
			goto end359c546ef662b7990116329cb30d6892
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto end359c546ef662b7990116329cb30d6892
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c + d
		return true
	}
	goto end359c546ef662b7990116329cb30d6892
end359c546ef662b7990116329cb30d6892:
	;
	// match: (Add16 x (Const16 <t> [c]))
	// cond: x.Op != OpConst16
	// result: (Add16 (Const16 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end89b69a89778f375b0ebbc683b0c63176
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst16) {
			goto end89b69a89778f375b0ebbc683b0c63176
		}
		v.Op = OpAdd16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst16, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end89b69a89778f375b0ebbc683b0c63176
end89b69a89778f375b0ebbc683b0c63176:
	;
	return false
}
func rewriteValuegeneric_OpAdd32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Add32 (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (Const32 [c+d])
	{
		if v.Args[0].Op != OpConst32 {
			goto enda3edaa9a512bd1d7a95f002c890bfb88
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto enda3edaa9a512bd1d7a95f002c890bfb88
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c + d
		return true
	}
	goto enda3edaa9a512bd1d7a95f002c890bfb88
enda3edaa9a512bd1d7a95f002c890bfb88:
	;
	// match: (Add32 x (Const32 <t> [c]))
	// cond: x.Op != OpConst32
	// result: (Add32 (Const32 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto end28a8c474bfa6968950dce0ed73b14a0b
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst32) {
			goto end28a8c474bfa6968950dce0ed73b14a0b
		}
		v.Op = OpAdd32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst32, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end28a8c474bfa6968950dce0ed73b14a0b
end28a8c474bfa6968950dce0ed73b14a0b:
	;
	return false
}
func rewriteValuegeneric_OpAdd64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Add64 (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (Const64 [c+d])
	{
		if v.Args[0].Op != OpConst64 {
			goto end8c46df6f85a11cb1d594076b0e467908
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end8c46df6f85a11cb1d594076b0e467908
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c + d
		return true
	}
	goto end8c46df6f85a11cb1d594076b0e467908
end8c46df6f85a11cb1d594076b0e467908:
	;
	// match: (Add64 x (Const64 <t> [c]))
	// cond: x.Op != OpConst64
	// result: (Add64 (Const64 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end39caa6cf1044f5c47ddbeb062d1a13bd
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst64) {
			goto end39caa6cf1044f5c47ddbeb062d1a13bd
		}
		v.Op = OpAdd64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end39caa6cf1044f5c47ddbeb062d1a13bd
end39caa6cf1044f5c47ddbeb062d1a13bd:
	;
	return false
}
func rewriteValuegeneric_OpAdd8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Add8 (Const8 [c]) (Const8 [d]))
	// cond:
	// result: (Const8 [c+d])
	{
		if v.Args[0].Op != OpConst8 {
			goto end60c66721511a442aade8e4da2fb326bd
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto end60c66721511a442aade8e4da2fb326bd
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c + d
		return true
	}
	goto end60c66721511a442aade8e4da2fb326bd
end60c66721511a442aade8e4da2fb326bd:
	;
	// match: (Add8 x (Const8 <t> [c]))
	// cond: x.Op != OpConst8
	// result: (Add8 (Const8 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end8c2901b8d12fa5c37f190783b4db8df5
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst8) {
			goto end8c2901b8d12fa5c37f190783b4db8df5
		}
		v.Op = OpAdd8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst8, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end8c2901b8d12fa5c37f190783b4db8df5
end8c2901b8d12fa5c37f190783b4db8df5:
	;
	return false
}
func rewriteValuegeneric_OpAnd16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (And16 x x)
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end69ed6ee2a4fb0491b56c17f3c1926b10
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end69ed6ee2a4fb0491b56c17f3c1926b10
end69ed6ee2a4fb0491b56c17f3c1926b10:
	;
	return false
}
func rewriteValuegeneric_OpAnd32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (And32 x x)
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto endbbe8c3c5b2ca8f013aa178d856f3a99c
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto endbbe8c3c5b2ca8f013aa178d856f3a99c
endbbe8c3c5b2ca8f013aa178d856f3a99c:
	;
	return false
}
func rewriteValuegeneric_OpAnd64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (And64 x x)
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto endc9736bf24d2e5cd8d662e1bcf3164640
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto endc9736bf24d2e5cd8d662e1bcf3164640
endc9736bf24d2e5cd8d662e1bcf3164640:
	;
	return false
}
func rewriteValuegeneric_OpAnd8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (And8 x x)
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto endeaf127389bd0d4b0e0e297830f8f463b
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto endeaf127389bd0d4b0e0e297830f8f463b
endeaf127389bd0d4b0e0e297830f8f463b:
	;
	return false
}
func rewriteValuegeneric_OpArg(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Arg {n} [off])
	// cond: v.Type.IsString()
	// result: (StringMake     (Arg <config.fe.TypeBytePtr()> {n} [off])     (Arg <config.fe.TypeInt()> {n} [off+config.PtrSize]))
	{
		n := v.Aux
		off := v.AuxInt
		if !(v.Type.IsString()) {
			goto end939d3f946bf61eb85b46b374e7afa9e9
		}
		v.Op = OpStringMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
		v0.Aux = n
		v0.AuxInt = off
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeInt())
		v1.Aux = n
		v1.AuxInt = off + config.PtrSize
		v.AddArg(v1)
		return true
	}
	goto end939d3f946bf61eb85b46b374e7afa9e9
end939d3f946bf61eb85b46b374e7afa9e9:
	;
	// match: (Arg {n} [off])
	// cond: v.Type.IsSlice()
	// result: (SliceMake     (Arg <config.fe.TypeBytePtr()> {n} [off])     (Arg <config.fe.TypeInt()> {n} [off+config.PtrSize])     (Arg <config.fe.TypeInt()> {n} [off+2*config.PtrSize]))
	{
		n := v.Aux
		off := v.AuxInt
		if !(v.Type.IsSlice()) {
			goto endab4b93ad3b1cf55e5bf25d1fd9cd498e
		}
		v.Op = OpSliceMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
		v0.Aux = n
		v0.AuxInt = off
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeInt())
		v1.Aux = n
		v1.AuxInt = off + config.PtrSize
		v.AddArg(v1)
		v2 := b.NewValue0(v.Line, OpArg, config.fe.TypeInt())
		v2.Aux = n
		v2.AuxInt = off + 2*config.PtrSize
		v.AddArg(v2)
		return true
	}
	goto endab4b93ad3b1cf55e5bf25d1fd9cd498e
endab4b93ad3b1cf55e5bf25d1fd9cd498e:
	;
	// match: (Arg {n} [off])
	// cond: v.Type.IsInterface()
	// result: (IMake     (Arg <config.fe.TypeBytePtr()> {n} [off])     (Arg <config.fe.TypeBytePtr()> {n} [off+config.PtrSize]))
	{
		n := v.Aux
		off := v.AuxInt
		if !(v.Type.IsInterface()) {
			goto end851de8e588a39e81b4e2aef06566bf3e
		}
		v.Op = OpIMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
		v0.Aux = n
		v0.AuxInt = off
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
		v1.Aux = n
		v1.AuxInt = off + config.PtrSize
		v.AddArg(v1)
		return true
	}
	goto end851de8e588a39e81b4e2aef06566bf3e
end851de8e588a39e81b4e2aef06566bf3e:
	;
	// match: (Arg {n} [off])
	// cond: v.Type.IsComplex() && v.Type.Size() == 16
	// result: (ComplexMake     (Arg <config.fe.TypeFloat64()> {n} [off])     (Arg <config.fe.TypeFloat64()> {n} [off+8]))
	{
		n := v.Aux
		off := v.AuxInt
		if !(v.Type.IsComplex() && v.Type.Size() == 16) {
			goto end0988fc6a62c810b2f4976cb6cf44387f
		}
		v.Op = OpComplexMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat64())
		v0.Aux = n
		v0.AuxInt = off
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat64())
		v1.Aux = n
		v1.AuxInt = off + 8
		v.AddArg(v1)
		return true
	}
	goto end0988fc6a62c810b2f4976cb6cf44387f
end0988fc6a62c810b2f4976cb6cf44387f:
	;
	// match: (Arg {n} [off])
	// cond: v.Type.IsComplex() && v.Type.Size() == 8
	// result: (ComplexMake     (Arg <config.fe.TypeFloat32()> {n} [off])     (Arg <config.fe.TypeFloat32()> {n} [off+4]))
	{
		n := v.Aux
		off := v.AuxInt
		if !(v.Type.IsComplex() && v.Type.Size() == 8) {
			goto enda348e93e0036873dd7089a2939c22e3e
		}
		v.Op = OpComplexMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat32())
		v0.Aux = n
		v0.AuxInt = off
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat32())
		v1.Aux = n
		v1.AuxInt = off + 4
		v.AddArg(v1)
		return true
	}
	goto enda348e93e0036873dd7089a2939c22e3e
enda348e93e0036873dd7089a2939c22e3e:
	;
	// match: (Arg <t>)
	// cond: t.IsStruct() && t.NumFields() == 0 && config.fe.CanSSA(t)
	// result: (StructMake0)
	{
		t := v.Type
		if !(t.IsStruct() && t.NumFields() == 0 && config.fe.CanSSA(t)) {
			goto ende233eeefa826638b0e541bcca531d701
		}
		v.Op = OpStructMake0
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		return true
	}
	goto ende233eeefa826638b0e541bcca531d701
ende233eeefa826638b0e541bcca531d701:
	;
	// match: (Arg <t> {n} [off])
	// cond: t.IsStruct() && t.NumFields() == 1 && config.fe.CanSSA(t)
	// result: (StructMake1     (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]))
	{
		t := v.Type
		n := v.Aux
		off := v.AuxInt
		if !(t.IsStruct() && t.NumFields() == 1 && config.fe.CanSSA(t)) {
			goto ende953e77a0617051dd3f7ad4d58c9ab37
		}
		v.Op = OpStructMake1
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
		v0.Aux = n
		v0.AuxInt = off + t.FieldOff(0)
		v.AddArg(v0)
		return true
	}
	goto ende953e77a0617051dd3f7ad4d58c9ab37
ende953e77a0617051dd3f7ad4d58c9ab37:
	;
	// match: (Arg <t> {n} [off])
	// cond: t.IsStruct() && t.NumFields() == 2 && config.fe.CanSSA(t)
	// result: (StructMake2     (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])     (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)]))
	{
		t := v.Type
		n := v.Aux
		off := v.AuxInt
		if !(t.IsStruct() && t.NumFields() == 2 && config.fe.CanSSA(t)) {
			goto end9a008048978aabad9de0723212e60631
		}
		v.Op = OpStructMake2
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
		v0.Aux = n
		v0.AuxInt = off + t.FieldOff(0)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpArg, t.FieldType(1))
		v1.Aux = n
		v1.AuxInt = off + t.FieldOff(1)
		v.AddArg(v1)
		return true
	}
	goto end9a008048978aabad9de0723212e60631
end9a008048978aabad9de0723212e60631:
	;
	// match: (Arg <t> {n} [off])
	// cond: t.IsStruct() && t.NumFields() == 3 && config.fe.CanSSA(t)
	// result: (StructMake3     (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])     (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])     (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)]))
	{
		t := v.Type
		n := v.Aux
		off := v.AuxInt
		if !(t.IsStruct() && t.NumFields() == 3 && config.fe.CanSSA(t)) {
			goto end0196e61dbeebc6402f3aa1e9a182210b
		}
		v.Op = OpStructMake3
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
		v0.Aux = n
		v0.AuxInt = off + t.FieldOff(0)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpArg, t.FieldType(1))
		v1.Aux = n
		v1.AuxInt = off + t.FieldOff(1)
		v.AddArg(v1)
		v2 := b.NewValue0(v.Line, OpArg, t.FieldType(2))
		v2.Aux = n
		v2.AuxInt = off + t.FieldOff(2)
		v.AddArg(v2)
		return true
	}
	goto end0196e61dbeebc6402f3aa1e9a182210b
end0196e61dbeebc6402f3aa1e9a182210b:
	;
	// match: (Arg <t> {n} [off])
	// cond: t.IsStruct() && t.NumFields() == 4 && config.fe.CanSSA(t)
	// result: (StructMake4     (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])     (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])     (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)])     (Arg <t.FieldType(3)> {n} [off+t.FieldOff(3)]))
	{
		t := v.Type
		n := v.Aux
		off := v.AuxInt
		if !(t.IsStruct() && t.NumFields() == 4 && config.fe.CanSSA(t)) {
			goto end6bc133c93e50cb14c2e6cc9401850738
		}
		v.Op = OpStructMake4
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
		v0.Aux = n
		v0.AuxInt = off + t.FieldOff(0)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpArg, t.FieldType(1))
		v1.Aux = n
		v1.AuxInt = off + t.FieldOff(1)
		v.AddArg(v1)
		v2 := b.NewValue0(v.Line, OpArg, t.FieldType(2))
		v2.Aux = n
		v2.AuxInt = off + t.FieldOff(2)
		v.AddArg(v2)
		v3 := b.NewValue0(v.Line, OpArg, t.FieldType(3))
		v3.Aux = n
		v3.AuxInt = off + t.FieldOff(3)
		v.AddArg(v3)
		return true
	}
	goto end6bc133c93e50cb14c2e6cc9401850738
end6bc133c93e50cb14c2e6cc9401850738:
	;
	return false
}
func rewriteValuegeneric_OpArrayIndex(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (ArrayIndex (Load ptr mem) idx)
	// cond: b == v.Args[0].Block
	// result: (Load (PtrIndex <v.Type.PtrTo()> ptr idx) mem)
	{
		if v.Args[0].Op != OpLoad {
			goto end68b373270d9d605c420497edefaa71df
		}
		ptr := v.Args[0].Args[0]
		mem := v.Args[0].Args[1]
		idx := v.Args[1]
		if !(b == v.Args[0].Block) {
			goto end68b373270d9d605c420497edefaa71df
		}
		v.Op = OpLoad
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpPtrIndex, v.Type.PtrTo())
		v0.AddArg(ptr)
		v0.AddArg(idx)
		v.AddArg(v0)
		v.AddArg(mem)
		return true
	}
	goto end68b373270d9d605c420497edefaa71df
end68b373270d9d605c420497edefaa71df:
	;
	return false
}
func rewriteValuegeneric_OpCom16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Com16 (Com16 x))
	// cond:
	// result: x
	{
		if v.Args[0].Op != OpCom16 {
			goto end1ea17710dd4dd7ba4e710e0e4c7b5a56
		}
		x := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end1ea17710dd4dd7ba4e710e0e4c7b5a56
end1ea17710dd4dd7ba4e710e0e4c7b5a56:
	;
	return false
}
func rewriteValuegeneric_OpCom32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Com32 (Com32 x))
	// cond:
	// result: x
	{
		if v.Args[0].Op != OpCom32 {
			goto end9a04ed536496e292c27bef4414128cbf
		}
		x := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end9a04ed536496e292c27bef4414128cbf
end9a04ed536496e292c27bef4414128cbf:
	;
	return false
}
func rewriteValuegeneric_OpCom64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Com64 (Com64 x))
	// cond:
	// result: x
	{
		if v.Args[0].Op != OpCom64 {
			goto ended44e29d5968f0f7b86972b7bf417ab3
		}
		x := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto ended44e29d5968f0f7b86972b7bf417ab3
ended44e29d5968f0f7b86972b7bf417ab3:
	;
	return false
}
func rewriteValuegeneric_OpCom8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Com8 (Com8 x))
	// cond:
	// result: x
	{
		if v.Args[0].Op != OpCom8 {
			goto end4d92ff3ba567d9afd38fc9ca113602ad
		}
		x := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end4d92ff3ba567d9afd38fc9ca113602ad
end4d92ff3ba567d9afd38fc9ca113602ad:
	;
	return false
}
func rewriteValuegeneric_OpComplexImag(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (ComplexImag (ComplexMake _ imag ))
	// cond:
	// result: imag
	{
		if v.Args[0].Op != OpComplexMake {
			goto endec3009fd8727d03002021997936e091f
		}
		imag := v.Args[0].Args[1]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = imag.Type
		v.AddArg(imag)
		return true
	}
	goto endec3009fd8727d03002021997936e091f
endec3009fd8727d03002021997936e091f:
	;
	return false
}
func rewriteValuegeneric_OpComplexReal(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (ComplexReal (ComplexMake real _  ))
	// cond:
	// result: real
	{
		if v.Args[0].Op != OpComplexMake {
			goto end8db3e16bd59af1adaa4b734c8adcc71d
		}
		real := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = real.Type
		v.AddArg(real)
		return true
	}
	goto end8db3e16bd59af1adaa4b734c8adcc71d
end8db3e16bd59af1adaa4b734c8adcc71d:
	;
	return false
}
func rewriteValuegeneric_OpConstInterface(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (ConstInterface)
	// cond:
	// result: (IMake     (ConstNil <config.fe.TypeBytePtr()>)     (ConstNil <config.fe.TypeBytePtr()>))
	{
		v.Op = OpIMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
		v.AddArg(v1)
		return true
	}
	goto end0367bd8f20a320cc41568f2b28657f6b
end0367bd8f20a320cc41568f2b28657f6b:
	;
	return false
}
func rewriteValuegeneric_OpConstSlice(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (ConstSlice)
	// cond: config.PtrSize == 4
	// result: (SliceMake     (ConstNil <config.fe.TypeBytePtr()>)     (Const32 <config.fe.TypeInt()> [0])     (Const32 <config.fe.TypeInt()> [0]))
	{
		if !(config.PtrSize == 4) {
			goto end9ba6baf9c7247b1f5ba4099c0c3910ce
		}
		v.Op = OpSliceMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
		v1.AuxInt = 0
		v.AddArg(v1)
		v2 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
		v2.AuxInt = 0
		v.AddArg(v2)
		return true
	}
	goto end9ba6baf9c7247b1f5ba4099c0c3910ce
end9ba6baf9c7247b1f5ba4099c0c3910ce:
	;
	// match: (ConstSlice)
	// cond: config.PtrSize == 8
	// result: (SliceMake     (ConstNil <config.fe.TypeBytePtr()>)     (Const64 <config.fe.TypeInt()> [0])     (Const64 <config.fe.TypeInt()> [0]))
	{
		if !(config.PtrSize == 8) {
			goto endabee2aa6bd3e3261628f677221ad2640
		}
		v.Op = OpSliceMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
		v1.AuxInt = 0
		v.AddArg(v1)
		v2 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
		v2.AuxInt = 0
		v.AddArg(v2)
		return true
	}
	goto endabee2aa6bd3e3261628f677221ad2640
endabee2aa6bd3e3261628f677221ad2640:
	;
	return false
}
func rewriteValuegeneric_OpConstString(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (ConstString {s})
	// cond: config.PtrSize == 4 && s.(string) == ""
	// result: (StringMake (ConstNil) (Const32 <config.fe.TypeInt()> [0]))
	{
		s := v.Aux
		if !(config.PtrSize == 4 && s.(string) == "") {
			goto end85d5f388ba947643af63cdc68c1155a5
		}
		v.Op = OpStringMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
		v1.AuxInt = 0
		v.AddArg(v1)
		return true
	}
	goto end85d5f388ba947643af63cdc68c1155a5
end85d5f388ba947643af63cdc68c1155a5:
	;
	// match: (ConstString {s})
	// cond: config.PtrSize == 8 && s.(string) == ""
	// result: (StringMake (ConstNil) (Const64 <config.fe.TypeInt()> [0]))
	{
		s := v.Aux
		if !(config.PtrSize == 8 && s.(string) == "") {
			goto endc807259a5ed2760fbbd3dc7386641343
		}
		v.Op = OpStringMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
		v1.AuxInt = 0
		v.AddArg(v1)
		return true
	}
	goto endc807259a5ed2760fbbd3dc7386641343
endc807259a5ed2760fbbd3dc7386641343:
	;
	// match: (ConstString {s})
	// cond: config.PtrSize == 4 && s.(string) != ""
	// result: (StringMake     (Addr <config.fe.TypeBytePtr()> {config.fe.StringData(s.(string))}       (SB))     (Const32 <config.fe.TypeInt()> [int64(len(s.(string)))]))
	{
		s := v.Aux
		if !(config.PtrSize == 4 && s.(string) != "") {
			goto end107a700a4519d18f418602421444ddb6
		}
		v.Op = OpStringMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpAddr, config.fe.TypeBytePtr())
		v0.Aux = config.fe.StringData(s.(string))
		v1 := b.NewValue0(v.Line, OpSB, config.fe.TypeUintptr())
		v0.AddArg(v1)
		v.AddArg(v0)
		v2 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
		v2.AuxInt = int64(len(s.(string)))
		v.AddArg(v2)
		return true
	}
	goto end107a700a4519d18f418602421444ddb6
end107a700a4519d18f418602421444ddb6:
	;
	// match: (ConstString {s})
	// cond: config.PtrSize == 8 && s.(string) != ""
	// result: (StringMake     (Addr <config.fe.TypeBytePtr()> {config.fe.StringData(s.(string))}       (SB))     (Const64 <config.fe.TypeInt()> [int64(len(s.(string)))]))
	{
		s := v.Aux
		if !(config.PtrSize == 8 && s.(string) != "") {
			goto end7ce9db29d17866f26d21e6e12f442e54
		}
		v.Op = OpStringMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpAddr, config.fe.TypeBytePtr())
		v0.Aux = config.fe.StringData(s.(string))
		v1 := b.NewValue0(v.Line, OpSB, config.fe.TypeUintptr())
		v0.AddArg(v1)
		v.AddArg(v0)
		v2 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
		v2.AuxInt = int64(len(s.(string)))
		v.AddArg(v2)
		return true
	}
	goto end7ce9db29d17866f26d21e6e12f442e54
end7ce9db29d17866f26d21e6e12f442e54:
	;
	return false
}
func rewriteValuegeneric_OpConvert(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Convert (Add64 (Convert ptr mem) off) mem)
	// cond:
	// result: (Add64 ptr off)
	{
		if v.Args[0].Op != OpAdd64 {
			goto endbbc9f1666b4d39a130e1b86f109e7c1b
		}
		if v.Args[0].Args[0].Op != OpConvert {
			goto endbbc9f1666b4d39a130e1b86f109e7c1b
		}
		ptr := v.Args[0].Args[0].Args[0]
		mem := v.Args[0].Args[0].Args[1]
		off := v.Args[0].Args[1]
		if v.Args[1] != mem {
			goto endbbc9f1666b4d39a130e1b86f109e7c1b
		}
		v.Op = OpAdd64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(ptr)
		v.AddArg(off)
		return true
	}
	goto endbbc9f1666b4d39a130e1b86f109e7c1b
endbbc9f1666b4d39a130e1b86f109e7c1b:
	;
	// match: (Convert (Convert ptr mem) mem)
	// cond:
	// result: ptr
	{
		if v.Args[0].Op != OpConvert {
			goto end98c5e0ca257eb216989171786f91b42d
		}
		ptr := v.Args[0].Args[0]
		mem := v.Args[0].Args[1]
		if v.Args[1] != mem {
			goto end98c5e0ca257eb216989171786f91b42d
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = ptr.Type
		v.AddArg(ptr)
		return true
	}
	goto end98c5e0ca257eb216989171786f91b42d
end98c5e0ca257eb216989171786f91b42d:
	;
	return false
}
func rewriteValuegeneric_OpEq16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Eq16 x x)
	// cond:
	// result: (ConstBool [1])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end0c0fe5fdfba3821add3448fd3f1fc6b7
		}
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 1
		return true
	}
	goto end0c0fe5fdfba3821add3448fd3f1fc6b7
end0c0fe5fdfba3821add3448fd3f1fc6b7:
	;
	// match: (Eq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x))
	// cond:
	// result: (Eq16 (Const16 <t> [c-d]) x)
	{
		if v.Args[0].Op != OpConst16 {
			goto end79c830afa265161fc0f0532c4c4e7f50
		}
		t := v.Args[0].Type
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpAdd16 {
			goto end79c830afa265161fc0f0532c4c4e7f50
		}
		if v.Args[1].Args[0].Op != OpConst16 {
			goto end79c830afa265161fc0f0532c4c4e7f50
		}
		if v.Args[1].Args[0].Type != v.Args[0].Type {
			goto end79c830afa265161fc0f0532c4c4e7f50
		}
		d := v.Args[1].Args[0].AuxInt
		x := v.Args[1].Args[1]
		v.Op = OpEq16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst16, t)
		v0.AuxInt = c - d
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end79c830afa265161fc0f0532c4c4e7f50
end79c830afa265161fc0f0532c4c4e7f50:
	;
	// match: (Eq16 x (Const16 <t> [c]))
	// cond: x.Op != OpConst16
	// result: (Eq16 (Const16 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end5d89fe1eeb145f14e11578f41282c904
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst16) {
			goto end5d89fe1eeb145f14e11578f41282c904
		}
		v.Op = OpEq16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst16, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end5d89fe1eeb145f14e11578f41282c904
end5d89fe1eeb145f14e11578f41282c904:
	;
	// match: (Eq16 (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (ConstBool [b2i(int16(c) == int16(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto end4532e1d01c10d8906fe1da14f9dfaa88
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto end4532e1d01c10d8906fe1da14f9dfaa88
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int16(c) == int16(d))
		return true
	}
	goto end4532e1d01c10d8906fe1da14f9dfaa88
end4532e1d01c10d8906fe1da14f9dfaa88:
	;
	return false
}
func rewriteValuegeneric_OpEq32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Eq32 x x)
	// cond:
	// result: (ConstBool [1])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end6da547ec4ee93d787434f3bda873e4a0
		}
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 1
		return true
	}
	goto end6da547ec4ee93d787434f3bda873e4a0
end6da547ec4ee93d787434f3bda873e4a0:
	;
	// match: (Eq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x))
	// cond:
	// result: (Eq32 (Const32 <t> [c-d]) x)
	{
		if v.Args[0].Op != OpConst32 {
			goto end1a69730a32c6e432784dcdf643320ecd
		}
		t := v.Args[0].Type
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpAdd32 {
			goto end1a69730a32c6e432784dcdf643320ecd
		}
		if v.Args[1].Args[0].Op != OpConst32 {
			goto end1a69730a32c6e432784dcdf643320ecd
		}
		if v.Args[1].Args[0].Type != v.Args[0].Type {
			goto end1a69730a32c6e432784dcdf643320ecd
		}
		d := v.Args[1].Args[0].AuxInt
		x := v.Args[1].Args[1]
		v.Op = OpEq32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst32, t)
		v0.AuxInt = c - d
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end1a69730a32c6e432784dcdf643320ecd
end1a69730a32c6e432784dcdf643320ecd:
	;
	// match: (Eq32 x (Const32 <t> [c]))
	// cond: x.Op != OpConst32
	// result: (Eq32 (Const32 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto end0ca4ef4cf416ec3083d38667e263cf45
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst32) {
			goto end0ca4ef4cf416ec3083d38667e263cf45
		}
		v.Op = OpEq32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst32, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end0ca4ef4cf416ec3083d38667e263cf45
end0ca4ef4cf416ec3083d38667e263cf45:
	;
	// match: (Eq32 (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(int32(c) == int32(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end00a2464e02c9ca00e8d0077acacbb5ad
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end00a2464e02c9ca00e8d0077acacbb5ad
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int32(c) == int32(d))
		return true
	}
	goto end00a2464e02c9ca00e8d0077acacbb5ad
end00a2464e02c9ca00e8d0077acacbb5ad:
	;
	return false
}
func rewriteValuegeneric_OpEq64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Eq64 x x)
	// cond:
	// result: (ConstBool [1])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto endb1d471cc503ba8bb05440f01dbf33d81
		}
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 1
		return true
	}
	goto endb1d471cc503ba8bb05440f01dbf33d81
endb1d471cc503ba8bb05440f01dbf33d81:
	;
	// match: (Eq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x))
	// cond:
	// result: (Eq64 (Const64 <t> [c-d]) x)
	{
		if v.Args[0].Op != OpConst64 {
			goto endffd67f3b83f6972cd459153d318f714d
		}
		t := v.Args[0].Type
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpAdd64 {
			goto endffd67f3b83f6972cd459153d318f714d
		}
		if v.Args[1].Args[0].Op != OpConst64 {
			goto endffd67f3b83f6972cd459153d318f714d
		}
		if v.Args[1].Args[0].Type != v.Args[0].Type {
			goto endffd67f3b83f6972cd459153d318f714d
		}
		d := v.Args[1].Args[0].AuxInt
		x := v.Args[1].Args[1]
		v.Op = OpEq64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c - d
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto endffd67f3b83f6972cd459153d318f714d
endffd67f3b83f6972cd459153d318f714d:
	;
	// match: (Eq64 x (Const64 <t> [c]))
	// cond: x.Op != OpConst64
	// result: (Eq64 (Const64 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto endc2ecf8254dc736e97c5815362d0b477d
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst64) {
			goto endc2ecf8254dc736e97c5815362d0b477d
		}
		v.Op = OpEq64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto endc2ecf8254dc736e97c5815362d0b477d
endc2ecf8254dc736e97c5815362d0b477d:
	;
	// match: (Eq64 (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(int64(c) == int64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto end405568a707dbbc86432e91f4ce7d97d7
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end405568a707dbbc86432e91f4ce7d97d7
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int64(c) == int64(d))
		return true
	}
	goto end405568a707dbbc86432e91f4ce7d97d7
end405568a707dbbc86432e91f4ce7d97d7:
	;
	return false
}
func rewriteValuegeneric_OpEq8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Eq8 x x)
	// cond:
	// result: (ConstBool [1])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto enda66da0d3e7e51624ee46527727c48a9a
		}
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 1
		return true
	}
	goto enda66da0d3e7e51624ee46527727c48a9a
enda66da0d3e7e51624ee46527727c48a9a:
	;
	// match: (Eq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x))
	// cond:
	// result: (Eq8 (Const8 <t> [c-d]) x)
	{
		if v.Args[0].Op != OpConst8 {
			goto end6912961350bb485f56ef176522aa683b
		}
		t := v.Args[0].Type
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpAdd8 {
			goto end6912961350bb485f56ef176522aa683b
		}
		if v.Args[1].Args[0].Op != OpConst8 {
			goto end6912961350bb485f56ef176522aa683b
		}
		if v.Args[1].Args[0].Type != v.Args[0].Type {
			goto end6912961350bb485f56ef176522aa683b
		}
		d := v.Args[1].Args[0].AuxInt
		x := v.Args[1].Args[1]
		v.Op = OpEq8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst8, t)
		v0.AuxInt = c - d
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end6912961350bb485f56ef176522aa683b
end6912961350bb485f56ef176522aa683b:
	;
	// match: (Eq8 x (Const8 <t> [c]))
	// cond: x.Op != OpConst8
	// result: (Eq8 (Const8 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end70d0b569427b24e7a912a1aa8fab3b20
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst8) {
			goto end70d0b569427b24e7a912a1aa8fab3b20
		}
		v.Op = OpEq8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst8, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end70d0b569427b24e7a912a1aa8fab3b20
end70d0b569427b24e7a912a1aa8fab3b20:
	;
	// match: (Eq8  (Const8  [c]) (Const8  [d]))
	// cond:
	// result: (ConstBool [b2i(int8(c)  == int8(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto endd49f3700ba2d1e500d3ab4fa34fd090d
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto endd49f3700ba2d1e500d3ab4fa34fd090d
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int8(c) == int8(d))
		return true
	}
	goto endd49f3700ba2d1e500d3ab4fa34fd090d
endd49f3700ba2d1e500d3ab4fa34fd090d:
	;
	return false
}
func rewriteValuegeneric_OpEqInter(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (EqInter x y)
	// cond:
	// result: (EqPtr  (ITab x) (ITab y))
	{
		x := v.Args[0]
		y := v.Args[1]
		v.Op = OpEqPtr
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
		v0.AddArg(x)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
		v1.AddArg(y)
		v.AddArg(v1)
		return true
	}
	goto end1cc40483caab33ece971ab7e6c8fdfca
end1cc40483caab33ece971ab7e6c8fdfca:
	;
	return false
}
func rewriteValuegeneric_OpEqPtr(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (EqPtr p (ConstNil))
	// cond:
	// result: (Not (IsNonNil p))
	{
		p := v.Args[0]
		if v.Args[1].Op != OpConstNil {
			goto ende701cdb6a2c1fff4d4b283b7f8f6178b
		}
		v.Op = OpNot
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpIsNonNil, config.fe.TypeBool())
		v0.AddArg(p)
		v.AddArg(v0)
		return true
	}
	goto ende701cdb6a2c1fff4d4b283b7f8f6178b
ende701cdb6a2c1fff4d4b283b7f8f6178b:
	;
	// match: (EqPtr (ConstNil) p)
	// cond:
	// result: (Not (IsNonNil p))
	{
		if v.Args[0].Op != OpConstNil {
			goto end7cdc0d5c38fbffe6287c8928803b038e
		}
		p := v.Args[1]
		v.Op = OpNot
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpIsNonNil, config.fe.TypeBool())
		v0.AddArg(p)
		v.AddArg(v0)
		return true
	}
	goto end7cdc0d5c38fbffe6287c8928803b038e
end7cdc0d5c38fbffe6287c8928803b038e:
	;
	return false
}
func rewriteValuegeneric_OpEqSlice(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (EqSlice x y)
	// cond:
	// result: (EqPtr  (SlicePtr x) (SlicePtr y))
	{
		x := v.Args[0]
		y := v.Args[1]
		v.Op = OpEqPtr
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
		v0.AddArg(x)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
		v1.AddArg(y)
		v.AddArg(v1)
		return true
	}
	goto end9cd53ca57ee90aa09c54f8071c8e8769
end9cd53ca57ee90aa09c54f8071c8e8769:
	;
	return false
}
func rewriteValuegeneric_OpGeq16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Geq16 (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (ConstBool [b2i(int16(c) >= int16(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto endbac100e9f1065e7d2ff863951f686f4b
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto endbac100e9f1065e7d2ff863951f686f4b
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int16(c) >= int16(d))
		return true
	}
	goto endbac100e9f1065e7d2ff863951f686f4b
endbac100e9f1065e7d2ff863951f686f4b:
	;
	return false
}
func rewriteValuegeneric_OpGeq16U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Geq16U (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (ConstBool [b2i(uint16(c) >= uint16(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto end11c6acbc5827fc9508424b0ffcf98b34
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto end11c6acbc5827fc9508424b0ffcf98b34
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint16(c) >= uint16(d))
		return true
	}
	goto end11c6acbc5827fc9508424b0ffcf98b34
end11c6acbc5827fc9508424b0ffcf98b34:
	;
	return false
}
func rewriteValuegeneric_OpGeq32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Geq32 (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(int32(c) >= int32(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end89ced97524ac75045911ca7cf6d44b28
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end89ced97524ac75045911ca7cf6d44b28
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int32(c) >= int32(d))
		return true
	}
	goto end89ced97524ac75045911ca7cf6d44b28
end89ced97524ac75045911ca7cf6d44b28:
	;
	return false
}
func rewriteValuegeneric_OpGeq32U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Geq32U (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(uint32(c) >= uint32(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end92fbe85c7bbbf0db287932822bdde991
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end92fbe85c7bbbf0db287932822bdde991
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint32(c) >= uint32(d))
		return true
	}
	goto end92fbe85c7bbbf0db287932822bdde991
end92fbe85c7bbbf0db287932822bdde991:
	;
	return false
}
func rewriteValuegeneric_OpGeq64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Geq64 (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(int64(c) >= int64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto end08a5a4bff12a346befe05ad561b080ac
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end08a5a4bff12a346befe05ad561b080ac
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int64(c) >= int64(d))
		return true
	}
	goto end08a5a4bff12a346befe05ad561b080ac
end08a5a4bff12a346befe05ad561b080ac:
	;
	return false
}
func rewriteValuegeneric_OpGeq64U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Geq64U (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(uint64(c) >= uint64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto endd72c497b6cc2b01d43a39ec12d5010b3
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endd72c497b6cc2b01d43a39ec12d5010b3
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint64(c) >= uint64(d))
		return true
	}
	goto endd72c497b6cc2b01d43a39ec12d5010b3
endd72c497b6cc2b01d43a39ec12d5010b3:
	;
	return false
}
func rewriteValuegeneric_OpGeq8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Geq8  (Const8  [c]) (Const8  [d]))
	// cond:
	// result: (ConstBool [b2i(int8(c)  >= int8(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto endea141068e84038c63cbdd87a8cb227d7
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto endea141068e84038c63cbdd87a8cb227d7
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int8(c) >= int8(d))
		return true
	}
	goto endea141068e84038c63cbdd87a8cb227d7
endea141068e84038c63cbdd87a8cb227d7:
	;
	return false
}
func rewriteValuegeneric_OpGeq8U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Geq8U  (Const8  [c]) (Const8  [d]))
	// cond:
	// result: (ConstBool [b2i(uint8(c)  >= uint8(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto end47c128ccdc54151a243c5856b0c52ef1
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto end47c128ccdc54151a243c5856b0c52ef1
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint8(c) >= uint8(d))
		return true
	}
	goto end47c128ccdc54151a243c5856b0c52ef1
end47c128ccdc54151a243c5856b0c52ef1:
	;
	return false
}
func rewriteValuegeneric_OpGreater16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Greater16 (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (ConstBool [b2i(int16(c) > int16(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto end390bae49463ace4d703dd24e18920f66
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto end390bae49463ace4d703dd24e18920f66
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int16(c) > int16(d))
		return true
	}
	goto end390bae49463ace4d703dd24e18920f66
end390bae49463ace4d703dd24e18920f66:
	;
	return false
}
func rewriteValuegeneric_OpGreater16U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Greater16U (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (ConstBool [b2i(uint16(c) > uint16(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto end89ba3caf5c156fa6d908ac04c058187b
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto end89ba3caf5c156fa6d908ac04c058187b
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint16(c) > uint16(d))
		return true
	}
	goto end89ba3caf5c156fa6d908ac04c058187b
end89ba3caf5c156fa6d908ac04c058187b:
	;
	return false
}
func rewriteValuegeneric_OpGreater32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Greater32 (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(int32(c) > int32(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end86482a9dc6439e8470da5352dd74d68d
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end86482a9dc6439e8470da5352dd74d68d
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int32(c) > int32(d))
		return true
	}
	goto end86482a9dc6439e8470da5352dd74d68d
end86482a9dc6439e8470da5352dd74d68d:
	;
	return false
}
func rewriteValuegeneric_OpGreater32U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Greater32U (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(uint32(c) > uint32(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end1bf3f05c1e3599a969b8be1f5f6949e4
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end1bf3f05c1e3599a969b8be1f5f6949e4
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint32(c) > uint32(d))
		return true
	}
	goto end1bf3f05c1e3599a969b8be1f5f6949e4
end1bf3f05c1e3599a969b8be1f5f6949e4:
	;
	return false
}
func rewriteValuegeneric_OpGreater64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Greater64 (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(int64(c) > int64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto end96a82e893fda4882f23b6bab5f7fbff7
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end96a82e893fda4882f23b6bab5f7fbff7
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int64(c) > int64(d))
		return true
	}
	goto end96a82e893fda4882f23b6bab5f7fbff7
end96a82e893fda4882f23b6bab5f7fbff7:
	;
	return false
}
func rewriteValuegeneric_OpGreater64U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Greater64U (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(uint64(c) > uint64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto end2d8f5ad85fbffeb92af985a888f6fa69
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end2d8f5ad85fbffeb92af985a888f6fa69
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint64(c) > uint64(d))
		return true
	}
	goto end2d8f5ad85fbffeb92af985a888f6fa69
end2d8f5ad85fbffeb92af985a888f6fa69:
	;
	return false
}
func rewriteValuegeneric_OpGreater8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Greater8  (Const8  [c]) (Const8  [d]))
	// cond:
	// result: (ConstBool [b2i(int8(c)  > int8(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto ende221967c7516b7749109cf8343fe9c83
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto ende221967c7516b7749109cf8343fe9c83
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int8(c) > int8(d))
		return true
	}
	goto ende221967c7516b7749109cf8343fe9c83
ende221967c7516b7749109cf8343fe9c83:
	;
	return false
}
func rewriteValuegeneric_OpGreater8U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Greater8U  (Const8  [c]) (Const8  [d]))
	// cond:
	// result: (ConstBool [b2i(uint8(c)  > uint8(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto enda9398c8188156dd46689fa2939147525
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto enda9398c8188156dd46689fa2939147525
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint8(c) > uint8(d))
		return true
	}
	goto enda9398c8188156dd46689fa2939147525
enda9398c8188156dd46689fa2939147525:
	;
	return false
}
func rewriteValuegeneric_OpIData(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (IData (IMake _ data))
	// cond:
	// result: data
	{
		if v.Args[0].Op != OpIMake {
			goto endbfa1bb944cdc07933effb16a35152e12
		}
		data := v.Args[0].Args[1]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = data.Type
		v.AddArg(data)
		return true
	}
	goto endbfa1bb944cdc07933effb16a35152e12
endbfa1bb944cdc07933effb16a35152e12:
	;
	return false
}
func rewriteValuegeneric_OpITab(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (ITab (IMake itab _))
	// cond:
	// result: itab
	{
		if v.Args[0].Op != OpIMake {
			goto endfcbb9414a776ff9c8512da3e0f4d8fbd
		}
		itab := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = itab.Type
		v.AddArg(itab)
		return true
	}
	goto endfcbb9414a776ff9c8512da3e0f4d8fbd
endfcbb9414a776ff9c8512da3e0f4d8fbd:
	;
	return false
}
func rewriteValuegeneric_OpIsInBounds(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (IsInBounds (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(inBounds32(c,d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto endf0a2ecfe84b293de6ff0919e45d19d9d
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto endf0a2ecfe84b293de6ff0919e45d19d9d
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(inBounds32(c, d))
		return true
	}
	goto endf0a2ecfe84b293de6ff0919e45d19d9d
endf0a2ecfe84b293de6ff0919e45d19d9d:
	;
	// match: (IsInBounds (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(inBounds64(c,d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto end4b406f402c135f50f71effcc904ecb2b
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end4b406f402c135f50f71effcc904ecb2b
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(inBounds64(c, d))
		return true
	}
	goto end4b406f402c135f50f71effcc904ecb2b
end4b406f402c135f50f71effcc904ecb2b:
	;
	return false
}
func rewriteValuegeneric_OpIsSliceInBounds(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (IsSliceInBounds (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(sliceInBounds32(c,d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end5e84a230c28cac987437cfed8f432cc3
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end5e84a230c28cac987437cfed8f432cc3
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(sliceInBounds32(c, d))
		return true
	}
	goto end5e84a230c28cac987437cfed8f432cc3
end5e84a230c28cac987437cfed8f432cc3:
	;
	// match: (IsSliceInBounds (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(sliceInBounds64(c,d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto end3880a6fe20ad4152e98f76d84da233a7
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end3880a6fe20ad4152e98f76d84da233a7
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(sliceInBounds64(c, d))
		return true
	}
	goto end3880a6fe20ad4152e98f76d84da233a7
end3880a6fe20ad4152e98f76d84da233a7:
	;
	return false
}
func rewriteValuegeneric_OpLeq16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Leq16 (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (ConstBool [b2i(int16(c) <= int16(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto end76b1c51f9b7cd7ee2f75b9f7057569de
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto end76b1c51f9b7cd7ee2f75b9f7057569de
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int16(c) <= int16(d))
		return true
	}
	goto end76b1c51f9b7cd7ee2f75b9f7057569de
end76b1c51f9b7cd7ee2f75b9f7057569de:
	;
	return false
}
func rewriteValuegeneric_OpLeq16U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Leq16U (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (ConstBool [b2i(uint16(c) <= uint16(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto endf010fdf7f2c438ec18c33f493dd062aa
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto endf010fdf7f2c438ec18c33f493dd062aa
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint16(c) <= uint16(d))
		return true
	}
	goto endf010fdf7f2c438ec18c33f493dd062aa
endf010fdf7f2c438ec18c33f493dd062aa:
	;
	return false
}
func rewriteValuegeneric_OpLeq32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Leq32 (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(int32(c) <= int32(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end6c7d61cfd188680bea8a5e23f08ca1de
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end6c7d61cfd188680bea8a5e23f08ca1de
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int32(c) <= int32(d))
		return true
	}
	goto end6c7d61cfd188680bea8a5e23f08ca1de
end6c7d61cfd188680bea8a5e23f08ca1de:
	;
	return false
}
func rewriteValuegeneric_OpLeq32U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Leq32U (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(uint32(c) <= uint32(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end4363555333511ee9b649b36f1a0ba34e
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end4363555333511ee9b649b36f1a0ba34e
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint32(c) <= uint32(d))
		return true
	}
	goto end4363555333511ee9b649b36f1a0ba34e
end4363555333511ee9b649b36f1a0ba34e:
	;
	return false
}
func rewriteValuegeneric_OpLeq64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Leq64 (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(int64(c) <= int64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto enddc865cd7ac2093abc7617bedbf371c22
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto enddc865cd7ac2093abc7617bedbf371c22
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int64(c) <= int64(d))
		return true
	}
	goto enddc865cd7ac2093abc7617bedbf371c22
enddc865cd7ac2093abc7617bedbf371c22:
	;
	return false
}
func rewriteValuegeneric_OpLeq64U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Leq64U (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(uint64(c) <= uint64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto end412eadb168738ba92f3f0705d4495305
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end412eadb168738ba92f3f0705d4495305
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint64(c) <= uint64(d))
		return true
	}
	goto end412eadb168738ba92f3f0705d4495305
end412eadb168738ba92f3f0705d4495305:
	;
	return false
}
func rewriteValuegeneric_OpLeq8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Leq8  (Const8  [c]) (Const8  [d]))
	// cond:
	// result: (ConstBool [b2i(int8(c)  <= int8(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto endb5a459da8e18c40abc0c7a20e71d0187
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto endb5a459da8e18c40abc0c7a20e71d0187
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int8(c) <= int8(d))
		return true
	}
	goto endb5a459da8e18c40abc0c7a20e71d0187
endb5a459da8e18c40abc0c7a20e71d0187:
	;
	return false
}
func rewriteValuegeneric_OpLeq8U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Leq8U  (Const8  [c]) (Const8  [d]))
	// cond:
	// result: (ConstBool [b2i(uint8(c)  <= uint8(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto endd6622d55fcdf3fa7b08e7511cd3b7d85
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto endd6622d55fcdf3fa7b08e7511cd3b7d85
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint8(c) <= uint8(d))
		return true
	}
	goto endd6622d55fcdf3fa7b08e7511cd3b7d85
endd6622d55fcdf3fa7b08e7511cd3b7d85:
	;
	return false
}
func rewriteValuegeneric_OpLess16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Less16 (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (ConstBool [b2i(int16(c) < int16(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto end0dc915d089f05e79589ebb5c498cc360
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto end0dc915d089f05e79589ebb5c498cc360
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int16(c) < int16(d))
		return true
	}
	goto end0dc915d089f05e79589ebb5c498cc360
end0dc915d089f05e79589ebb5c498cc360:
	;
	return false
}
func rewriteValuegeneric_OpLess16U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Less16U (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (ConstBool [b2i(uint16(c) < uint16(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto endd2bb8249443788690946fc184631a00a
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto endd2bb8249443788690946fc184631a00a
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint16(c) < uint16(d))
		return true
	}
	goto endd2bb8249443788690946fc184631a00a
endd2bb8249443788690946fc184631a00a:
	;
	return false
}
func rewriteValuegeneric_OpLess32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Less32 (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(int32(c) < int32(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto endc86f65e499688809d414f03539bec5bf
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto endc86f65e499688809d414f03539bec5bf
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int32(c) < int32(d))
		return true
	}
	goto endc86f65e499688809d414f03539bec5bf
endc86f65e499688809d414f03539bec5bf:
	;
	return false
}
func rewriteValuegeneric_OpLess32U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Less32U (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(uint32(c) < uint32(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end2cc68b5247b1afb90a9d3923b28ff247
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end2cc68b5247b1afb90a9d3923b28ff247
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint32(c) < uint32(d))
		return true
	}
	goto end2cc68b5247b1afb90a9d3923b28ff247
end2cc68b5247b1afb90a9d3923b28ff247:
	;
	return false
}
func rewriteValuegeneric_OpLess64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Less64 (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(int64(c) < int64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto end505de73cd15125dbb59b05d8975d3128
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end505de73cd15125dbb59b05d8975d3128
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int64(c) < int64(d))
		return true
	}
	goto end505de73cd15125dbb59b05d8975d3128
end505de73cd15125dbb59b05d8975d3128:
	;
	return false
}
func rewriteValuegeneric_OpLess64U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Less64U (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(uint64(c) < uint64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto endeb249ef36416cd1abf4f807026c059cd
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endeb249ef36416cd1abf4f807026c059cd
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint64(c) < uint64(d))
		return true
	}
	goto endeb249ef36416cd1abf4f807026c059cd
endeb249ef36416cd1abf4f807026c059cd:
	;
	return false
}
func rewriteValuegeneric_OpLess8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Less8  (Const8  [c]) (Const8  [d]))
	// cond:
	// result: (ConstBool [b2i(int8(c)  < int8(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto endef134de03bc8537ac1f38d5eccff7673
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto endef134de03bc8537ac1f38d5eccff7673
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int8(c) < int8(d))
		return true
	}
	goto endef134de03bc8537ac1f38d5eccff7673
endef134de03bc8537ac1f38d5eccff7673:
	;
	return false
}
func rewriteValuegeneric_OpLess8U(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Less8U  (Const8  [c]) (Const8  [d]))
	// cond:
	// result: (ConstBool [b2i(uint8(c)  < uint8(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto end263ecdc279924bff8771dd1ac3f42222
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto end263ecdc279924bff8771dd1ac3f42222
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(uint8(c) < uint8(d))
		return true
	}
	goto end263ecdc279924bff8771dd1ac3f42222
end263ecdc279924bff8771dd1ac3f42222:
	;
	return false
}
func rewriteValuegeneric_OpLoad(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Load <t> _ _)
	// cond: t.IsStruct() && t.NumFields() == 0 && config.fe.CanSSA(t)
	// result: (StructMake0)
	{
		t := v.Type
		if !(t.IsStruct() && t.NumFields() == 0 && config.fe.CanSSA(t)) {
			goto end8d25f5c949948132921b6be29ede6bde
		}
		v.Op = OpStructMake0
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		return true
	}
	goto end8d25f5c949948132921b6be29ede6bde
end8d25f5c949948132921b6be29ede6bde:
	;
	// match: (Load <t> ptr mem)
	// cond: t.IsStruct() && t.NumFields() == 1 && config.fe.CanSSA(t)
	// result: (StructMake1     (Load <t.FieldType(0)> ptr mem))
	{
		t := v.Type
		ptr := v.Args[0]
		mem := v.Args[1]
		if !(t.IsStruct() && t.NumFields() == 1 && config.fe.CanSSA(t)) {
			goto endfe908e5a8617dd39df2f9b2b92e93ae5
		}
		v.Op = OpStructMake1
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
		v0.AddArg(ptr)
		v0.AddArg(mem)
		v.AddArg(v0)
		return true
	}
	goto endfe908e5a8617dd39df2f9b2b92e93ae5
endfe908e5a8617dd39df2f9b2b92e93ae5:
	;
	// match: (Load <t> ptr mem)
	// cond: t.IsStruct() && t.NumFields() == 2 && config.fe.CanSSA(t)
	// result: (StructMake2     (Load <t.FieldType(0)> ptr mem)     (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem))
	{
		t := v.Type
		ptr := v.Args[0]
		mem := v.Args[1]
		if !(t.IsStruct() && t.NumFields() == 2 && config.fe.CanSSA(t)) {
			goto end20e20e64004b765012cfb80c575ef27b
		}
		v.Op = OpStructMake2
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
		v0.AddArg(ptr)
		v0.AddArg(mem)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpLoad, t.FieldType(1))
		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
		v2.AuxInt = t.FieldOff(1)
		v2.AddArg(ptr)
		v1.AddArg(v2)
		v1.AddArg(mem)
		v.AddArg(v1)
		return true
	}
	goto end20e20e64004b765012cfb80c575ef27b
end20e20e64004b765012cfb80c575ef27b:
	;
	// match: (Load <t> ptr mem)
	// cond: t.IsStruct() && t.NumFields() == 3 && config.fe.CanSSA(t)
	// result: (StructMake3     (Load <t.FieldType(0)> ptr mem)     (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem)     (Load <t.FieldType(2)> (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] ptr) mem))
	{
		t := v.Type
		ptr := v.Args[0]
		mem := v.Args[1]
		if !(t.IsStruct() && t.NumFields() == 3 && config.fe.CanSSA(t)) {
			goto ende612bf71067ed67541735cdc8b5a3288
		}
		v.Op = OpStructMake3
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
		v0.AddArg(ptr)
		v0.AddArg(mem)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpLoad, t.FieldType(1))
		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
		v2.AuxInt = t.FieldOff(1)
		v2.AddArg(ptr)
		v1.AddArg(v2)
		v1.AddArg(mem)
		v.AddArg(v1)
		v3 := b.NewValue0(v.Line, OpLoad, t.FieldType(2))
		v4 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
		v4.AuxInt = t.FieldOff(2)
		v4.AddArg(ptr)
		v3.AddArg(v4)
		v3.AddArg(mem)
		v.AddArg(v3)
		return true
	}
	goto ende612bf71067ed67541735cdc8b5a3288
ende612bf71067ed67541735cdc8b5a3288:
	;
	// match: (Load <t> ptr mem)
	// cond: t.IsStruct() && t.NumFields() == 4 && config.fe.CanSSA(t)
	// result: (StructMake4     (Load <t.FieldType(0)> ptr mem)     (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem)     (Load <t.FieldType(2)> (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] ptr) mem)     (Load <t.FieldType(3)> (OffPtr <t.FieldType(3).PtrTo()> [t.FieldOff(3)] ptr) mem))
	{
		t := v.Type
		ptr := v.Args[0]
		mem := v.Args[1]
		if !(t.IsStruct() && t.NumFields() == 4 && config.fe.CanSSA(t)) {
			goto end46c66c64d9030f2cc9a7a767f67953d1
		}
		v.Op = OpStructMake4
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
		v0.AddArg(ptr)
		v0.AddArg(mem)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpLoad, t.FieldType(1))
		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
		v2.AuxInt = t.FieldOff(1)
		v2.AddArg(ptr)
		v1.AddArg(v2)
		v1.AddArg(mem)
		v.AddArg(v1)
		v3 := b.NewValue0(v.Line, OpLoad, t.FieldType(2))
		v4 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
		v4.AuxInt = t.FieldOff(2)
		v4.AddArg(ptr)
		v3.AddArg(v4)
		v3.AddArg(mem)
		v.AddArg(v3)
		v5 := b.NewValue0(v.Line, OpLoad, t.FieldType(3))
		v6 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(3).PtrTo())
		v6.AuxInt = t.FieldOff(3)
		v6.AddArg(ptr)
		v5.AddArg(v6)
		v5.AddArg(mem)
		v.AddArg(v5)
		return true
	}
	goto end46c66c64d9030f2cc9a7a767f67953d1
end46c66c64d9030f2cc9a7a767f67953d1:
	;
	// match: (Load <t> ptr mem)
	// cond: t.IsComplex() && t.Size() == 8
	// result: (ComplexMake     (Load <config.fe.TypeFloat32()> ptr mem)     (Load <config.fe.TypeFloat32()>       (OffPtr <config.fe.TypeFloat32().PtrTo()> [4] ptr)       mem)     )
	{
		t := v.Type
		ptr := v.Args[0]
		mem := v.Args[1]
		if !(t.IsComplex() && t.Size() == 8) {
			goto end665854b31b828893d90b36bb462ff381
		}
		v.Op = OpComplexMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat32())
		v0.AddArg(ptr)
		v0.AddArg(mem)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat32())
		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat32().PtrTo())
		v2.AuxInt = 4
		v2.AddArg(ptr)
		v1.AddArg(v2)
		v1.AddArg(mem)
		v.AddArg(v1)
		return true
	}
	goto end665854b31b828893d90b36bb462ff381
end665854b31b828893d90b36bb462ff381:
	;
	// match: (Load <t> ptr mem)
	// cond: t.IsComplex() && t.Size() == 16
	// result: (ComplexMake     (Load <config.fe.TypeFloat64()> ptr mem)     (Load <config.fe.TypeFloat64()>       (OffPtr <config.fe.TypeFloat64().PtrTo()> [8] ptr)       mem)     )
	{
		t := v.Type
		ptr := v.Args[0]
		mem := v.Args[1]
		if !(t.IsComplex() && t.Size() == 16) {
			goto end1b106f89e0e3e26c613b957a7c98d8ad
		}
		v.Op = OpComplexMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat64())
		v0.AddArg(ptr)
		v0.AddArg(mem)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat64())
		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat64().PtrTo())
		v2.AuxInt = 8
		v2.AddArg(ptr)
		v1.AddArg(v2)
		v1.AddArg(mem)
		v.AddArg(v1)
		return true
	}
	goto end1b106f89e0e3e26c613b957a7c98d8ad
end1b106f89e0e3e26c613b957a7c98d8ad:
	;
	// match: (Load <t> ptr mem)
	// cond: t.IsString()
	// result: (StringMake     (Load <config.fe.TypeBytePtr()> ptr mem)     (Load <config.fe.TypeInt()>       (OffPtr <config.fe.TypeInt().PtrTo()> [config.PtrSize] ptr)       mem))
	{
		t := v.Type
		ptr := v.Args[0]
		mem := v.Args[1]
		if !(t.IsString()) {
			goto enddd15a6f3d53a6ce7a19d4e181dd1c13a
		}
		v.Op = OpStringMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
		v0.AddArg(ptr)
		v0.AddArg(mem)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeInt())
		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
		v2.AuxInt = config.PtrSize
		v2.AddArg(ptr)
		v1.AddArg(v2)
		v1.AddArg(mem)
		v.AddArg(v1)
		return true
	}
	goto enddd15a6f3d53a6ce7a19d4e181dd1c13a
enddd15a6f3d53a6ce7a19d4e181dd1c13a:
	;
	// match: (Load <t> ptr mem)
	// cond: t.IsSlice()
	// result: (SliceMake     (Load <config.fe.TypeBytePtr()> ptr mem)     (Load <config.fe.TypeInt()>       (OffPtr <config.fe.TypeInt().PtrTo()> [config.PtrSize] ptr)       mem)     (Load <config.fe.TypeInt()>       (OffPtr <config.fe.TypeInt().PtrTo()> [2*config.PtrSize] ptr)       mem))
	{
		t := v.Type
		ptr := v.Args[0]
		mem := v.Args[1]
		if !(t.IsSlice()) {
			goto end65e8b0055aa7491b9b6066d9fe1b2c13
		}
		v.Op = OpSliceMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
		v0.AddArg(ptr)
		v0.AddArg(mem)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeInt())
		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
		v2.AuxInt = config.PtrSize
		v2.AddArg(ptr)
		v1.AddArg(v2)
		v1.AddArg(mem)
		v.AddArg(v1)
		v3 := b.NewValue0(v.Line, OpLoad, config.fe.TypeInt())
		v4 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
		v4.AuxInt = 2 * config.PtrSize
		v4.AddArg(ptr)
		v3.AddArg(v4)
		v3.AddArg(mem)
		v.AddArg(v3)
		return true
	}
	goto end65e8b0055aa7491b9b6066d9fe1b2c13
end65e8b0055aa7491b9b6066d9fe1b2c13:
	;
	// match: (Load <t> ptr mem)
	// cond: t.IsInterface()
	// result: (IMake     (Load <config.fe.TypeBytePtr()> ptr mem)     (Load <config.fe.TypeBytePtr()>       (OffPtr <config.fe.TypeBytePtr().PtrTo()> [config.PtrSize] ptr)       mem))
	{
		t := v.Type
		ptr := v.Args[0]
		mem := v.Args[1]
		if !(t.IsInterface()) {
			goto end12671c83ebe3ccbc8e53383765ee7675
		}
		v.Op = OpIMake
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
		v0.AddArg(ptr)
		v0.AddArg(mem)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeBytePtr().PtrTo())
		v2.AuxInt = config.PtrSize
		v2.AddArg(ptr)
		v1.AddArg(v2)
		v1.AddArg(mem)
		v.AddArg(v1)
		return true
	}
	goto end12671c83ebe3ccbc8e53383765ee7675
end12671c83ebe3ccbc8e53383765ee7675:
	;
	return false
}
func rewriteValuegeneric_OpLsh16x16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh16x16  <t> x (Const16 [c]))
	// cond:
	// result: (Lsh16x64  x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end2f5aa78b30ebd2471e8d03a307923b06
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh16x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto end2f5aa78b30ebd2471e8d03a307923b06
end2f5aa78b30ebd2471e8d03a307923b06:
	;
	return false
}
func rewriteValuegeneric_OpLsh16x32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh16x32  <t> x (Const32 [c]))
	// cond:
	// result: (Lsh16x64  x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto endedeb000c8c97090261a47f08a2ff17e4
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh16x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto endedeb000c8c97090261a47f08a2ff17e4
endedeb000c8c97090261a47f08a2ff17e4:
	;
	return false
}
func rewriteValuegeneric_OpLsh16x64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh16x64  (Const16 [c]) (Const64 [d]))
	// cond:
	// result: (Const16 [int64(int16(c) << uint64(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto endc9f0d91f3da4bdd46a634a62549810e0
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endc9f0d91f3da4bdd46a634a62549810e0
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = int64(int16(c) << uint64(d))
		return true
	}
	goto endc9f0d91f3da4bdd46a634a62549810e0
endc9f0d91f3da4bdd46a634a62549810e0:
	;
	// match: (Lsh16x64  x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end7ecc343739fab9b50a0bdff6e9d121e6
		}
		if v.Args[1].AuxInt != 0 {
			goto end7ecc343739fab9b50a0bdff6e9d121e6
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end7ecc343739fab9b50a0bdff6e9d121e6
end7ecc343739fab9b50a0bdff6e9d121e6:
	;
	// match: (Lsh16x64  _ (Const64 [c]))
	// cond: uint64(c) >= 16
	// result: (Const64 [0])
	{
		if v.Args[1].Op != OpConst64 {
			goto end1d2c74d359df9d89b16c4f658a231dfe
		}
		c := v.Args[1].AuxInt
		if !(uint64(c) >= 16) {
			goto end1d2c74d359df9d89b16c4f658a231dfe
		}
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end1d2c74d359df9d89b16c4f658a231dfe
end1d2c74d359df9d89b16c4f658a231dfe:
	;
	// match: (Lsh16x64 <t> (Lsh16x64 x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Lsh16x64 x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpLsh16x64 {
			goto end26a91e42735a02a30e94a998f54372dd
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto end26a91e42735a02a30e94a998f54372dd
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end26a91e42735a02a30e94a998f54372dd
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto end26a91e42735a02a30e94a998f54372dd
		}
		v.Op = OpLsh16x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto end26a91e42735a02a30e94a998f54372dd
end26a91e42735a02a30e94a998f54372dd:
	;
	return false
}
func rewriteValuegeneric_OpLsh16x8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh16x8   <t> x (Const8 [c]))
	// cond:
	// result: (Lsh16x64  x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto endce2401b8a6c6190fe81d77e2d562a10c
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh16x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto endce2401b8a6c6190fe81d77e2d562a10c
endce2401b8a6c6190fe81d77e2d562a10c:
	;
	return false
}
func rewriteValuegeneric_OpLsh32x16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh32x16  <t> x (Const16 [c]))
	// cond:
	// result: (Lsh32x64  x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end7205eb3e315971143ac5584d07045570
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh32x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto end7205eb3e315971143ac5584d07045570
end7205eb3e315971143ac5584d07045570:
	;
	return false
}
func rewriteValuegeneric_OpLsh32x32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh32x32  <t> x (Const32 [c]))
	// cond:
	// result: (Lsh32x64  x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto endc1a330b287199c80228e665a53881298
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh32x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto endc1a330b287199c80228e665a53881298
endc1a330b287199c80228e665a53881298:
	;
	return false
}
func rewriteValuegeneric_OpLsh32x64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh32x64  (Const32 [c]) (Const64 [d]))
	// cond:
	// result: (Const32 [int64(int32(c) << uint64(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end5896bd9a3fe78f1e1712563642d33254
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end5896bd9a3fe78f1e1712563642d33254
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = int64(int32(c) << uint64(d))
		return true
	}
	goto end5896bd9a3fe78f1e1712563642d33254
end5896bd9a3fe78f1e1712563642d33254:
	;
	// match: (Lsh32x64  x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto endd9ce9639a91b11e601823be3d4d6c209
		}
		if v.Args[1].AuxInt != 0 {
			goto endd9ce9639a91b11e601823be3d4d6c209
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto endd9ce9639a91b11e601823be3d4d6c209
endd9ce9639a91b11e601823be3d4d6c209:
	;
	// match: (Lsh32x64  _ (Const64 [c]))
	// cond: uint64(c) >= 32
	// result: (Const64 [0])
	{
		if v.Args[1].Op != OpConst64 {
			goto end81247a2423f489be15859d3930738fdf
		}
		c := v.Args[1].AuxInt
		if !(uint64(c) >= 32) {
			goto end81247a2423f489be15859d3930738fdf
		}
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end81247a2423f489be15859d3930738fdf
end81247a2423f489be15859d3930738fdf:
	;
	// match: (Lsh32x64 <t> (Lsh32x64 x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Lsh32x64 x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpLsh32x64 {
			goto endf96a7c9571797fe61a5b63a4923d7e6e
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto endf96a7c9571797fe61a5b63a4923d7e6e
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endf96a7c9571797fe61a5b63a4923d7e6e
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto endf96a7c9571797fe61a5b63a4923d7e6e
		}
		v.Op = OpLsh32x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto endf96a7c9571797fe61a5b63a4923d7e6e
endf96a7c9571797fe61a5b63a4923d7e6e:
	;
	return false
}
func rewriteValuegeneric_OpLsh32x8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh32x8   <t> x (Const8 [c]))
	// cond:
	// result: (Lsh32x64  x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end1759d7c25a5bcda288e34d1d197c0b8f
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh32x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto end1759d7c25a5bcda288e34d1d197c0b8f
end1759d7c25a5bcda288e34d1d197c0b8f:
	;
	return false
}
func rewriteValuegeneric_OpLsh64x16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh64x16  <t> x (Const16 [c]))
	// cond:
	// result: (Lsh64x64  x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto enda649fbb5e14490c9eea9616550a76b5c
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh64x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto enda649fbb5e14490c9eea9616550a76b5c
enda649fbb5e14490c9eea9616550a76b5c:
	;
	return false
}
func rewriteValuegeneric_OpLsh64x32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh64x32  <t> x (Const32 [c]))
	// cond:
	// result: (Lsh64x64  x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto end40069675cde851a63cce81b1b02751f9
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh64x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto end40069675cde851a63cce81b1b02751f9
end40069675cde851a63cce81b1b02751f9:
	;
	return false
}
func rewriteValuegeneric_OpLsh64x64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh64x64  (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (Const64 [c << uint64(d)])
	{
		if v.Args[0].Op != OpConst64 {
			goto end9c157a23e021f659f1568566435ed57b
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end9c157a23e021f659f1568566435ed57b
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c << uint64(d)
		return true
	}
	goto end9c157a23e021f659f1568566435ed57b
end9c157a23e021f659f1568566435ed57b:
	;
	// match: (Lsh64x64  x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end9f18ca0556dbb4b50fe888273fab20ca
		}
		if v.Args[1].AuxInt != 0 {
			goto end9f18ca0556dbb4b50fe888273fab20ca
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end9f18ca0556dbb4b50fe888273fab20ca
end9f18ca0556dbb4b50fe888273fab20ca:
	;
	// match: (Lsh64x64  _ (Const64 [c]))
	// cond: uint64(c) >= 64
	// result: (Const64 [0])
	{
		if v.Args[1].Op != OpConst64 {
			goto end33da2e0ce5ca3e0554564477ef422402
		}
		c := v.Args[1].AuxInt
		if !(uint64(c) >= 64) {
			goto end33da2e0ce5ca3e0554564477ef422402
		}
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end33da2e0ce5ca3e0554564477ef422402
end33da2e0ce5ca3e0554564477ef422402:
	;
	// match: (Lsh64x64 <t> (Lsh64x64 x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Lsh64x64 x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpLsh64x64 {
			goto end001c62ee580a700ec7b07ccaa3740ac2
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto end001c62ee580a700ec7b07ccaa3740ac2
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end001c62ee580a700ec7b07ccaa3740ac2
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto end001c62ee580a700ec7b07ccaa3740ac2
		}
		v.Op = OpLsh64x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto end001c62ee580a700ec7b07ccaa3740ac2
end001c62ee580a700ec7b07ccaa3740ac2:
	;
	return false
}
func rewriteValuegeneric_OpLsh64x8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh64x8   <t> x (Const8 [c]))
	// cond:
	// result: (Lsh64x64  x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end4d9224069abdade8e405df343938d932
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh64x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto end4d9224069abdade8e405df343938d932
end4d9224069abdade8e405df343938d932:
	;
	return false
}
func rewriteValuegeneric_OpLsh8x16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh8x16  <t> x (Const16 [c]))
	// cond:
	// result: (Lsh8x64  x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end0ad4a82e2eb4c7ca7407d79ec3aa5142
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh8x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto end0ad4a82e2eb4c7ca7407d79ec3aa5142
end0ad4a82e2eb4c7ca7407d79ec3aa5142:
	;
	return false
}
func rewriteValuegeneric_OpLsh8x32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh8x32  <t> x (Const32 [c]))
	// cond:
	// result: (Lsh8x64  x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto enddaacda113ecc79fe0621fd22ebc548dd
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh8x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto enddaacda113ecc79fe0621fd22ebc548dd
enddaacda113ecc79fe0621fd22ebc548dd:
	;
	return false
}
func rewriteValuegeneric_OpLsh8x64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh8x64   (Const8  [c]) (Const64 [d]))
	// cond:
	// result: (Const8  [int64(int8(c) << uint64(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto endbc3297ea9642b97eb71f0a9735048d7b
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endbc3297ea9642b97eb71f0a9735048d7b
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = int64(int8(c) << uint64(d))
		return true
	}
	goto endbc3297ea9642b97eb71f0a9735048d7b
endbc3297ea9642b97eb71f0a9735048d7b:
	;
	// match: (Lsh8x64   x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end715f3db41cccf963e25a20c33f618a04
		}
		if v.Args[1].AuxInt != 0 {
			goto end715f3db41cccf963e25a20c33f618a04
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end715f3db41cccf963e25a20c33f618a04
end715f3db41cccf963e25a20c33f618a04:
	;
	// match: (Lsh8x64   _ (Const64 [c]))
	// cond: uint64(c) >= 8
	// result: (Const64 [0])
	{
		if v.Args[1].Op != OpConst64 {
			goto endb6749df4d0cdc0cd9acc627187d73488
		}
		c := v.Args[1].AuxInt
		if !(uint64(c) >= 8) {
			goto endb6749df4d0cdc0cd9acc627187d73488
		}
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto endb6749df4d0cdc0cd9acc627187d73488
endb6749df4d0cdc0cd9acc627187d73488:
	;
	// match: (Lsh8x64  <t> (Lsh8x64  x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Lsh8x64  x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpLsh8x64 {
			goto end73a4878b6bbd21c9e22fb99226ef947e
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto end73a4878b6bbd21c9e22fb99226ef947e
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end73a4878b6bbd21c9e22fb99226ef947e
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto end73a4878b6bbd21c9e22fb99226ef947e
		}
		v.Op = OpLsh8x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto end73a4878b6bbd21c9e22fb99226ef947e
end73a4878b6bbd21c9e22fb99226ef947e:
	;
	return false
}
func rewriteValuegeneric_OpLsh8x8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Lsh8x8   <t> x (Const8 [c]))
	// cond:
	// result: (Lsh8x64  x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end8b770597435467b0c96014624d522b33
		}
		c := v.Args[1].AuxInt
		v.Op = OpLsh8x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto end8b770597435467b0c96014624d522b33
end8b770597435467b0c96014624d522b33:
	;
	return false
}
func rewriteValuegeneric_OpMul16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Mul16 (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (Const16 [c*d])
	{
		if v.Args[0].Op != OpConst16 {
			goto ende8dd468add3015aea24531cf3c89ccb7
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto ende8dd468add3015aea24531cf3c89ccb7
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c * d
		return true
	}
	goto ende8dd468add3015aea24531cf3c89ccb7
ende8dd468add3015aea24531cf3c89ccb7:
	;
	return false
}
func rewriteValuegeneric_OpMul32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Mul32 (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (Const32 [c*d])
	{
		if v.Args[0].Op != OpConst32 {
			goto end60b4523099fa7b55e2e872e05bd497a7
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end60b4523099fa7b55e2e872e05bd497a7
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c * d
		return true
	}
	goto end60b4523099fa7b55e2e872e05bd497a7
end60b4523099fa7b55e2e872e05bd497a7:
	;
	return false
}
func rewriteValuegeneric_OpMul64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Mul64 (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (Const64 [c*d])
	{
		if v.Args[0].Op != OpConst64 {
			goto end7aea1048b5d1230974b97f17238380ae
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end7aea1048b5d1230974b97f17238380ae
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c * d
		return true
	}
	goto end7aea1048b5d1230974b97f17238380ae
end7aea1048b5d1230974b97f17238380ae:
	;
	return false
}
func rewriteValuegeneric_OpMul8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Mul8 (Const8 [c]) (Const8 [d]))
	// cond:
	// result: (Const8 [c*d])
	{
		if v.Args[0].Op != OpConst8 {
			goto end2f1952fd654c4a62ff00511041728809
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto end2f1952fd654c4a62ff00511041728809
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c * d
		return true
	}
	goto end2f1952fd654c4a62ff00511041728809
end2f1952fd654c4a62ff00511041728809:
	;
	return false
}
func rewriteValuegeneric_OpNeq16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Neq16 x x)
	// cond:
	// result: (ConstBool [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto ende76a50b524aeb16c7aeccf5f5cc60c06
		}
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto ende76a50b524aeb16c7aeccf5f5cc60c06
ende76a50b524aeb16c7aeccf5f5cc60c06:
	;
	// match: (Neq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x))
	// cond:
	// result: (Neq16 (Const16 <t> [c-d]) x)
	{
		if v.Args[0].Op != OpConst16 {
			goto end552011bd97e6f92ebc2672aa1843eadd
		}
		t := v.Args[0].Type
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpAdd16 {
			goto end552011bd97e6f92ebc2672aa1843eadd
		}
		if v.Args[1].Args[0].Op != OpConst16 {
			goto end552011bd97e6f92ebc2672aa1843eadd
		}
		if v.Args[1].Args[0].Type != v.Args[0].Type {
			goto end552011bd97e6f92ebc2672aa1843eadd
		}
		d := v.Args[1].Args[0].AuxInt
		x := v.Args[1].Args[1]
		v.Op = OpNeq16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst16, t)
		v0.AuxInt = c - d
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end552011bd97e6f92ebc2672aa1843eadd
end552011bd97e6f92ebc2672aa1843eadd:
	;
	// match: (Neq16 x (Const16 <t> [c]))
	// cond: x.Op != OpConst16
	// result: (Neq16 (Const16 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end0e45958f29e87997f632248aa9ee97e0
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst16) {
			goto end0e45958f29e87997f632248aa9ee97e0
		}
		v.Op = OpNeq16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst16, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end0e45958f29e87997f632248aa9ee97e0
end0e45958f29e87997f632248aa9ee97e0:
	;
	// match: (Neq16 (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (ConstBool [b2i(int16(c) != int16(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto end6302c9b645bb191982d28c2f846904d6
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto end6302c9b645bb191982d28c2f846904d6
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int16(c) != int16(d))
		return true
	}
	goto end6302c9b645bb191982d28c2f846904d6
end6302c9b645bb191982d28c2f846904d6:
	;
	return false
}
func rewriteValuegeneric_OpNeq32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Neq32 x x)
	// cond:
	// result: (ConstBool [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end3713a608cffd29b40ff7c3b3f2585cbb
		}
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end3713a608cffd29b40ff7c3b3f2585cbb
end3713a608cffd29b40ff7c3b3f2585cbb:
	;
	// match: (Neq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x))
	// cond:
	// result: (Neq32 (Const32 <t> [c-d]) x)
	{
		if v.Args[0].Op != OpConst32 {
			goto end93fc3b4a3639b965b414891111b16245
		}
		t := v.Args[0].Type
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpAdd32 {
			goto end93fc3b4a3639b965b414891111b16245
		}
		if v.Args[1].Args[0].Op != OpConst32 {
			goto end93fc3b4a3639b965b414891111b16245
		}
		if v.Args[1].Args[0].Type != v.Args[0].Type {
			goto end93fc3b4a3639b965b414891111b16245
		}
		d := v.Args[1].Args[0].AuxInt
		x := v.Args[1].Args[1]
		v.Op = OpNeq32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst32, t)
		v0.AuxInt = c - d
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end93fc3b4a3639b965b414891111b16245
end93fc3b4a3639b965b414891111b16245:
	;
	// match: (Neq32 x (Const32 <t> [c]))
	// cond: x.Op != OpConst32
	// result: (Neq32 (Const32 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto end5376f9ab90e282450f49011d0e0ce236
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst32) {
			goto end5376f9ab90e282450f49011d0e0ce236
		}
		v.Op = OpNeq32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst32, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end5376f9ab90e282450f49011d0e0ce236
end5376f9ab90e282450f49011d0e0ce236:
	;
	// match: (Neq32 (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (ConstBool [b2i(int32(c) != int32(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto endf9f3d0814854d2d0879d331e9bdfcae2
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto endf9f3d0814854d2d0879d331e9bdfcae2
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int32(c) != int32(d))
		return true
	}
	goto endf9f3d0814854d2d0879d331e9bdfcae2
endf9f3d0814854d2d0879d331e9bdfcae2:
	;
	return false
}
func rewriteValuegeneric_OpNeq64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Neq64 x x)
	// cond:
	// result: (ConstBool [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end3601ad382705ea12b79d2008c1e5725c
		}
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end3601ad382705ea12b79d2008c1e5725c
end3601ad382705ea12b79d2008c1e5725c:
	;
	// match: (Neq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x))
	// cond:
	// result: (Neq64 (Const64 <t> [c-d]) x)
	{
		if v.Args[0].Op != OpConst64 {
			goto enda3d39cad13a557a2aa6d086f43596c1b
		}
		t := v.Args[0].Type
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpAdd64 {
			goto enda3d39cad13a557a2aa6d086f43596c1b
		}
		if v.Args[1].Args[0].Op != OpConst64 {
			goto enda3d39cad13a557a2aa6d086f43596c1b
		}
		if v.Args[1].Args[0].Type != v.Args[0].Type {
			goto enda3d39cad13a557a2aa6d086f43596c1b
		}
		d := v.Args[1].Args[0].AuxInt
		x := v.Args[1].Args[1]
		v.Op = OpNeq64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c - d
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto enda3d39cad13a557a2aa6d086f43596c1b
enda3d39cad13a557a2aa6d086f43596c1b:
	;
	// match: (Neq64 x (Const64 <t> [c]))
	// cond: x.Op != OpConst64
	// result: (Neq64 (Const64 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end0936a57de20373ca6cacb9506ddde708
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst64) {
			goto end0936a57de20373ca6cacb9506ddde708
		}
		v.Op = OpNeq64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end0936a57de20373ca6cacb9506ddde708
end0936a57de20373ca6cacb9506ddde708:
	;
	// match: (Neq64 (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (ConstBool [b2i(int64(c) != int64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto endf07433ecd3c150b1b75e943aa44a7203
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endf07433ecd3c150b1b75e943aa44a7203
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int64(c) != int64(d))
		return true
	}
	goto endf07433ecd3c150b1b75e943aa44a7203
endf07433ecd3c150b1b75e943aa44a7203:
	;
	return false
}
func rewriteValuegeneric_OpNeq8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Neq8 x x)
	// cond:
	// result: (ConstBool [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end09a0deaf3c42627d0d2d3efa96e30745
		}
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end09a0deaf3c42627d0d2d3efa96e30745
end09a0deaf3c42627d0d2d3efa96e30745:
	;
	// match: (Neq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x))
	// cond:
	// result: (Neq8 (Const8 <t> [c-d]) x)
	{
		if v.Args[0].Op != OpConst8 {
			goto endc8f853c610c460c887cbfdca958e3691
		}
		t := v.Args[0].Type
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpAdd8 {
			goto endc8f853c610c460c887cbfdca958e3691
		}
		if v.Args[1].Args[0].Op != OpConst8 {
			goto endc8f853c610c460c887cbfdca958e3691
		}
		if v.Args[1].Args[0].Type != v.Args[0].Type {
			goto endc8f853c610c460c887cbfdca958e3691
		}
		d := v.Args[1].Args[0].AuxInt
		x := v.Args[1].Args[1]
		v.Op = OpNeq8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst8, t)
		v0.AuxInt = c - d
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto endc8f853c610c460c887cbfdca958e3691
endc8f853c610c460c887cbfdca958e3691:
	;
	// match: (Neq8 x (Const8 <t> [c]))
	// cond: x.Op != OpConst8
	// result: (Neq8 (Const8 <t> [c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end04dc0ae2b08cf0447b50e5b8ef469252
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst8) {
			goto end04dc0ae2b08cf0447b50e5b8ef469252
		}
		v.Op = OpNeq8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst8, t)
		v0.AuxInt = c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end04dc0ae2b08cf0447b50e5b8ef469252
end04dc0ae2b08cf0447b50e5b8ef469252:
	;
	// match: (Neq8  (Const8  [c]) (Const8  [d]))
	// cond:
	// result: (ConstBool [b2i(int8(c)  != int8(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto end72ebdaf2de9b3aa57cf0cb8e068b5f9c
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto end72ebdaf2de9b3aa57cf0cb8e068b5f9c
		}
		d := v.Args[1].AuxInt
		v.Op = OpConstBool
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = b2i(int8(c) != int8(d))
		return true
	}
	goto end72ebdaf2de9b3aa57cf0cb8e068b5f9c
end72ebdaf2de9b3aa57cf0cb8e068b5f9c:
	;
	return false
}
func rewriteValuegeneric_OpNeqInter(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (NeqInter x y)
	// cond:
	// result: (NeqPtr (ITab x) (ITab y))
	{
		x := v.Args[0]
		y := v.Args[1]
		v.Op = OpNeqPtr
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
		v0.AddArg(x)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
		v1.AddArg(y)
		v.AddArg(v1)
		return true
	}
	goto end17b2333bf57e9fe81a671be02f9c4c14
end17b2333bf57e9fe81a671be02f9c4c14:
	;
	return false
}
func rewriteValuegeneric_OpNeqPtr(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (NeqPtr p (ConstNil))
	// cond:
	// result: (IsNonNil p)
	{
		p := v.Args[0]
		if v.Args[1].Op != OpConstNil {
			goto endba798520b4d41172b110347158c44791
		}
		v.Op = OpIsNonNil
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(p)
		return true
	}
	goto endba798520b4d41172b110347158c44791
endba798520b4d41172b110347158c44791:
	;
	// match: (NeqPtr (ConstNil) p)
	// cond:
	// result: (IsNonNil p)
	{
		if v.Args[0].Op != OpConstNil {
			goto enddd95e9c3606d9fd48034f1a703561e45
		}
		p := v.Args[1]
		v.Op = OpIsNonNil
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(p)
		return true
	}
	goto enddd95e9c3606d9fd48034f1a703561e45
enddd95e9c3606d9fd48034f1a703561e45:
	;
	return false
}
func rewriteValuegeneric_OpNeqSlice(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (NeqSlice x y)
	// cond:
	// result: (NeqPtr (SlicePtr x) (SlicePtr y))
	{
		x := v.Args[0]
		y := v.Args[1]
		v.Op = OpNeqPtr
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
		v0.AddArg(x)
		v.AddArg(v0)
		v1 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
		v1.AddArg(y)
		v.AddArg(v1)
		return true
	}
	goto endc6bc83c506e491236ca66ea1081231a2
endc6bc83c506e491236ca66ea1081231a2:
	;
	return false
}
func rewriteValuegeneric_OpOr16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Or16 x x)
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end47a2f25fd31a76807aced3e2b126acdc
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end47a2f25fd31a76807aced3e2b126acdc
end47a2f25fd31a76807aced3e2b126acdc:
	;
	return false
}
func rewriteValuegeneric_OpOr32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Or32 x x)
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end231e283e568e90bd9a3e6a4fa328c8a4
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end231e283e568e90bd9a3e6a4fa328c8a4
end231e283e568e90bd9a3e6a4fa328c8a4:
	;
	return false
}
func rewriteValuegeneric_OpOr64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Or64 x x)
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end6b0efc212016dc97d0e3939db04c81d9
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end6b0efc212016dc97d0e3939db04c81d9
end6b0efc212016dc97d0e3939db04c81d9:
	;
	return false
}
func rewriteValuegeneric_OpOr8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Or8 x x)
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end05295dbfafd6869af79b4daee9fda000
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end05295dbfafd6869af79b4daee9fda000
end05295dbfafd6869af79b4daee9fda000:
	;
	return false
}
func rewriteValuegeneric_OpPtrIndex(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (PtrIndex <t> ptr idx)
	// cond: config.PtrSize == 4
	// result: (AddPtr ptr (Mul32 <config.fe.TypeInt()> idx (Const32 <config.fe.TypeInt()> [t.Elem().Size()])))
	{
		t := v.Type
		ptr := v.Args[0]
		idx := v.Args[1]
		if !(config.PtrSize == 4) {
			goto endd902622aaa1e7545b5a2a0c08b47d287
		}
		v.Op = OpAddPtr
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(ptr)
		v0 := b.NewValue0(v.Line, OpMul32, config.fe.TypeInt())
		v0.AddArg(idx)
		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
		v1.AuxInt = t.Elem().Size()
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	goto endd902622aaa1e7545b5a2a0c08b47d287
endd902622aaa1e7545b5a2a0c08b47d287:
	;
	// match: (PtrIndex <t> ptr idx)
	// cond: config.PtrSize == 8
	// result: (AddPtr ptr (Mul64 <config.fe.TypeInt()> idx (Const64 <config.fe.TypeInt()> [t.Elem().Size()])))
	{
		t := v.Type
		ptr := v.Args[0]
		idx := v.Args[1]
		if !(config.PtrSize == 8) {
			goto end47a5f1d1b158914fa383de024bbe3b08
		}
		v.Op = OpAddPtr
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(ptr)
		v0 := b.NewValue0(v.Line, OpMul64, config.fe.TypeInt())
		v0.AddArg(idx)
		v1 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
		v1.AuxInt = t.Elem().Size()
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	goto end47a5f1d1b158914fa383de024bbe3b08
end47a5f1d1b158914fa383de024bbe3b08:
	;
	return false
}
func rewriteValuegeneric_OpRsh16Ux16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh16Ux16 <t> x (Const16 [c]))
	// cond:
	// result: (Rsh16Ux64 x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto endd981df40f353104ef828d13ad4ccdf02
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh16Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto endd981df40f353104ef828d13ad4ccdf02
endd981df40f353104ef828d13ad4ccdf02:
	;
	return false
}
func rewriteValuegeneric_OpRsh16Ux32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh16Ux32 <t> x (Const32 [c]))
	// cond:
	// result: (Rsh16Ux64 x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto ende0be9ee562725206dcf96d3e5750b5ea
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh16Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto ende0be9ee562725206dcf96d3e5750b5ea
ende0be9ee562725206dcf96d3e5750b5ea:
	;
	return false
}
func rewriteValuegeneric_OpRsh16Ux64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh16Ux64 (Const16 [c]) (Const64 [d]))
	// cond:
	// result: (Const16 [int64(uint16(c) >> uint64(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto ended17f40375fb44bcbaf2d87161c5ed3c
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto ended17f40375fb44bcbaf2d87161c5ed3c
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = int64(uint16(c) >> uint64(d))
		return true
	}
	goto ended17f40375fb44bcbaf2d87161c5ed3c
ended17f40375fb44bcbaf2d87161c5ed3c:
	;
	// match: (Rsh16Ux64 x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end752d1b5a60f87afa7e40febbf1bce309
		}
		if v.Args[1].AuxInt != 0 {
			goto end752d1b5a60f87afa7e40febbf1bce309
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end752d1b5a60f87afa7e40febbf1bce309
end752d1b5a60f87afa7e40febbf1bce309:
	;
	// match: (Rsh16Ux64 _ (Const64 [c]))
	// cond: uint64(c) >= 16
	// result: (Const64 [0])
	{
		if v.Args[1].Op != OpConst64 {
			goto endca5c7ae2e51f2ae32486c2b1a3033b77
		}
		c := v.Args[1].AuxInt
		if !(uint64(c) >= 16) {
			goto endca5c7ae2e51f2ae32486c2b1a3033b77
		}
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto endca5c7ae2e51f2ae32486c2b1a3033b77
endca5c7ae2e51f2ae32486c2b1a3033b77:
	;
	// match: (Rsh16Ux64 <t> (Rsh16Ux64 x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Rsh16Ux64 x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpRsh16Ux64 {
			goto end56f2c0034c9fbe651abb36fb640af465
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto end56f2c0034c9fbe651abb36fb640af465
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end56f2c0034c9fbe651abb36fb640af465
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto end56f2c0034c9fbe651abb36fb640af465
		}
		v.Op = OpRsh16Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto end56f2c0034c9fbe651abb36fb640af465
end56f2c0034c9fbe651abb36fb640af465:
	;
	return false
}
func rewriteValuegeneric_OpRsh16Ux8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh16Ux8  <t> x (Const8 [c]))
	// cond:
	// result: (Rsh16Ux64 x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end20d4667094c32c71bac4e0805dab85c9
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh16Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto end20d4667094c32c71bac4e0805dab85c9
end20d4667094c32c71bac4e0805dab85c9:
	;
	return false
}
func rewriteValuegeneric_OpRsh16x16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh16x16  <t> x (Const16 [c]))
	// cond:
	// result: (Rsh16x64  x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end1b501c7ae2fe58ad3a88b467f2d95389
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh16x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto end1b501c7ae2fe58ad3a88b467f2d95389
end1b501c7ae2fe58ad3a88b467f2d95389:
	;
	return false
}
func rewriteValuegeneric_OpRsh16x32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh16x32  <t> x (Const32 [c]))
	// cond:
	// result: (Rsh16x64  x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto end4d3a41113d2d0b09924bf5759ca49cab
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh16x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto end4d3a41113d2d0b09924bf5759ca49cab
end4d3a41113d2d0b09924bf5759ca49cab:
	;
	return false
}
func rewriteValuegeneric_OpRsh16x64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh16x64  (Const16 [c]) (Const64 [d]))
	// cond:
	// result: (Const16 [int64(int16(c) >> uint64(d))])
	{
		if v.Args[0].Op != OpConst16 {
			goto end8f05fede35a3d2f687fcd4a5829a25ad
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end8f05fede35a3d2f687fcd4a5829a25ad
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = int64(int16(c) >> uint64(d))
		return true
	}
	goto end8f05fede35a3d2f687fcd4a5829a25ad
end8f05fede35a3d2f687fcd4a5829a25ad:
	;
	// match: (Rsh16x64  x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end750fafe01fcc689d953101d53efc19ab
		}
		if v.Args[1].AuxInt != 0 {
			goto end750fafe01fcc689d953101d53efc19ab
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end750fafe01fcc689d953101d53efc19ab
end750fafe01fcc689d953101d53efc19ab:
	;
	// match: (Rsh16x64 <t> (Rsh16x64 x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Rsh16x64 x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpRsh16x64 {
			goto endf425eff9e05aad27194af957e3383c76
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto endf425eff9e05aad27194af957e3383c76
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endf425eff9e05aad27194af957e3383c76
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto endf425eff9e05aad27194af957e3383c76
		}
		v.Op = OpRsh16x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto endf425eff9e05aad27194af957e3383c76
endf425eff9e05aad27194af957e3383c76:
	;
	return false
}
func rewriteValuegeneric_OpRsh16x8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh16x8   <t> x (Const8 [c]))
	// cond:
	// result: (Rsh16x64  x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end0b5e274d62a3ae8df9f4089756c6a9d4
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh16x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto end0b5e274d62a3ae8df9f4089756c6a9d4
end0b5e274d62a3ae8df9f4089756c6a9d4:
	;
	return false
}
func rewriteValuegeneric_OpRsh32Ux16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh32Ux16 <t> x (Const16 [c]))
	// cond:
	// result: (Rsh32Ux64 x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end8d8f9f3e2e1f7a5e9a186fb792fc40a8
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh32Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto end8d8f9f3e2e1f7a5e9a186fb792fc40a8
end8d8f9f3e2e1f7a5e9a186fb792fc40a8:
	;
	return false
}
func rewriteValuegeneric_OpRsh32Ux32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh32Ux32 <t> x (Const32 [c]))
	// cond:
	// result: (Rsh32Ux64 x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto endd23d060f74e00f34cc967b6fb9a4d320
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh32Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto endd23d060f74e00f34cc967b6fb9a4d320
endd23d060f74e00f34cc967b6fb9a4d320:
	;
	return false
}
func rewriteValuegeneric_OpRsh32Ux64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh32Ux64 (Const32 [c]) (Const64 [d]))
	// cond:
	// result: (Const32 [int64(uint32(c) >> uint64(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto enda101e6b765d7ecffd9b7410c9dc3be82
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto enda101e6b765d7ecffd9b7410c9dc3be82
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = int64(uint32(c) >> uint64(d))
		return true
	}
	goto enda101e6b765d7ecffd9b7410c9dc3be82
enda101e6b765d7ecffd9b7410c9dc3be82:
	;
	// match: (Rsh32Ux64 x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end162e4e182a665d4e6f0d85fe131e7288
		}
		if v.Args[1].AuxInt != 0 {
			goto end162e4e182a665d4e6f0d85fe131e7288
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end162e4e182a665d4e6f0d85fe131e7288
end162e4e182a665d4e6f0d85fe131e7288:
	;
	// match: (Rsh32Ux64 _ (Const64 [c]))
	// cond: uint64(c) >= 32
	// result: (Const64 [0])
	{
		if v.Args[1].Op != OpConst64 {
			goto endca322c370839b4264b219ee042a6ab33
		}
		c := v.Args[1].AuxInt
		if !(uint64(c) >= 32) {
			goto endca322c370839b4264b219ee042a6ab33
		}
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto endca322c370839b4264b219ee042a6ab33
endca322c370839b4264b219ee042a6ab33:
	;
	// match: (Rsh32Ux64 <t> (Rsh32Ux64 x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Rsh32Ux64 x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpRsh32Ux64 {
			goto end2e502d68a32663142684194adbe6c297
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto end2e502d68a32663142684194adbe6c297
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end2e502d68a32663142684194adbe6c297
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto end2e502d68a32663142684194adbe6c297
		}
		v.Op = OpRsh32Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto end2e502d68a32663142684194adbe6c297
end2e502d68a32663142684194adbe6c297:
	;
	return false
}
func rewriteValuegeneric_OpRsh32Ux8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh32Ux8  <t> x (Const8 [c]))
	// cond:
	// result: (Rsh32Ux64 x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end967cea80158afaffb783f6da7aa898ca
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh32Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto end967cea80158afaffb783f6da7aa898ca
end967cea80158afaffb783f6da7aa898ca:
	;
	return false
}
func rewriteValuegeneric_OpRsh32x16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh32x16  <t> x (Const16 [c]))
	// cond:
	// result: (Rsh32x64  x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end6a62ebdcc98ea2e3214559214708d26a
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh32x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto end6a62ebdcc98ea2e3214559214708d26a
end6a62ebdcc98ea2e3214559214708d26a:
	;
	return false
}
func rewriteValuegeneric_OpRsh32x32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh32x32  <t> x (Const32 [c]))
	// cond:
	// result: (Rsh32x64  x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto end6e3b467acdca74f58e9177fb42a1968b
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh32x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto end6e3b467acdca74f58e9177fb42a1968b
end6e3b467acdca74f58e9177fb42a1968b:
	;
	return false
}
func rewriteValuegeneric_OpRsh32x64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh32x64  (Const32 [c]) (Const64 [d]))
	// cond:
	// result: (Const32 [int64(int32(c) >> uint64(d))])
	{
		if v.Args[0].Op != OpConst32 {
			goto end7e4b8c499cffe1fef73a16e6be54d4d2
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end7e4b8c499cffe1fef73a16e6be54d4d2
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = int64(int32(c) >> uint64(d))
		return true
	}
	goto end7e4b8c499cffe1fef73a16e6be54d4d2
end7e4b8c499cffe1fef73a16e6be54d4d2:
	;
	// match: (Rsh32x64  x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end72da2611eaaffe407efa1cc45c23ade3
		}
		if v.Args[1].AuxInt != 0 {
			goto end72da2611eaaffe407efa1cc45c23ade3
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end72da2611eaaffe407efa1cc45c23ade3
end72da2611eaaffe407efa1cc45c23ade3:
	;
	// match: (Rsh32x64 <t> (Rsh32x64 x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Rsh32x64 x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpRsh32x64 {
			goto endadb415be78ee46a8a4135ec50df772b0
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto endadb415be78ee46a8a4135ec50df772b0
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endadb415be78ee46a8a4135ec50df772b0
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto endadb415be78ee46a8a4135ec50df772b0
		}
		v.Op = OpRsh32x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto endadb415be78ee46a8a4135ec50df772b0
endadb415be78ee46a8a4135ec50df772b0:
	;
	return false
}
func rewriteValuegeneric_OpRsh32x8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh32x8   <t> x (Const8 [c]))
	// cond:
	// result: (Rsh32x64  x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end7b59b42c5c68a2d55be469a0c086dd8b
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh32x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto end7b59b42c5c68a2d55be469a0c086dd8b
end7b59b42c5c68a2d55be469a0c086dd8b:
	;
	return false
}
func rewriteValuegeneric_OpRsh64Ux16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh64Ux16 <t> x (Const16 [c]))
	// cond:
	// result: (Rsh64Ux64 x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end733d85a7b599bcba969ca1cb4bdb9e48
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh64Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto end733d85a7b599bcba969ca1cb4bdb9e48
end733d85a7b599bcba969ca1cb4bdb9e48:
	;
	return false
}
func rewriteValuegeneric_OpRsh64Ux32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh64Ux32 <t> x (Const32 [c]))
	// cond:
	// result: (Rsh64Ux64 x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto endeac7b34169de1fb0393b833e65b9bb19
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh64Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto endeac7b34169de1fb0393b833e65b9bb19
endeac7b34169de1fb0393b833e65b9bb19:
	;
	return false
}
func rewriteValuegeneric_OpRsh64Ux64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh64Ux64 (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (Const64 [int64(uint64(c) >> uint64(d))])
	{
		if v.Args[0].Op != OpConst64 {
			goto end102f4cfd7979a2aa222d52c34ac6802d
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end102f4cfd7979a2aa222d52c34ac6802d
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = int64(uint64(c) >> uint64(d))
		return true
	}
	goto end102f4cfd7979a2aa222d52c34ac6802d
end102f4cfd7979a2aa222d52c34ac6802d:
	;
	// match: (Rsh64Ux64 x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end5ad037b910698f2847df90177c23a6ac
		}
		if v.Args[1].AuxInt != 0 {
			goto end5ad037b910698f2847df90177c23a6ac
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end5ad037b910698f2847df90177c23a6ac
end5ad037b910698f2847df90177c23a6ac:
	;
	// match: (Rsh64Ux64 _ (Const64 [c]))
	// cond: uint64(c) >= 64
	// result: (Const64 [0])
	{
		if v.Args[1].Op != OpConst64 {
			goto end16ea16aa61862207ea64e514369d608b
		}
		c := v.Args[1].AuxInt
		if !(uint64(c) >= 64) {
			goto end16ea16aa61862207ea64e514369d608b
		}
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end16ea16aa61862207ea64e514369d608b
end16ea16aa61862207ea64e514369d608b:
	;
	// match: (Rsh64Ux64 <t> (Rsh64Ux64 x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Rsh64Ux64 x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpRsh64Ux64 {
			goto end32bfdb1b4ccc23a5cd62fc0348ebd877
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto end32bfdb1b4ccc23a5cd62fc0348ebd877
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end32bfdb1b4ccc23a5cd62fc0348ebd877
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto end32bfdb1b4ccc23a5cd62fc0348ebd877
		}
		v.Op = OpRsh64Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto end32bfdb1b4ccc23a5cd62fc0348ebd877
end32bfdb1b4ccc23a5cd62fc0348ebd877:
	;
	return false
}
func rewriteValuegeneric_OpRsh64Ux8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh64Ux8  <t> x (Const8 [c]))
	// cond:
	// result: (Rsh64Ux64 x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto ende3d8090a67a52dbcd24b52ee32c9d7f0
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh64Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto ende3d8090a67a52dbcd24b52ee32c9d7f0
ende3d8090a67a52dbcd24b52ee32c9d7f0:
	;
	return false
}
func rewriteValuegeneric_OpRsh64x16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh64x16  <t> x (Const16 [c]))
	// cond:
	// result: (Rsh64x64  x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto endd5151d0bfc38c55ae6ae6836014df3bc
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh64x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto endd5151d0bfc38c55ae6ae6836014df3bc
endd5151d0bfc38c55ae6ae6836014df3bc:
	;
	return false
}
func rewriteValuegeneric_OpRsh64x32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh64x32  <t> x (Const32 [c]))
	// cond:
	// result: (Rsh64x64  x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto end0f2dbca5c7d6b100890c94a97bf0de7c
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh64x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto end0f2dbca5c7d6b100890c94a97bf0de7c
end0f2dbca5c7d6b100890c94a97bf0de7c:
	;
	return false
}
func rewriteValuegeneric_OpRsh64x64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh64x64  (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (Const64 [c >> uint64(d)])
	{
		if v.Args[0].Op != OpConst64 {
			goto endfa4609d6bea8a3e3d3a777b1968c97d9
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endfa4609d6bea8a3e3d3a777b1968c97d9
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c >> uint64(d)
		return true
	}
	goto endfa4609d6bea8a3e3d3a777b1968c97d9
endfa4609d6bea8a3e3d3a777b1968c97d9:
	;
	// match: (Rsh64x64  x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto ende62e0c67d3f04eb221646371a2a91d05
		}
		if v.Args[1].AuxInt != 0 {
			goto ende62e0c67d3f04eb221646371a2a91d05
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto ende62e0c67d3f04eb221646371a2a91d05
ende62e0c67d3f04eb221646371a2a91d05:
	;
	// match: (Rsh64x64 <t> (Rsh64x64 x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Rsh64x64 x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpRsh64x64 {
			goto endd3e8ea66dc3ad0bc393001d6babb7160
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto endd3e8ea66dc3ad0bc393001d6babb7160
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endd3e8ea66dc3ad0bc393001d6babb7160
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto endd3e8ea66dc3ad0bc393001d6babb7160
		}
		v.Op = OpRsh64x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto endd3e8ea66dc3ad0bc393001d6babb7160
endd3e8ea66dc3ad0bc393001d6babb7160:
	;
	return false
}
func rewriteValuegeneric_OpRsh64x8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh64x8   <t> x (Const8 [c]))
	// cond:
	// result: (Rsh64x64  x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end1a9e5a89849344396210da7c7ec810be
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh64x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto end1a9e5a89849344396210da7c7ec810be
end1a9e5a89849344396210da7c7ec810be:
	;
	return false
}
func rewriteValuegeneric_OpRsh8Ux16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh8Ux16 <t> x (Const16 [c]))
	// cond:
	// result: (Rsh8Ux64 x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end7acc015610273092e9efcce2949ee0f9
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh8Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto end7acc015610273092e9efcce2949ee0f9
end7acc015610273092e9efcce2949ee0f9:
	;
	return false
}
func rewriteValuegeneric_OpRsh8Ux32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh8Ux32 <t> x (Const32 [c]))
	// cond:
	// result: (Rsh8Ux64 x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto end27e9b4472e085b653a105b1d67554ce8
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh8Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto end27e9b4472e085b653a105b1d67554ce8
end27e9b4472e085b653a105b1d67554ce8:
	;
	return false
}
func rewriteValuegeneric_OpRsh8Ux64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh8Ux64  (Const8  [c]) (Const64 [d]))
	// cond:
	// result: (Const8  [int64(uint8(c) >> uint64(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto enddd166e450d81ba7b466d61d2fbec178c
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto enddd166e450d81ba7b466d61d2fbec178c
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = int64(uint8(c) >> uint64(d))
		return true
	}
	goto enddd166e450d81ba7b466d61d2fbec178c
enddd166e450d81ba7b466d61d2fbec178c:
	;
	// match: (Rsh8Ux64  x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end570cb1d9db3c7bebd85e485eeb2c0969
		}
		if v.Args[1].AuxInt != 0 {
			goto end570cb1d9db3c7bebd85e485eeb2c0969
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end570cb1d9db3c7bebd85e485eeb2c0969
end570cb1d9db3c7bebd85e485eeb2c0969:
	;
	// match: (Rsh8Ux64  _ (Const64 [c]))
	// cond: uint64(c) >= 8
	// result: (Const64 [0])
	{
		if v.Args[1].Op != OpConst64 {
			goto endb63e1a7d1d91716ca0d9d74215361323
		}
		c := v.Args[1].AuxInt
		if !(uint64(c) >= 8) {
			goto endb63e1a7d1d91716ca0d9d74215361323
		}
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto endb63e1a7d1d91716ca0d9d74215361323
endb63e1a7d1d91716ca0d9d74215361323:
	;
	// match: (Rsh8Ux64  <t> (Rsh8Ux64  x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Rsh8Ux64  x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpRsh8Ux64 {
			goto endee8824b7071ed1a6dba4fcbaab98229e
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto endee8824b7071ed1a6dba4fcbaab98229e
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto endee8824b7071ed1a6dba4fcbaab98229e
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto endee8824b7071ed1a6dba4fcbaab98229e
		}
		v.Op = OpRsh8Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto endee8824b7071ed1a6dba4fcbaab98229e
endee8824b7071ed1a6dba4fcbaab98229e:
	;
	return false
}
func rewriteValuegeneric_OpRsh8Ux8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh8Ux8  <t> x (Const8 [c]))
	// cond:
	// result: (Rsh8Ux64 x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto ended7e4f4d9ab89dc26e6649d466577930
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh8Ux64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto ended7e4f4d9ab89dc26e6649d466577930
ended7e4f4d9ab89dc26e6649d466577930:
	;
	return false
}
func rewriteValuegeneric_OpRsh8x16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh8x16  <t> x (Const16 [c]))
	// cond:
	// result: (Rsh8x64  x (Const64 <t> [int64(uint16(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end136bef6f60180bc8b4befbfc370af7ef
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh8x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint16(c))
		v.AddArg(v0)
		return true
	}
	goto end136bef6f60180bc8b4befbfc370af7ef
end136bef6f60180bc8b4befbfc370af7ef:
	;
	return false
}
func rewriteValuegeneric_OpRsh8x32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh8x32  <t> x (Const32 [c]))
	// cond:
	// result: (Rsh8x64  x (Const64 <t> [int64(uint32(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto end2ef95c222a7c552fa9cc86e36196644e
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh8x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint32(c))
		v.AddArg(v0)
		return true
	}
	goto end2ef95c222a7c552fa9cc86e36196644e
end2ef95c222a7c552fa9cc86e36196644e:
	;
	return false
}
func rewriteValuegeneric_OpRsh8x64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh8x64   (Const8  [c]) (Const64 [d]))
	// cond:
	// result: (Const8  [int64(int8(c) >> uint64(d))])
	{
		if v.Args[0].Op != OpConst8 {
			goto end3b90206d75365466dfd1368e5b69db35
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end3b90206d75365466dfd1368e5b69db35
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = int64(int8(c) >> uint64(d))
		return true
	}
	goto end3b90206d75365466dfd1368e5b69db35
end3b90206d75365466dfd1368e5b69db35:
	;
	// match: (Rsh8x64   x (Const64 [0]))
	// cond:
	// result: x
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto end1e664cc720a11d1c769de8081cfa1de4
		}
		if v.Args[1].AuxInt != 0 {
			goto end1e664cc720a11d1c769de8081cfa1de4
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end1e664cc720a11d1c769de8081cfa1de4
end1e664cc720a11d1c769de8081cfa1de4:
	;
	// match: (Rsh8x64  <t> (Rsh8x64  x (Const64 [c])) (Const64 [d]))
	// cond: !uaddOvf(c,d)
	// result: (Rsh8x64  x (Const64 <t> [c+d]))
	{
		t := v.Type
		if v.Args[0].Op != OpRsh8x64 {
			goto end6408685a7276af7e76ec086f359c942c
		}
		x := v.Args[0].Args[0]
		if v.Args[0].Args[1].Op != OpConst64 {
			goto end6408685a7276af7e76ec086f359c942c
		}
		c := v.Args[0].Args[1].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end6408685a7276af7e76ec086f359c942c
		}
		d := v.Args[1].AuxInt
		if !(!uaddOvf(c, d)) {
			goto end6408685a7276af7e76ec086f359c942c
		}
		v.Op = OpRsh8x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = c + d
		v.AddArg(v0)
		return true
	}
	goto end6408685a7276af7e76ec086f359c942c
end6408685a7276af7e76ec086f359c942c:
	;
	return false
}
func rewriteValuegeneric_OpRsh8x8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Rsh8x8   <t> x (Const8 [c]))
	// cond:
	// result: (Rsh8x64  x (Const64 <t> [int64(uint8(c))]))
	{
		t := v.Type
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto endae44f60f364cddd8903763dd921a007e
		}
		c := v.Args[1].AuxInt
		v.Op = OpRsh8x64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(x)
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = int64(uint8(c))
		v.AddArg(v0)
		return true
	}
	goto endae44f60f364cddd8903763dd921a007e
endae44f60f364cddd8903763dd921a007e:
	;
	return false
}
func rewriteValuegeneric_OpSliceCap(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (SliceCap (SliceMake _ _ cap))
	// cond:
	// result: cap
	{
		if v.Args[0].Op != OpSliceMake {
			goto end1bd11616743632b33b410964667fb3c6
		}
		cap := v.Args[0].Args[2]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = cap.Type
		v.AddArg(cap)
		return true
	}
	goto end1bd11616743632b33b410964667fb3c6
end1bd11616743632b33b410964667fb3c6:
	;
	return false
}
func rewriteValuegeneric_OpSliceLen(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (SliceLen (SliceMake _ len _))
	// cond:
	// result: len
	{
		if v.Args[0].Op != OpSliceMake {
			goto endebb2090199d13e4c2ae52fb3e778f7fd
		}
		len := v.Args[0].Args[1]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = len.Type
		v.AddArg(len)
		return true
	}
	goto endebb2090199d13e4c2ae52fb3e778f7fd
endebb2090199d13e4c2ae52fb3e778f7fd:
	;
	return false
}
func rewriteValuegeneric_OpSlicePtr(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (SlicePtr (SliceMake ptr _ _ ))
	// cond:
	// result: ptr
	{
		if v.Args[0].Op != OpSliceMake {
			goto end526acc0a705137a5d25577499206720b
		}
		ptr := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = ptr.Type
		v.AddArg(ptr)
		return true
	}
	goto end526acc0a705137a5d25577499206720b
end526acc0a705137a5d25577499206720b:
	;
	return false
}
func rewriteValuegeneric_OpStore(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Store _ (StructMake0) mem)
	// cond:
	// result: mem
	{
		if v.Args[1].Op != OpStructMake0 {
			goto endd4f364b0adfc229d8c200af183d4c808
		}
		mem := v.Args[2]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = mem.Type
		v.AddArg(mem)
		return true
	}
	goto endd4f364b0adfc229d8c200af183d4c808
endd4f364b0adfc229d8c200af183d4c808:
	;
	// match: (Store dst (StructMake1 <t> f0) mem)
	// cond:
	// result: (Store [t.FieldType(0).Size()] dst f0 mem)
	{
		dst := v.Args[0]
		if v.Args[1].Op != OpStructMake1 {
			goto end2cff6d06f4440132f48ca374b6b1e9d8
		}
		t := v.Args[1].Type
		f0 := v.Args[1].Args[0]
		mem := v.Args[2]
		v.Op = OpStore
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = t.FieldType(0).Size()
		v.AddArg(dst)
		v.AddArg(f0)
		v.AddArg(mem)
		return true
	}
	goto end2cff6d06f4440132f48ca374b6b1e9d8
end2cff6d06f4440132f48ca374b6b1e9d8:
	;
	// match: (Store dst (StructMake2 <t> f0 f1) mem)
	// cond:
	// result: (Store [t.FieldType(1).Size()]     (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst)     f1     (Store [t.FieldType(0).Size()] dst f0 mem))
	{
		dst := v.Args[0]
		if v.Args[1].Op != OpStructMake2 {
			goto end4e8ede6cc575a287795971da6b637973
		}
		t := v.Args[1].Type
		f0 := v.Args[1].Args[0]
		f1 := v.Args[1].Args[1]
		mem := v.Args[2]
		v.Op = OpStore
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = t.FieldType(1).Size()
		v0 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
		v0.AuxInt = t.FieldOff(1)
		v0.AddArg(dst)
		v.AddArg(v0)
		v.AddArg(f1)
		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
		v1.AuxInt = t.FieldType(0).Size()
		v1.AddArg(dst)
		v1.AddArg(f0)
		v1.AddArg(mem)
		v.AddArg(v1)
		return true
	}
	goto end4e8ede6cc575a287795971da6b637973
end4e8ede6cc575a287795971da6b637973:
	;
	// match: (Store dst (StructMake3 <t> f0 f1 f2) mem)
	// cond:
	// result: (Store [t.FieldType(2).Size()]     (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] dst)     f2     (Store [t.FieldType(1).Size()]       (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst)       f1       (Store [t.FieldType(0).Size()] dst f0 mem)))
	{
		dst := v.Args[0]
		if v.Args[1].Op != OpStructMake3 {
			goto end6ad675267724a87c8f852dd1e185e911
		}
		t := v.Args[1].Type
		f0 := v.Args[1].Args[0]
		f1 := v.Args[1].Args[1]
		f2 := v.Args[1].Args[2]
		mem := v.Args[2]
		v.Op = OpStore
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = t.FieldType(2).Size()
		v0 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
		v0.AuxInt = t.FieldOff(2)
		v0.AddArg(dst)
		v.AddArg(v0)
		v.AddArg(f2)
		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
		v1.AuxInt = t.FieldType(1).Size()
		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
		v2.AuxInt = t.FieldOff(1)
		v2.AddArg(dst)
		v1.AddArg(v2)
		v1.AddArg(f1)
		v3 := b.NewValue0(v.Line, OpStore, TypeMem)
		v3.AuxInt = t.FieldType(0).Size()
		v3.AddArg(dst)
		v3.AddArg(f0)
		v3.AddArg(mem)
		v1.AddArg(v3)
		v.AddArg(v1)
		return true
	}
	goto end6ad675267724a87c8f852dd1e185e911
end6ad675267724a87c8f852dd1e185e911:
	;
	// match: (Store dst (StructMake4 <t> f0 f1 f2 f3) mem)
	// cond:
	// result: (Store [t.FieldType(3).Size()]     (OffPtr <t.FieldType(3).PtrTo()> [t.FieldOff(3)] dst)     f3     (Store [t.FieldType(2).Size()]       (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] dst)       f2       (Store [t.FieldType(1).Size()]         (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst)         f1         (Store [t.FieldType(0).Size()] dst f0 mem))))
	{
		dst := v.Args[0]
		if v.Args[1].Op != OpStructMake4 {
			goto end7ea91abd44794f7653374502a5a405ea
		}
		t := v.Args[1].Type
		f0 := v.Args[1].Args[0]
		f1 := v.Args[1].Args[1]
		f2 := v.Args[1].Args[2]
		f3 := v.Args[1].Args[3]
		mem := v.Args[2]
		v.Op = OpStore
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = t.FieldType(3).Size()
		v0 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(3).PtrTo())
		v0.AuxInt = t.FieldOff(3)
		v0.AddArg(dst)
		v.AddArg(v0)
		v.AddArg(f3)
		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
		v1.AuxInt = t.FieldType(2).Size()
		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
		v2.AuxInt = t.FieldOff(2)
		v2.AddArg(dst)
		v1.AddArg(v2)
		v1.AddArg(f2)
		v3 := b.NewValue0(v.Line, OpStore, TypeMem)
		v3.AuxInt = t.FieldType(1).Size()
		v4 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
		v4.AuxInt = t.FieldOff(1)
		v4.AddArg(dst)
		v3.AddArg(v4)
		v3.AddArg(f1)
		v5 := b.NewValue0(v.Line, OpStore, TypeMem)
		v5.AuxInt = t.FieldType(0).Size()
		v5.AddArg(dst)
		v5.AddArg(f0)
		v5.AddArg(mem)
		v3.AddArg(v5)
		v1.AddArg(v3)
		v.AddArg(v1)
		return true
	}
	goto end7ea91abd44794f7653374502a5a405ea
end7ea91abd44794f7653374502a5a405ea:
	;
	// match: (Store [8] dst (ComplexMake real imag) mem)
	// cond:
	// result: (Store [4]     (OffPtr <config.fe.TypeFloat32().PtrTo()> [4] dst)     imag     (Store [4] dst real mem))
	{
		if v.AuxInt != 8 {
			goto endced898cb0a165662afe48ea44ad3318a
		}
		dst := v.Args[0]
		if v.Args[1].Op != OpComplexMake {
			goto endced898cb0a165662afe48ea44ad3318a
		}
		real := v.Args[1].Args[0]
		imag := v.Args[1].Args[1]
		mem := v.Args[2]
		v.Op = OpStore
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 4
		v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat32().PtrTo())
		v0.AuxInt = 4
		v0.AddArg(dst)
		v.AddArg(v0)
		v.AddArg(imag)
		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
		v1.AuxInt = 4
		v1.AddArg(dst)
		v1.AddArg(real)
		v1.AddArg(mem)
		v.AddArg(v1)
		return true
	}
	goto endced898cb0a165662afe48ea44ad3318a
endced898cb0a165662afe48ea44ad3318a:
	;
	// match: (Store [16] dst (ComplexMake real imag) mem)
	// cond:
	// result: (Store [8]     (OffPtr <config.fe.TypeFloat64().PtrTo()> [8] dst)     imag     (Store [8] dst real mem))
	{
		if v.AuxInt != 16 {
			goto end3851a482d7bd37a93c4d81581e85b3ab
		}
		dst := v.Args[0]
		if v.Args[1].Op != OpComplexMake {
			goto end3851a482d7bd37a93c4d81581e85b3ab
		}
		real := v.Args[1].Args[0]
		imag := v.Args[1].Args[1]
		mem := v.Args[2]
		v.Op = OpStore
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 8
		v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat64().PtrTo())
		v0.AuxInt = 8
		v0.AddArg(dst)
		v.AddArg(v0)
		v.AddArg(imag)
		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
		v1.AuxInt = 8
		v1.AddArg(dst)
		v1.AddArg(real)
		v1.AddArg(mem)
		v.AddArg(v1)
		return true
	}
	goto end3851a482d7bd37a93c4d81581e85b3ab
end3851a482d7bd37a93c4d81581e85b3ab:
	;
	// match: (Store [2*config.PtrSize] dst (StringMake ptr len) mem)
	// cond:
	// result: (Store [config.PtrSize]     (OffPtr <config.fe.TypeInt().PtrTo()> [config.PtrSize] dst)     len     (Store [config.PtrSize] dst ptr mem))
	{
		if v.AuxInt != 2*config.PtrSize {
			goto endd3a6ecebdad5899570a79fe5c62f34f1
		}
		dst := v.Args[0]
		if v.Args[1].Op != OpStringMake {
			goto endd3a6ecebdad5899570a79fe5c62f34f1
		}
		ptr := v.Args[1].Args[0]
		len := v.Args[1].Args[1]
		mem := v.Args[2]
		v.Op = OpStore
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = config.PtrSize
		v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
		v0.AuxInt = config.PtrSize
		v0.AddArg(dst)
		v.AddArg(v0)
		v.AddArg(len)
		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
		v1.AuxInt = config.PtrSize
		v1.AddArg(dst)
		v1.AddArg(ptr)
		v1.AddArg(mem)
		v.AddArg(v1)
		return true
	}
	goto endd3a6ecebdad5899570a79fe5c62f34f1
endd3a6ecebdad5899570a79fe5c62f34f1:
	;
	// match: (Store [3*config.PtrSize] dst (SliceMake ptr len cap) mem)
	// cond:
	// result: (Store [config.PtrSize]     (OffPtr <config.fe.TypeInt().PtrTo()> [2*config.PtrSize] dst)     cap     (Store [config.PtrSize]       (OffPtr <config.fe.TypeInt().PtrTo()> [config.PtrSize] dst)       len       (Store [config.PtrSize] dst ptr mem)))
	{
		if v.AuxInt != 3*config.PtrSize {
			goto endd5cc8c3dad7d24c845b0b88fc51487ae
		}
		dst := v.Args[0]
		if v.Args[1].Op != OpSliceMake {
			goto endd5cc8c3dad7d24c845b0b88fc51487ae
		}
		ptr := v.Args[1].Args[0]
		len := v.Args[1].Args[1]
		cap := v.Args[1].Args[2]
		mem := v.Args[2]
		v.Op = OpStore
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = config.PtrSize
		v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
		v0.AuxInt = 2 * config.PtrSize
		v0.AddArg(dst)
		v.AddArg(v0)
		v.AddArg(cap)
		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
		v1.AuxInt = config.PtrSize
		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
		v2.AuxInt = config.PtrSize
		v2.AddArg(dst)
		v1.AddArg(v2)
		v1.AddArg(len)
		v3 := b.NewValue0(v.Line, OpStore, TypeMem)
		v3.AuxInt = config.PtrSize
		v3.AddArg(dst)
		v3.AddArg(ptr)
		v3.AddArg(mem)
		v1.AddArg(v3)
		v.AddArg(v1)
		return true
	}
	goto endd5cc8c3dad7d24c845b0b88fc51487ae
endd5cc8c3dad7d24c845b0b88fc51487ae:
	;
	// match: (Store [2*config.PtrSize] dst (IMake itab data) mem)
	// cond:
	// result: (Store [config.PtrSize]     (OffPtr <config.fe.TypeBytePtr().PtrTo()> [config.PtrSize] dst)     data     (Store [config.PtrSize] dst itab mem))
	{
		if v.AuxInt != 2*config.PtrSize {
			goto endaa801a871178ae3256b3f6f5d9f13514
		}
		dst := v.Args[0]
		if v.Args[1].Op != OpIMake {
			goto endaa801a871178ae3256b3f6f5d9f13514
		}
		itab := v.Args[1].Args[0]
		data := v.Args[1].Args[1]
		mem := v.Args[2]
		v.Op = OpStore
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = config.PtrSize
		v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeBytePtr().PtrTo())
		v0.AuxInt = config.PtrSize
		v0.AddArg(dst)
		v.AddArg(v0)
		v.AddArg(data)
		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
		v1.AuxInt = config.PtrSize
		v1.AddArg(dst)
		v1.AddArg(itab)
		v1.AddArg(mem)
		v.AddArg(v1)
		return true
	}
	goto endaa801a871178ae3256b3f6f5d9f13514
endaa801a871178ae3256b3f6f5d9f13514:
	;
	// match: (Store [size] dst (Load <t> src mem) mem)
	// cond: !config.fe.CanSSA(t)
	// result: (Move [size] dst src mem)
	{
		size := v.AuxInt
		dst := v.Args[0]
		if v.Args[1].Op != OpLoad {
			goto end45295326269ba18413dceb7b608a0b9d
		}
		t := v.Args[1].Type
		src := v.Args[1].Args[0]
		mem := v.Args[1].Args[1]
		if v.Args[2] != mem {
			goto end45295326269ba18413dceb7b608a0b9d
		}
		if !(!config.fe.CanSSA(t)) {
			goto end45295326269ba18413dceb7b608a0b9d
		}
		v.Op = OpMove
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = size
		v.AddArg(dst)
		v.AddArg(src)
		v.AddArg(mem)
		return true
	}
	goto end45295326269ba18413dceb7b608a0b9d
end45295326269ba18413dceb7b608a0b9d:
	;
	// match: (Store [size] dst (Load <t> src mem) (VarDef {x} mem))
	// cond: !config.fe.CanSSA(t)
	// result: (Move [size] dst src (VarDef {x} mem))
	{
		size := v.AuxInt
		dst := v.Args[0]
		if v.Args[1].Op != OpLoad {
			goto end7f3cc0baffb82ba3ee879599b189a512
		}
		t := v.Args[1].Type
		src := v.Args[1].Args[0]
		mem := v.Args[1].Args[1]
		if v.Args[2].Op != OpVarDef {
			goto end7f3cc0baffb82ba3ee879599b189a512
		}
		x := v.Args[2].Aux
		if v.Args[2].Args[0] != mem {
			goto end7f3cc0baffb82ba3ee879599b189a512
		}
		if !(!config.fe.CanSSA(t)) {
			goto end7f3cc0baffb82ba3ee879599b189a512
		}
		v.Op = OpMove
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = size
		v.AddArg(dst)
		v.AddArg(src)
		v0 := b.NewValue0(v.Line, OpVarDef, TypeMem)
		v0.Aux = x
		v0.AddArg(mem)
		v.AddArg(v0)
		return true
	}
	goto end7f3cc0baffb82ba3ee879599b189a512
end7f3cc0baffb82ba3ee879599b189a512:
	;
	return false
}
func rewriteValuegeneric_OpStringLen(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (StringLen (StringMake _ len))
	// cond:
	// result: len
	{
		if v.Args[0].Op != OpStringMake {
			goto end0d922460b7e5ca88324034f4bd6c027c
		}
		len := v.Args[0].Args[1]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = len.Type
		v.AddArg(len)
		return true
	}
	goto end0d922460b7e5ca88324034f4bd6c027c
end0d922460b7e5ca88324034f4bd6c027c:
	;
	return false
}
func rewriteValuegeneric_OpStringPtr(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (StringPtr (StringMake ptr _))
	// cond:
	// result: ptr
	{
		if v.Args[0].Op != OpStringMake {
			goto end061edc5d85c73ad909089af2556d9380
		}
		ptr := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = ptr.Type
		v.AddArg(ptr)
		return true
	}
	goto end061edc5d85c73ad909089af2556d9380
end061edc5d85c73ad909089af2556d9380:
	;
	return false
}
func rewriteValuegeneric_OpStructSelect(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (StructSelect (StructMake1 x))
	// cond:
	// result: x
	{
		if v.Args[0].Op != OpStructMake1 {
			goto end17af582e7eba5216b4a51fe6c9206d3c
		}
		x := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end17af582e7eba5216b4a51fe6c9206d3c
end17af582e7eba5216b4a51fe6c9206d3c:
	;
	// match: (StructSelect [0] (StructMake2 x _))
	// cond:
	// result: x
	{
		if v.AuxInt != 0 {
			goto end355cfff99c8e9af975c3ae450d49b7f9
		}
		if v.Args[0].Op != OpStructMake2 {
			goto end355cfff99c8e9af975c3ae450d49b7f9
		}
		x := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end355cfff99c8e9af975c3ae450d49b7f9
end355cfff99c8e9af975c3ae450d49b7f9:
	;
	// match: (StructSelect [1] (StructMake2 _ x))
	// cond:
	// result: x
	{
		if v.AuxInt != 1 {
			goto end69baa65e494ef9ae154e0943b53734f9
		}
		if v.Args[0].Op != OpStructMake2 {
			goto end69baa65e494ef9ae154e0943b53734f9
		}
		x := v.Args[0].Args[1]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end69baa65e494ef9ae154e0943b53734f9
end69baa65e494ef9ae154e0943b53734f9:
	;
	// match: (StructSelect [0] (StructMake3 x _ _))
	// cond:
	// result: x
	{
		if v.AuxInt != 0 {
			goto endb0d98e2c46bb51c9abd4c3543392e0ec
		}
		if v.Args[0].Op != OpStructMake3 {
			goto endb0d98e2c46bb51c9abd4c3543392e0ec
		}
		x := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto endb0d98e2c46bb51c9abd4c3543392e0ec
endb0d98e2c46bb51c9abd4c3543392e0ec:
	;
	// match: (StructSelect [1] (StructMake3 _ x _))
	// cond:
	// result: x
	{
		if v.AuxInt != 1 {
			goto end2e40457286d26c2f14ad4fd127946773
		}
		if v.Args[0].Op != OpStructMake3 {
			goto end2e40457286d26c2f14ad4fd127946773
		}
		x := v.Args[0].Args[1]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end2e40457286d26c2f14ad4fd127946773
end2e40457286d26c2f14ad4fd127946773:
	;
	// match: (StructSelect [2] (StructMake3 _ _ x))
	// cond:
	// result: x
	{
		if v.AuxInt != 2 {
			goto end3e3b96ad431206175d002ece87aa1409
		}
		if v.Args[0].Op != OpStructMake3 {
			goto end3e3b96ad431206175d002ece87aa1409
		}
		x := v.Args[0].Args[2]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end3e3b96ad431206175d002ece87aa1409
end3e3b96ad431206175d002ece87aa1409:
	;
	// match: (StructSelect [0] (StructMake4 x _ _ _))
	// cond:
	// result: x
	{
		if v.AuxInt != 0 {
			goto end09f8a1ffa3d8c3124bc6d4083b941108
		}
		if v.Args[0].Op != OpStructMake4 {
			goto end09f8a1ffa3d8c3124bc6d4083b941108
		}
		x := v.Args[0].Args[0]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end09f8a1ffa3d8c3124bc6d4083b941108
end09f8a1ffa3d8c3124bc6d4083b941108:
	;
	// match: (StructSelect [1] (StructMake4 _ x _ _))
	// cond:
	// result: x
	{
		if v.AuxInt != 1 {
			goto endd3ef25e605a927e9251be6d9221f4acf
		}
		if v.Args[0].Op != OpStructMake4 {
			goto endd3ef25e605a927e9251be6d9221f4acf
		}
		x := v.Args[0].Args[1]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto endd3ef25e605a927e9251be6d9221f4acf
endd3ef25e605a927e9251be6d9221f4acf:
	;
	// match: (StructSelect [2] (StructMake4 _ _ x _))
	// cond:
	// result: x
	{
		if v.AuxInt != 2 {
			goto end0438e22cc8f41123fa42009a81ee723a
		}
		if v.Args[0].Op != OpStructMake4 {
			goto end0438e22cc8f41123fa42009a81ee723a
		}
		x := v.Args[0].Args[2]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end0438e22cc8f41123fa42009a81ee723a
end0438e22cc8f41123fa42009a81ee723a:
	;
	// match: (StructSelect [3] (StructMake4 _ _ _ x))
	// cond:
	// result: x
	{
		if v.AuxInt != 3 {
			goto end56a7c7781fee35eeff0a3652dc206012
		}
		if v.Args[0].Op != OpStructMake4 {
			goto end56a7c7781fee35eeff0a3652dc206012
		}
		x := v.Args[0].Args[3]
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end56a7c7781fee35eeff0a3652dc206012
end56a7c7781fee35eeff0a3652dc206012:
	;
	// match: (StructSelect [i] (Load <t> ptr mem))
	// cond: !config.fe.CanSSA(t)
	// result: @v.Args[0].Block (Load <v.Type> (OffPtr <v.Type.PtrTo()> [t.FieldOff(i)] ptr) mem)
	{
		i := v.AuxInt
		if v.Args[0].Op != OpLoad {
			goto end2afd47b4fcaaab7a73325bd8a75e3e8e
		}
		t := v.Args[0].Type
		ptr := v.Args[0].Args[0]
		mem := v.Args[0].Args[1]
		if !(!config.fe.CanSSA(t)) {
			goto end2afd47b4fcaaab7a73325bd8a75e3e8e
		}
		v0 := v.Args[0].Block.NewValue0(v.Line, OpLoad, v.Type)
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AddArg(v0)
		v1 := v.Args[0].Block.NewValue0(v.Line, OpOffPtr, v.Type.PtrTo())
		v1.AuxInt = t.FieldOff(i)
		v1.AddArg(ptr)
		v0.AddArg(v1)
		v0.AddArg(mem)
		return true
	}
	goto end2afd47b4fcaaab7a73325bd8a75e3e8e
end2afd47b4fcaaab7a73325bd8a75e3e8e:
	;
	return false
}
func rewriteValuegeneric_OpSub16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Sub16 (Const16 [c]) (Const16 [d]))
	// cond:
	// result: (Const16 [c-d])
	{
		if v.Args[0].Op != OpConst16 {
			goto end5c6fab95c9dbeff5973119096bfd4e78
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst16 {
			goto end5c6fab95c9dbeff5973119096bfd4e78
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c - d
		return true
	}
	goto end5c6fab95c9dbeff5973119096bfd4e78
end5c6fab95c9dbeff5973119096bfd4e78:
	;
	// match: (Sub16 x (Const16 <t> [c]))
	// cond: x.Op != OpConst16
	// result: (Add16 (Const16 <t> [-c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst16 {
			goto end493545258a8e7e79d005b34c712ddd0c
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst16) {
			goto end493545258a8e7e79d005b34c712ddd0c
		}
		v.Op = OpAdd16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst16, t)
		v0.AuxInt = -c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end493545258a8e7e79d005b34c712ddd0c
end493545258a8e7e79d005b34c712ddd0c:
	;
	// match: (Sub16 x x)
	// cond:
	// result: (Const16 [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end83da541391be564f2a08464e674a49e7
		}
		v.Op = OpConst16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end83da541391be564f2a08464e674a49e7
end83da541391be564f2a08464e674a49e7:
	;
	// match: (Sub16 (Add16 x y) x)
	// cond:
	// result: y
	{
		if v.Args[0].Op != OpAdd16 {
			goto end0dd8f250c457b9c005ecbed59fc2e758
		}
		x := v.Args[0].Args[0]
		y := v.Args[0].Args[1]
		if v.Args[1] != x {
			goto end0dd8f250c457b9c005ecbed59fc2e758
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = y.Type
		v.AddArg(y)
		return true
	}
	goto end0dd8f250c457b9c005ecbed59fc2e758
end0dd8f250c457b9c005ecbed59fc2e758:
	;
	// match: (Sub16 (Add16 x y) y)
	// cond:
	// result: x
	{
		if v.Args[0].Op != OpAdd16 {
			goto end01c8db2e0bce69e048cf79f3bdc82b9b
		}
		x := v.Args[0].Args[0]
		y := v.Args[0].Args[1]
		if v.Args[1] != y {
			goto end01c8db2e0bce69e048cf79f3bdc82b9b
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end01c8db2e0bce69e048cf79f3bdc82b9b
end01c8db2e0bce69e048cf79f3bdc82b9b:
	;
	return false
}
func rewriteValuegeneric_OpSub32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Sub32 (Const32 [c]) (Const32 [d]))
	// cond:
	// result: (Const32 [c-d])
	{
		if v.Args[0].Op != OpConst32 {
			goto end7623799db780e1bcc42c6ea0df9c49d3
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst32 {
			goto end7623799db780e1bcc42c6ea0df9c49d3
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c - d
		return true
	}
	goto end7623799db780e1bcc42c6ea0df9c49d3
end7623799db780e1bcc42c6ea0df9c49d3:
	;
	// match: (Sub32 x (Const32 <t> [c]))
	// cond: x.Op != OpConst32
	// result: (Add32 (Const32 <t> [-c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst32 {
			goto end391e2f2ba8c7502b62c0153ec69c4fbd
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst32) {
			goto end391e2f2ba8c7502b62c0153ec69c4fbd
		}
		v.Op = OpAdd32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst32, t)
		v0.AuxInt = -c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end391e2f2ba8c7502b62c0153ec69c4fbd
end391e2f2ba8c7502b62c0153ec69c4fbd:
	;
	// match: (Sub32 x x)
	// cond:
	// result: (Const32 [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto enda747581e798f199e07f4ad69747cd069
		}
		v.Op = OpConst32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto enda747581e798f199e07f4ad69747cd069
enda747581e798f199e07f4ad69747cd069:
	;
	// match: (Sub32 (Add32 x y) x)
	// cond:
	// result: y
	{
		if v.Args[0].Op != OpAdd32 {
			goto end70c1e60e58a6c106d060f10cd3f179ea
		}
		x := v.Args[0].Args[0]
		y := v.Args[0].Args[1]
		if v.Args[1] != x {
			goto end70c1e60e58a6c106d060f10cd3f179ea
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = y.Type
		v.AddArg(y)
		return true
	}
	goto end70c1e60e58a6c106d060f10cd3f179ea
end70c1e60e58a6c106d060f10cd3f179ea:
	;
	// match: (Sub32 (Add32 x y) y)
	// cond:
	// result: x
	{
		if v.Args[0].Op != OpAdd32 {
			goto end20e42db178ec4f423cc56a991863a4a2
		}
		x := v.Args[0].Args[0]
		y := v.Args[0].Args[1]
		if v.Args[1] != y {
			goto end20e42db178ec4f423cc56a991863a4a2
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end20e42db178ec4f423cc56a991863a4a2
end20e42db178ec4f423cc56a991863a4a2:
	;
	return false
}
func rewriteValuegeneric_OpSub64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Sub64 (Const64 [c]) (Const64 [d]))
	// cond:
	// result: (Const64 [c-d])
	{
		if v.Args[0].Op != OpConst64 {
			goto end5a84a285ff0ff48b8ad3c64b15e3459f
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst64 {
			goto end5a84a285ff0ff48b8ad3c64b15e3459f
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c - d
		return true
	}
	goto end5a84a285ff0ff48b8ad3c64b15e3459f
end5a84a285ff0ff48b8ad3c64b15e3459f:
	;
	// match: (Sub64 x (Const64 <t> [c]))
	// cond: x.Op != OpConst64
	// result: (Add64 (Const64 <t> [-c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst64 {
			goto enda80d30f6794bcf02cd4442b238f68333
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst64) {
			goto enda80d30f6794bcf02cd4442b238f68333
		}
		v.Op = OpAdd64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst64, t)
		v0.AuxInt = -c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto enda80d30f6794bcf02cd4442b238f68333
enda80d30f6794bcf02cd4442b238f68333:
	;
	// match: (Sub64 x x)
	// cond:
	// result: (Const64 [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end0387dc2b7bbe57d4aa54eab5d959da4b
		}
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end0387dc2b7bbe57d4aa54eab5d959da4b
end0387dc2b7bbe57d4aa54eab5d959da4b:
	;
	// match: (Sub64 (Add64 x y) x)
	// cond:
	// result: y
	{
		if v.Args[0].Op != OpAdd64 {
			goto end7d177451cf8959cb781f52d5ded46fff
		}
		x := v.Args[0].Args[0]
		y := v.Args[0].Args[1]
		if v.Args[1] != x {
			goto end7d177451cf8959cb781f52d5ded46fff
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = y.Type
		v.AddArg(y)
		return true
	}
	goto end7d177451cf8959cb781f52d5ded46fff
end7d177451cf8959cb781f52d5ded46fff:
	;
	// match: (Sub64 (Add64 x y) y)
	// cond:
	// result: x
	{
		if v.Args[0].Op != OpAdd64 {
			goto end6ea8172b21100cfe3dc86b7a850fbe97
		}
		x := v.Args[0].Args[0]
		y := v.Args[0].Args[1]
		if v.Args[1] != y {
			goto end6ea8172b21100cfe3dc86b7a850fbe97
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto end6ea8172b21100cfe3dc86b7a850fbe97
end6ea8172b21100cfe3dc86b7a850fbe97:
	;
	return false
}
func rewriteValuegeneric_OpSub8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Sub8 (Const8 [c]) (Const8 [d]))
	// cond:
	// result: (Const8 [c-d])
	{
		if v.Args[0].Op != OpConst8 {
			goto endc00ea11c7535529e211710574f5cff24
		}
		c := v.Args[0].AuxInt
		if v.Args[1].Op != OpConst8 {
			goto endc00ea11c7535529e211710574f5cff24
		}
		d := v.Args[1].AuxInt
		v.Op = OpConst8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = c - d
		return true
	}
	goto endc00ea11c7535529e211710574f5cff24
endc00ea11c7535529e211710574f5cff24:
	;
	// match: (Sub8 x (Const8 <t> [c]))
	// cond: x.Op != OpConst8
	// result: (Add8 (Const8 <t> [-c]) x)
	{
		x := v.Args[0]
		if v.Args[1].Op != OpConst8 {
			goto end0bfab5b6f1037e55dc049b79e2636678
		}
		t := v.Args[1].Type
		c := v.Args[1].AuxInt
		if !(x.Op != OpConst8) {
			goto end0bfab5b6f1037e55dc049b79e2636678
		}
		v.Op = OpAdd8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v0 := b.NewValue0(v.Line, OpConst8, t)
		v0.AuxInt = -c
		v.AddArg(v0)
		v.AddArg(x)
		return true
	}
	goto end0bfab5b6f1037e55dc049b79e2636678
end0bfab5b6f1037e55dc049b79e2636678:
	;
	// match: (Sub8 x x)
	// cond:
	// result: (Const8 [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end4e2ee15ef17611919a1a6b5f80bbfe18
		}
		v.Op = OpConst8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end4e2ee15ef17611919a1a6b5f80bbfe18
end4e2ee15ef17611919a1a6b5f80bbfe18:
	;
	// match: (Sub8 (Add8 x y) x)
	// cond:
	// result: y
	{
		if v.Args[0].Op != OpAdd8 {
			goto endd79d561e14dc3d11da4c3bb20270b541
		}
		x := v.Args[0].Args[0]
		y := v.Args[0].Args[1]
		if v.Args[1] != x {
			goto endd79d561e14dc3d11da4c3bb20270b541
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = y.Type
		v.AddArg(y)
		return true
	}
	goto endd79d561e14dc3d11da4c3bb20270b541
endd79d561e14dc3d11da4c3bb20270b541:
	;
	// match: (Sub8 (Add8 x y) y)
	// cond:
	// result: x
	{
		if v.Args[0].Op != OpAdd8 {
			goto endcb7111b11d6d068c97026a97ecff8248
		}
		x := v.Args[0].Args[0]
		y := v.Args[0].Args[1]
		if v.Args[1] != y {
			goto endcb7111b11d6d068c97026a97ecff8248
		}
		v.Op = OpCopy
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.Type = x.Type
		v.AddArg(x)
		return true
	}
	goto endcb7111b11d6d068c97026a97ecff8248
endcb7111b11d6d068c97026a97ecff8248:
	;
	return false
}
func rewriteValuegeneric_OpXor16(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Xor16 x x)
	// cond:
	// result: (Const16 [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end5733ceb1903b8140248d8e2cac02fefe
		}
		v.Op = OpConst16
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end5733ceb1903b8140248d8e2cac02fefe
end5733ceb1903b8140248d8e2cac02fefe:
	;
	return false
}
func rewriteValuegeneric_OpXor32(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Xor32 x x)
	// cond:
	// result: (Const32 [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end268ca02df6515d648e0bfb4e90981d25
		}
		v.Op = OpConst32
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end268ca02df6515d648e0bfb4e90981d25
end268ca02df6515d648e0bfb4e90981d25:
	;
	return false
}
func rewriteValuegeneric_OpXor64(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Xor64 x x)
	// cond:
	// result: (Const64 [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto endaf44e7f9fc58af30df69070953fb45ce
		}
		v.Op = OpConst64
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto endaf44e7f9fc58af30df69070953fb45ce
endaf44e7f9fc58af30df69070953fb45ce:
	;
	return false
}
func rewriteValuegeneric_OpXor8(v *Value, config *Config) bool {
	b := v.Block
	_ = b
	// match: (Xor8 x x)
	// cond:
	// result: (Const8 [0])
	{
		x := v.Args[0]
		if v.Args[1] != x {
			goto end949b3a60b7d181688e6f79f93c782fc8
		}
		v.Op = OpConst8
		v.AuxInt = 0
		v.Aux = nil
		v.resetArgs()
		v.AuxInt = 0
		return true
	}
	goto end949b3a60b7d181688e6f79f93c782fc8
end949b3a60b7d181688e6f79f93c782fc8:
	;
	return false
}
func rewriteBlockgeneric(b *Block) bool {
	switch b.Kind {
	case BlockCheck:
		// match: (Check (NilCheck (GetG _) _) next)
		// cond:
		// result: (Plain nil next)
		{
			v := b.Control
			if v.Op != OpNilCheck {
				goto end6e20d932d6961903b0dcf16eac513826
			}
			if v.Args[0].Op != OpGetG {
				goto end6e20d932d6961903b0dcf16eac513826
			}
			next := b.Succs[0]
			b.Kind = BlockPlain
			b.Control = nil
			b.Succs[0] = next
			b.Likely = BranchUnknown
			return true
		}
		goto end6e20d932d6961903b0dcf16eac513826
	end6e20d932d6961903b0dcf16eac513826:
		;
	case BlockIf:
		// match: (If (Not cond) yes no)
		// cond:
		// result: (If cond no yes)
		{
			v := b.Control
			if v.Op != OpNot {
				goto endebe19c1c3c3bec068cdb2dd29ef57f96
			}
			cond := v.Args[0]
			yes := b.Succs[0]
			no := b.Succs[1]
			b.Kind = BlockIf
			b.Control = cond
			b.Succs[0] = no
			b.Succs[1] = yes
			b.Likely *= -1
			return true
		}
		goto endebe19c1c3c3bec068cdb2dd29ef57f96
	endebe19c1c3c3bec068cdb2dd29ef57f96:
		;
		// match: (If (ConstBool [c]) yes no)
		// cond: c == 1
		// result: (First nil yes no)
		{
			v := b.Control
			if v.Op != OpConstBool {
				goto endc58ecbb85af78c0d58bb232ca86b67a4
			}
			c := v.AuxInt
			yes := b.Succs[0]
			no := b.Succs[1]
			if !(c == 1) {
				goto endc58ecbb85af78c0d58bb232ca86b67a4
			}
			b.Kind = BlockFirst
			b.Control = nil
			b.Succs[0] = yes
			b.Succs[1] = no
			return true
		}
		goto endc58ecbb85af78c0d58bb232ca86b67a4
	endc58ecbb85af78c0d58bb232ca86b67a4:
		;
		// match: (If (ConstBool [c]) yes no)
		// cond: c == 0
		// result: (First nil no yes)
		{
			v := b.Control
			if v.Op != OpConstBool {
				goto end4c3e297e275dd7e2e67f8ccd348c4bb5
			}
			c := v.AuxInt
			yes := b.Succs[0]
			no := b.Succs[1]
			if !(c == 0) {
				goto end4c3e297e275dd7e2e67f8ccd348c4bb5
			}
			b.Kind = BlockFirst
			b.Control = nil
			b.Succs[0] = no
			b.Succs[1] = yes
			b.Likely *= -1
			return true
		}
		goto end4c3e297e275dd7e2e67f8ccd348c4bb5
	end4c3e297e275dd7e2e67f8ccd348c4bb5:
	}
	return false
}
