// Code generated from _gen/AMD64.rules using 'go generate'; DO NOT EDIT.

package rewriteamd64

import "internal/buildcfg"
import "math"
import "cmd/internal/obj"
import "cmd/compile/internal/base"
import "cmd/compile/internal/types"
import "cmd/compile/internal/ssa/block"
import "cmd/compile/internal/ssa/ssaop"
import "cmd/compile/internal/ssa"

func RewriteValue(v *ssa.Value) bool {
	switch v.Op {
	case ssaop.OpAESDecryptLastRoundUint8x16:
		v.Op = ssaop.OpAMD64VAESDECLAST128
		return true
	case ssaop.OpAESDecryptLastRoundUint8x32:
		v.Op = ssaop.OpAMD64VAESDECLAST256
		return true
	case ssaop.OpAESDecryptLastRoundUint8x64:
		v.Op = ssaop.OpAMD64VAESDECLAST512
		return true
	case ssaop.OpAESDecryptOneRoundUint8x16:
		v.Op = ssaop.OpAMD64VAESDEC128
		return true
	case ssaop.OpAESDecryptOneRoundUint8x32:
		v.Op = ssaop.OpAMD64VAESDEC256
		return true
	case ssaop.OpAESDecryptOneRoundUint8x64:
		v.Op = ssaop.OpAMD64VAESDEC512
		return true
	case ssaop.OpAESEncryptLastRoundUint8x16:
		v.Op = ssaop.OpAMD64VAESENCLAST128
		return true
	case ssaop.OpAESEncryptLastRoundUint8x32:
		v.Op = ssaop.OpAMD64VAESENCLAST256
		return true
	case ssaop.OpAESEncryptLastRoundUint8x64:
		v.Op = ssaop.OpAMD64VAESENCLAST512
		return true
	case ssaop.OpAESEncryptOneRoundUint8x16:
		v.Op = ssaop.OpAMD64VAESENC128
		return true
	case ssaop.OpAESEncryptOneRoundUint8x32:
		v.Op = ssaop.OpAMD64VAESENC256
		return true
	case ssaop.OpAESEncryptOneRoundUint8x64:
		v.Op = ssaop.OpAMD64VAESENC512
		return true
	case ssaop.OpAESInvMixColumnsUint32x4:
		v.Op = ssaop.OpAMD64VAESIMC128
		return true
	case ssaop.OpAESRoundKeyGenAssistUint32x4:
		v.Op = ssaop.OpAMD64VAESKEYGENASSIST128
		return true
	case ssaop.OpAMD64ADCQ:
		return rewriteValue_OpAMD64ADCQ(v)
	case ssaop.OpAMD64ADCQconst:
		return rewriteValue_OpAMD64ADCQconst(v)
	case ssaop.OpAMD64ADDBconstmodify:
		return rewriteValue_OpAMD64ADDBconstmodify(v)
	case ssaop.OpAMD64ADDL:
		return rewriteValue_OpAMD64ADDL(v)
	case ssaop.OpAMD64ADDLconst:
		return rewriteValue_OpAMD64ADDLconst(v)
	case ssaop.OpAMD64ADDLconstmodify:
		return rewriteValue_OpAMD64ADDLconstmodify(v)
	case ssaop.OpAMD64ADDLload:
		return rewriteValue_OpAMD64ADDLload(v)
	case ssaop.OpAMD64ADDLlock:
		return rewriteValue_OpAMD64ADDLlock(v)
	case ssaop.OpAMD64ADDLmodify:
		return rewriteValue_OpAMD64ADDLmodify(v)
	case ssaop.OpAMD64ADDQ:
		return rewriteValue_OpAMD64ADDQ(v)
	case ssaop.OpAMD64ADDQcarry:
		return rewriteValue_OpAMD64ADDQcarry(v)
	case ssaop.OpAMD64ADDQconst:
		return rewriteValue_OpAMD64ADDQconst(v)
	case ssaop.OpAMD64ADDQconstmodify:
		return rewriteValue_OpAMD64ADDQconstmodify(v)
	case ssaop.OpAMD64ADDQload:
		return rewriteValue_OpAMD64ADDQload(v)
	case ssaop.OpAMD64ADDQlock:
		return rewriteValue_OpAMD64ADDQlock(v)
	case ssaop.OpAMD64ADDQmodify:
		return rewriteValue_OpAMD64ADDQmodify(v)
	case ssaop.OpAMD64ADDSD:
		return rewriteValue_OpAMD64ADDSD(v)
	case ssaop.OpAMD64ADDSDload:
		return rewriteValue_OpAMD64ADDSDload(v)
	case ssaop.OpAMD64ADDSS:
		return rewriteValue_OpAMD64ADDSS(v)
	case ssaop.OpAMD64ADDSSload:
		return rewriteValue_OpAMD64ADDSSload(v)
	case ssaop.OpAMD64ADDWconstmodify:
		return rewriteValue_OpAMD64ADDWconstmodify(v)
	case ssaop.OpAMD64ANDBconstmodify:
		return rewriteValue_OpAMD64ANDBconstmodify(v)
	case ssaop.OpAMD64ANDL:
		return rewriteValue_OpAMD64ANDL(v)
	case ssaop.OpAMD64ANDLconst:
		return rewriteValue_OpAMD64ANDLconst(v)
	case ssaop.OpAMD64ANDLconstmodify:
		return rewriteValue_OpAMD64ANDLconstmodify(v)
	case ssaop.OpAMD64ANDLload:
		return rewriteValue_OpAMD64ANDLload(v)
	case ssaop.OpAMD64ANDLmodify:
		return rewriteValue_OpAMD64ANDLmodify(v)
	case ssaop.OpAMD64ANDNL:
		return rewriteValue_OpAMD64ANDNL(v)
	case ssaop.OpAMD64ANDNQ:
		return rewriteValue_OpAMD64ANDNQ(v)
	case ssaop.OpAMD64ANDQ:
		return rewriteValue_OpAMD64ANDQ(v)
	case ssaop.OpAMD64ANDQconst:
		return rewriteValue_OpAMD64ANDQconst(v)
	case ssaop.OpAMD64ANDQconstmodify:
		return rewriteValue_OpAMD64ANDQconstmodify(v)
	case ssaop.OpAMD64ANDQload:
		return rewriteValue_OpAMD64ANDQload(v)
	case ssaop.OpAMD64ANDQmodify:
		return rewriteValue_OpAMD64ANDQmodify(v)
	case ssaop.OpAMD64ANDWconstmodify:
		return rewriteValue_OpAMD64ANDWconstmodify(v)
	case ssaop.OpAMD64AddTupleFirst32:
		return rewriteValue_OpAMD64AddTupleFirst32(v)
	case ssaop.OpAMD64AddTupleFirst64:
		return rewriteValue_OpAMD64AddTupleFirst64(v)
	case ssaop.OpAMD64BSFQ:
		return rewriteValue_OpAMD64BSFQ(v)
	case ssaop.OpAMD64BSWAPL:
		return rewriteValue_OpAMD64BSWAPL(v)
	case ssaop.OpAMD64BSWAPQ:
		return rewriteValue_OpAMD64BSWAPQ(v)
	case ssaop.OpAMD64BTCQconst:
		return rewriteValue_OpAMD64BTCQconst(v)
	case ssaop.OpAMD64BTLconst:
		return rewriteValue_OpAMD64BTLconst(v)
	case ssaop.OpAMD64BTQconst:
		return rewriteValue_OpAMD64BTQconst(v)
	case ssaop.OpAMD64BTRQconst:
		return rewriteValue_OpAMD64BTRQconst(v)
	case ssaop.OpAMD64BTSQconst:
		return rewriteValue_OpAMD64BTSQconst(v)
	case ssaop.OpAMD64CMOVLCC:
		return rewriteValue_OpAMD64CMOVLCC(v)
	case ssaop.OpAMD64CMOVLCS:
		return rewriteValue_OpAMD64CMOVLCS(v)
	case ssaop.OpAMD64CMOVLEQ:
		return rewriteValue_OpAMD64CMOVLEQ(v)
	case ssaop.OpAMD64CMOVLGE:
		return rewriteValue_OpAMD64CMOVLGE(v)
	case ssaop.OpAMD64CMOVLGT:
		return rewriteValue_OpAMD64CMOVLGT(v)
	case ssaop.OpAMD64CMOVLHI:
		return rewriteValue_OpAMD64CMOVLHI(v)
	case ssaop.OpAMD64CMOVLLE:
		return rewriteValue_OpAMD64CMOVLLE(v)
	case ssaop.OpAMD64CMOVLLS:
		return rewriteValue_OpAMD64CMOVLLS(v)
	case ssaop.OpAMD64CMOVLLT:
		return rewriteValue_OpAMD64CMOVLLT(v)
	case ssaop.OpAMD64CMOVLNE:
		return rewriteValue_OpAMD64CMOVLNE(v)
	case ssaop.OpAMD64CMOVQCC:
		return rewriteValue_OpAMD64CMOVQCC(v)
	case ssaop.OpAMD64CMOVQCS:
		return rewriteValue_OpAMD64CMOVQCS(v)
	case ssaop.OpAMD64CMOVQEQ:
		return rewriteValue_OpAMD64CMOVQEQ(v)
	case ssaop.OpAMD64CMOVQGE:
		return rewriteValue_OpAMD64CMOVQGE(v)
	case ssaop.OpAMD64CMOVQGT:
		return rewriteValue_OpAMD64CMOVQGT(v)
	case ssaop.OpAMD64CMOVQHI:
		return rewriteValue_OpAMD64CMOVQHI(v)
	case ssaop.OpAMD64CMOVQLE:
		return rewriteValue_OpAMD64CMOVQLE(v)
	case ssaop.OpAMD64CMOVQLS:
		return rewriteValue_OpAMD64CMOVQLS(v)
	case ssaop.OpAMD64CMOVQLT:
		return rewriteValue_OpAMD64CMOVQLT(v)
	case ssaop.OpAMD64CMOVQNE:
		return rewriteValue_OpAMD64CMOVQNE(v)
	case ssaop.OpAMD64CMOVWCC:
		return rewriteValue_OpAMD64CMOVWCC(v)
	case ssaop.OpAMD64CMOVWCS:
		return rewriteValue_OpAMD64CMOVWCS(v)
	case ssaop.OpAMD64CMOVWEQ:
		return rewriteValue_OpAMD64CMOVWEQ(v)
	case ssaop.OpAMD64CMOVWGE:
		return rewriteValue_OpAMD64CMOVWGE(v)
	case ssaop.OpAMD64CMOVWGT:
		return rewriteValue_OpAMD64CMOVWGT(v)
	case ssaop.OpAMD64CMOVWHI:
		return rewriteValue_OpAMD64CMOVWHI(v)
	case ssaop.OpAMD64CMOVWLE:
		return rewriteValue_OpAMD64CMOVWLE(v)
	case ssaop.OpAMD64CMOVWLS:
		return rewriteValue_OpAMD64CMOVWLS(v)
	case ssaop.OpAMD64CMOVWLT:
		return rewriteValue_OpAMD64CMOVWLT(v)
	case ssaop.OpAMD64CMOVWNE:
		return rewriteValue_OpAMD64CMOVWNE(v)
	case ssaop.OpAMD64CMPB:
		return rewriteValue_OpAMD64CMPB(v)
	case ssaop.OpAMD64CMPBconst:
		return rewriteValue_OpAMD64CMPBconst(v)
	case ssaop.OpAMD64CMPBconstload:
		return rewriteValue_OpAMD64CMPBconstload(v)
	case ssaop.OpAMD64CMPBload:
		return rewriteValue_OpAMD64CMPBload(v)
	case ssaop.OpAMD64CMPL:
		return rewriteValue_OpAMD64CMPL(v)
	case ssaop.OpAMD64CMPLconst:
		return rewriteValue_OpAMD64CMPLconst(v)
	case ssaop.OpAMD64CMPLconstload:
		return rewriteValue_OpAMD64CMPLconstload(v)
	case ssaop.OpAMD64CMPLload:
		return rewriteValue_OpAMD64CMPLload(v)
	case ssaop.OpAMD64CMPQ:
		return rewriteValue_OpAMD64CMPQ(v)
	case ssaop.OpAMD64CMPQconst:
		return rewriteValue_OpAMD64CMPQconst(v)
	case ssaop.OpAMD64CMPQconstload:
		return rewriteValue_OpAMD64CMPQconstload(v)
	case ssaop.OpAMD64CMPQload:
		return rewriteValue_OpAMD64CMPQload(v)
	case ssaop.OpAMD64CMPW:
		return rewriteValue_OpAMD64CMPW(v)
	case ssaop.OpAMD64CMPWconst:
		return rewriteValue_OpAMD64CMPWconst(v)
	case ssaop.OpAMD64CMPWconstload:
		return rewriteValue_OpAMD64CMPWconstload(v)
	case ssaop.OpAMD64CMPWload:
		return rewriteValue_OpAMD64CMPWload(v)
	case ssaop.OpAMD64CMPXCHGLlock:
		return rewriteValue_OpAMD64CMPXCHGLlock(v)
	case ssaop.OpAMD64CMPXCHGQlock:
		return rewriteValue_OpAMD64CMPXCHGQlock(v)
	case ssaop.OpAMD64CVTSD2SS:
		return rewriteValue_OpAMD64CVTSD2SS(v)
	case ssaop.OpAMD64DIVSD:
		return rewriteValue_OpAMD64DIVSD(v)
	case ssaop.OpAMD64DIVSDload:
		return rewriteValue_OpAMD64DIVSDload(v)
	case ssaop.OpAMD64DIVSS:
		return rewriteValue_OpAMD64DIVSS(v)
	case ssaop.OpAMD64DIVSSload:
		return rewriteValue_OpAMD64DIVSSload(v)
	case ssaop.OpAMD64HMULL:
		return rewriteValue_OpAMD64HMULL(v)
	case ssaop.OpAMD64HMULLU:
		return rewriteValue_OpAMD64HMULLU(v)
	case ssaop.OpAMD64HMULQ:
		return rewriteValue_OpAMD64HMULQ(v)
	case ssaop.OpAMD64HMULQU:
		return rewriteValue_OpAMD64HMULQU(v)
	case ssaop.OpAMD64KANDB:
		return rewriteValue_OpAMD64KANDB(v)
	case ssaop.OpAMD64KANDW:
		return rewriteValue_OpAMD64KANDW(v)
	case ssaop.OpAMD64KMOVBk:
		return rewriteValue_OpAMD64KMOVBk(v)
	case ssaop.OpAMD64KMOVDk:
		return rewriteValue_OpAMD64KMOVDk(v)
	case ssaop.OpAMD64KMOVQk:
		return rewriteValue_OpAMD64KMOVQk(v)
	case ssaop.OpAMD64KMOVWk:
		return rewriteValue_OpAMD64KMOVWk(v)
	case ssaop.OpAMD64LEAL:
		return rewriteValue_OpAMD64LEAL(v)
	case ssaop.OpAMD64LEAL1:
		return rewriteValue_OpAMD64LEAL1(v)
	case ssaop.OpAMD64LEAL2:
		return rewriteValue_OpAMD64LEAL2(v)
	case ssaop.OpAMD64LEAL4:
		return rewriteValue_OpAMD64LEAL4(v)
	case ssaop.OpAMD64LEAL8:
		return rewriteValue_OpAMD64LEAL8(v)
	case ssaop.OpAMD64LEAQ:
		return rewriteValue_OpAMD64LEAQ(v)
	case ssaop.OpAMD64LEAQ1:
		return rewriteValue_OpAMD64LEAQ1(v)
	case ssaop.OpAMD64LEAQ2:
		return rewriteValue_OpAMD64LEAQ2(v)
	case ssaop.OpAMD64LEAQ4:
		return rewriteValue_OpAMD64LEAQ4(v)
	case ssaop.OpAMD64LEAQ8:
		return rewriteValue_OpAMD64LEAQ8(v)
	case ssaop.OpAMD64LoweredPanicBoundsCR:
		return rewriteValue_OpAMD64LoweredPanicBoundsCR(v)
	case ssaop.OpAMD64LoweredPanicBoundsRC:
		return rewriteValue_OpAMD64LoweredPanicBoundsRC(v)
	case ssaop.OpAMD64LoweredPanicBoundsRR:
		return rewriteValue_OpAMD64LoweredPanicBoundsRR(v)
	case ssaop.OpAMD64MOVBELstore:
		return rewriteValue_OpAMD64MOVBELstore(v)
	case ssaop.OpAMD64MOVBEQstore:
		return rewriteValue_OpAMD64MOVBEQstore(v)
	case ssaop.OpAMD64MOVBEWstore:
		return rewriteValue_OpAMD64MOVBEWstore(v)
	case ssaop.OpAMD64MOVBQSX:
		return rewriteValue_OpAMD64MOVBQSX(v)
	case ssaop.OpAMD64MOVBQSXload:
		return rewriteValue_OpAMD64MOVBQSXload(v)
	case ssaop.OpAMD64MOVBQZX:
		return rewriteValue_OpAMD64MOVBQZX(v)
	case ssaop.OpAMD64MOVBatomicload:
		return rewriteValue_OpAMD64MOVBatomicload(v)
	case ssaop.OpAMD64MOVBload:
		return rewriteValue_OpAMD64MOVBload(v)
	case ssaop.OpAMD64MOVBstore:
		return rewriteValue_OpAMD64MOVBstore(v)
	case ssaop.OpAMD64MOVBstoreconst:
		return rewriteValue_OpAMD64MOVBstoreconst(v)
	case ssaop.OpAMD64MOVLQSX:
		return rewriteValue_OpAMD64MOVLQSX(v)
	case ssaop.OpAMD64MOVLQSXload:
		return rewriteValue_OpAMD64MOVLQSXload(v)
	case ssaop.OpAMD64MOVLQZX:
		return rewriteValue_OpAMD64MOVLQZX(v)
	case ssaop.OpAMD64MOVLatomicload:
		return rewriteValue_OpAMD64MOVLatomicload(v)
	case ssaop.OpAMD64MOVLf2i:
		return rewriteValue_OpAMD64MOVLf2i(v)
	case ssaop.OpAMD64MOVLi2f:
		return rewriteValue_OpAMD64MOVLi2f(v)
	case ssaop.OpAMD64MOVLload:
		return rewriteValue_OpAMD64MOVLload(v)
	case ssaop.OpAMD64MOVLstore:
		return rewriteValue_OpAMD64MOVLstore(v)
	case ssaop.OpAMD64MOVLstoreconst:
		return rewriteValue_OpAMD64MOVLstoreconst(v)
	case ssaop.OpAMD64MOVOload:
		return rewriteValue_OpAMD64MOVOload(v)
	case ssaop.OpAMD64MOVOstore:
		return rewriteValue_OpAMD64MOVOstore(v)
	case ssaop.OpAMD64MOVOstoreconst:
		return rewriteValue_OpAMD64MOVOstoreconst(v)
	case ssaop.OpAMD64MOVQatomicload:
		return rewriteValue_OpAMD64MOVQatomicload(v)
	case ssaop.OpAMD64MOVQf2i:
		return rewriteValue_OpAMD64MOVQf2i(v)
	case ssaop.OpAMD64MOVQi2f:
		return rewriteValue_OpAMD64MOVQi2f(v)
	case ssaop.OpAMD64MOVQload:
		return rewriteValue_OpAMD64MOVQload(v)
	case ssaop.OpAMD64MOVQstore:
		return rewriteValue_OpAMD64MOVQstore(v)
	case ssaop.OpAMD64MOVQstoreconst:
		return rewriteValue_OpAMD64MOVQstoreconst(v)
	case ssaop.OpAMD64MOVSDload:
		return rewriteValue_OpAMD64MOVSDload(v)
	case ssaop.OpAMD64MOVSDstore:
		return rewriteValue_OpAMD64MOVSDstore(v)
	case ssaop.OpAMD64MOVSSload:
		return rewriteValue_OpAMD64MOVSSload(v)
	case ssaop.OpAMD64MOVSSstore:
		return rewriteValue_OpAMD64MOVSSstore(v)
	case ssaop.OpAMD64MOVWQSX:
		return rewriteValue_OpAMD64MOVWQSX(v)
	case ssaop.OpAMD64MOVWQSXload:
		return rewriteValue_OpAMD64MOVWQSXload(v)
	case ssaop.OpAMD64MOVWQZX:
		return rewriteValue_OpAMD64MOVWQZX(v)
	case ssaop.OpAMD64MOVWload:
		return rewriteValue_OpAMD64MOVWload(v)
	case ssaop.OpAMD64MOVWstore:
		return rewriteValue_OpAMD64MOVWstore(v)
	case ssaop.OpAMD64MOVWstoreconst:
		return rewriteValue_OpAMD64MOVWstoreconst(v)
	case ssaop.OpAMD64MULL:
		return rewriteValue_OpAMD64MULL(v)
	case ssaop.OpAMD64MULLconst:
		return rewriteValue_OpAMD64MULLconst(v)
	case ssaop.OpAMD64MULQ:
		return rewriteValue_OpAMD64MULQ(v)
	case ssaop.OpAMD64MULQconst:
		return rewriteValue_OpAMD64MULQconst(v)
	case ssaop.OpAMD64MULSD:
		return rewriteValue_OpAMD64MULSD(v)
	case ssaop.OpAMD64MULSDload:
		return rewriteValue_OpAMD64MULSDload(v)
	case ssaop.OpAMD64MULSS:
		return rewriteValue_OpAMD64MULSS(v)
	case ssaop.OpAMD64MULSSload:
		return rewriteValue_OpAMD64MULSSload(v)
	case ssaop.OpAMD64NEGL:
		return rewriteValue_OpAMD64NEGL(v)
	case ssaop.OpAMD64NEGQ:
		return rewriteValue_OpAMD64NEGQ(v)
	case ssaop.OpAMD64NOTL:
		return rewriteValue_OpAMD64NOTL(v)
	case ssaop.OpAMD64NOTQ:
		return rewriteValue_OpAMD64NOTQ(v)
	case ssaop.OpAMD64ORBconstmodify:
		return rewriteValue_OpAMD64ORBconstmodify(v)
	case ssaop.OpAMD64ORL:
		return rewriteValue_OpAMD64ORL(v)
	case ssaop.OpAMD64ORLconst:
		return rewriteValue_OpAMD64ORLconst(v)
	case ssaop.OpAMD64ORLconstmodify:
		return rewriteValue_OpAMD64ORLconstmodify(v)
	case ssaop.OpAMD64ORLload:
		return rewriteValue_OpAMD64ORLload(v)
	case ssaop.OpAMD64ORLmodify:
		return rewriteValue_OpAMD64ORLmodify(v)
	case ssaop.OpAMD64ORQ:
		return rewriteValue_OpAMD64ORQ(v)
	case ssaop.OpAMD64ORQconst:
		return rewriteValue_OpAMD64ORQconst(v)
	case ssaop.OpAMD64ORQconstmodify:
		return rewriteValue_OpAMD64ORQconstmodify(v)
	case ssaop.OpAMD64ORQload:
		return rewriteValue_OpAMD64ORQload(v)
	case ssaop.OpAMD64ORQmodify:
		return rewriteValue_OpAMD64ORQmodify(v)
	case ssaop.OpAMD64ORWconstmodify:
		return rewriteValue_OpAMD64ORWconstmodify(v)
	case ssaop.OpAMD64ROLB:
		return rewriteValue_OpAMD64ROLB(v)
	case ssaop.OpAMD64ROLBconst:
		return rewriteValue_OpAMD64ROLBconst(v)
	case ssaop.OpAMD64ROLL:
		return rewriteValue_OpAMD64ROLL(v)
	case ssaop.OpAMD64ROLLconst:
		return rewriteValue_OpAMD64ROLLconst(v)
	case ssaop.OpAMD64ROLQ:
		return rewriteValue_OpAMD64ROLQ(v)
	case ssaop.OpAMD64ROLQconst:
		return rewriteValue_OpAMD64ROLQconst(v)
	case ssaop.OpAMD64ROLW:
		return rewriteValue_OpAMD64ROLW(v)
	case ssaop.OpAMD64ROLWconst:
		return rewriteValue_OpAMD64ROLWconst(v)
	case ssaop.OpAMD64RORB:
		return rewriteValue_OpAMD64RORB(v)
	case ssaop.OpAMD64RORL:
		return rewriteValue_OpAMD64RORL(v)
	case ssaop.OpAMD64RORQ:
		return rewriteValue_OpAMD64RORQ(v)
	case ssaop.OpAMD64RORW:
		return rewriteValue_OpAMD64RORW(v)
	case ssaop.OpAMD64SARB:
		return rewriteValue_OpAMD64SARB(v)
	case ssaop.OpAMD64SARBconst:
		return rewriteValue_OpAMD64SARBconst(v)
	case ssaop.OpAMD64SARL:
		return rewriteValue_OpAMD64SARL(v)
	case ssaop.OpAMD64SARLconst:
		return rewriteValue_OpAMD64SARLconst(v)
	case ssaop.OpAMD64SARQ:
		return rewriteValue_OpAMD64SARQ(v)
	case ssaop.OpAMD64SARQconst:
		return rewriteValue_OpAMD64SARQconst(v)
	case ssaop.OpAMD64SARW:
		return rewriteValue_OpAMD64SARW(v)
	case ssaop.OpAMD64SARWconst:
		return rewriteValue_OpAMD64SARWconst(v)
	case ssaop.OpAMD64SARXLload:
		return rewriteValue_OpAMD64SARXLload(v)
	case ssaop.OpAMD64SARXQload:
		return rewriteValue_OpAMD64SARXQload(v)
	case ssaop.OpAMD64SBBLcarrymask:
		return rewriteValue_OpAMD64SBBLcarrymask(v)
	case ssaop.OpAMD64SBBQ:
		return rewriteValue_OpAMD64SBBQ(v)
	case ssaop.OpAMD64SBBQcarrymask:
		return rewriteValue_OpAMD64SBBQcarrymask(v)
	case ssaop.OpAMD64SBBQconst:
		return rewriteValue_OpAMD64SBBQconst(v)
	case ssaop.OpAMD64SETA:
		return rewriteValue_OpAMD64SETA(v)
	case ssaop.OpAMD64SETAE:
		return rewriteValue_OpAMD64SETAE(v)
	case ssaop.OpAMD64SETAEstore:
		return rewriteValue_OpAMD64SETAEstore(v)
	case ssaop.OpAMD64SETAstore:
		return rewriteValue_OpAMD64SETAstore(v)
	case ssaop.OpAMD64SETB:
		return rewriteValue_OpAMD64SETB(v)
	case ssaop.OpAMD64SETBE:
		return rewriteValue_OpAMD64SETBE(v)
	case ssaop.OpAMD64SETBEstore:
		return rewriteValue_OpAMD64SETBEstore(v)
	case ssaop.OpAMD64SETBstore:
		return rewriteValue_OpAMD64SETBstore(v)
	case ssaop.OpAMD64SETEQ:
		return rewriteValue_OpAMD64SETEQ(v)
	case ssaop.OpAMD64SETEQstore:
		return rewriteValue_OpAMD64SETEQstore(v)
	case ssaop.OpAMD64SETG:
		return rewriteValue_OpAMD64SETG(v)
	case ssaop.OpAMD64SETGE:
		return rewriteValue_OpAMD64SETGE(v)
	case ssaop.OpAMD64SETGEstore:
		return rewriteValue_OpAMD64SETGEstore(v)
	case ssaop.OpAMD64SETGstore:
		return rewriteValue_OpAMD64SETGstore(v)
	case ssaop.OpAMD64SETL:
		return rewriteValue_OpAMD64SETL(v)
	case ssaop.OpAMD64SETLE:
		return rewriteValue_OpAMD64SETLE(v)
	case ssaop.OpAMD64SETLEstore:
		return rewriteValue_OpAMD64SETLEstore(v)
	case ssaop.OpAMD64SETLstore:
		return rewriteValue_OpAMD64SETLstore(v)
	case ssaop.OpAMD64SETNE:
		return rewriteValue_OpAMD64SETNE(v)
	case ssaop.OpAMD64SETNEstore:
		return rewriteValue_OpAMD64SETNEstore(v)
	case ssaop.OpAMD64SHLL:
		return rewriteValue_OpAMD64SHLL(v)
	case ssaop.OpAMD64SHLLconst:
		return rewriteValue_OpAMD64SHLLconst(v)
	case ssaop.OpAMD64SHLQ:
		return rewriteValue_OpAMD64SHLQ(v)
	case ssaop.OpAMD64SHLQconst:
		return rewriteValue_OpAMD64SHLQconst(v)
	case ssaop.OpAMD64SHLXLload:
		return rewriteValue_OpAMD64SHLXLload(v)
	case ssaop.OpAMD64SHLXQload:
		return rewriteValue_OpAMD64SHLXQload(v)
	case ssaop.OpAMD64SHRB:
		return rewriteValue_OpAMD64SHRB(v)
	case ssaop.OpAMD64SHRBconst:
		return rewriteValue_OpAMD64SHRBconst(v)
	case ssaop.OpAMD64SHRL:
		return rewriteValue_OpAMD64SHRL(v)
	case ssaop.OpAMD64SHRLconst:
		return rewriteValue_OpAMD64SHRLconst(v)
	case ssaop.OpAMD64SHRQ:
		return rewriteValue_OpAMD64SHRQ(v)
	case ssaop.OpAMD64SHRQconst:
		return rewriteValue_OpAMD64SHRQconst(v)
	case ssaop.OpAMD64SHRW:
		return rewriteValue_OpAMD64SHRW(v)
	case ssaop.OpAMD64SHRWconst:
		return rewriteValue_OpAMD64SHRWconst(v)
	case ssaop.OpAMD64SHRXLload:
		return rewriteValue_OpAMD64SHRXLload(v)
	case ssaop.OpAMD64SHRXQload:
		return rewriteValue_OpAMD64SHRXQload(v)
	case ssaop.OpAMD64SUBL:
		return rewriteValue_OpAMD64SUBL(v)
	case ssaop.OpAMD64SUBLconst:
		return rewriteValue_OpAMD64SUBLconst(v)
	case ssaop.OpAMD64SUBLload:
		return rewriteValue_OpAMD64SUBLload(v)
	case ssaop.OpAMD64SUBLmodify:
		return rewriteValue_OpAMD64SUBLmodify(v)
	case ssaop.OpAMD64SUBQ:
		return rewriteValue_OpAMD64SUBQ(v)
	case ssaop.OpAMD64SUBQborrow:
		return rewriteValue_OpAMD64SUBQborrow(v)
	case ssaop.OpAMD64SUBQconst:
		return rewriteValue_OpAMD64SUBQconst(v)
	case ssaop.OpAMD64SUBQload:
		return rewriteValue_OpAMD64SUBQload(v)
	case ssaop.OpAMD64SUBQmodify:
		return rewriteValue_OpAMD64SUBQmodify(v)
	case ssaop.OpAMD64SUBSD:
		return rewriteValue_OpAMD64SUBSD(v)
	case ssaop.OpAMD64SUBSDload:
		return rewriteValue_OpAMD64SUBSDload(v)
	case ssaop.OpAMD64SUBSS:
		return rewriteValue_OpAMD64SUBSS(v)
	case ssaop.OpAMD64SUBSSload:
		return rewriteValue_OpAMD64SUBSSload(v)
	case ssaop.OpAMD64TESTB:
		return rewriteValue_OpAMD64TESTB(v)
	case ssaop.OpAMD64TESTBconst:
		return rewriteValue_OpAMD64TESTBconst(v)
	case ssaop.OpAMD64TESTL:
		return rewriteValue_OpAMD64TESTL(v)
	case ssaop.OpAMD64TESTLconst:
		return rewriteValue_OpAMD64TESTLconst(v)
	case ssaop.OpAMD64TESTQ:
		return rewriteValue_OpAMD64TESTQ(v)
	case ssaop.OpAMD64TESTQconst:
		return rewriteValue_OpAMD64TESTQconst(v)
	case ssaop.OpAMD64TESTW:
		return rewriteValue_OpAMD64TESTW(v)
	case ssaop.OpAMD64TESTWconst:
		return rewriteValue_OpAMD64TESTWconst(v)
	case ssaop.OpAMD64VADDPD128:
		return rewriteValue_OpAMD64VADDPD128(v)
	case ssaop.OpAMD64VADDPD256:
		return rewriteValue_OpAMD64VADDPD256(v)
	case ssaop.OpAMD64VADDPD512:
		return rewriteValue_OpAMD64VADDPD512(v)
	case ssaop.OpAMD64VADDPDMasked128:
		return rewriteValue_OpAMD64VADDPDMasked128(v)
	case ssaop.OpAMD64VADDPDMasked256:
		return rewriteValue_OpAMD64VADDPDMasked256(v)
	case ssaop.OpAMD64VADDPDMasked512:
		return rewriteValue_OpAMD64VADDPDMasked512(v)
	case ssaop.OpAMD64VADDPS128:
		return rewriteValue_OpAMD64VADDPS128(v)
	case ssaop.OpAMD64VADDPS256:
		return rewriteValue_OpAMD64VADDPS256(v)
	case ssaop.OpAMD64VADDPS512:
		return rewriteValue_OpAMD64VADDPS512(v)
	case ssaop.OpAMD64VADDPSMasked128:
		return rewriteValue_OpAMD64VADDPSMasked128(v)
	case ssaop.OpAMD64VADDPSMasked256:
		return rewriteValue_OpAMD64VADDPSMasked256(v)
	case ssaop.OpAMD64VADDPSMasked512:
		return rewriteValue_OpAMD64VADDPSMasked512(v)
	case ssaop.OpAMD64VADDSUBPD128:
		return rewriteValue_OpAMD64VADDSUBPD128(v)
	case ssaop.OpAMD64VADDSUBPD256:
		return rewriteValue_OpAMD64VADDSUBPD256(v)
	case ssaop.OpAMD64VADDSUBPS128:
		return rewriteValue_OpAMD64VADDSUBPS128(v)
	case ssaop.OpAMD64VADDSUBPS256:
		return rewriteValue_OpAMD64VADDSUBPS256(v)
	case ssaop.OpAMD64VAESDEC128:
		return rewriteValue_OpAMD64VAESDEC128(v)
	case ssaop.OpAMD64VAESDEC256:
		return rewriteValue_OpAMD64VAESDEC256(v)
	case ssaop.OpAMD64VAESDECLAST128:
		return rewriteValue_OpAMD64VAESDECLAST128(v)
	case ssaop.OpAMD64VAESDECLAST256:
		return rewriteValue_OpAMD64VAESDECLAST256(v)
	case ssaop.OpAMD64VAESENC128:
		return rewriteValue_OpAMD64VAESENC128(v)
	case ssaop.OpAMD64VAESENC256:
		return rewriteValue_OpAMD64VAESENC256(v)
	case ssaop.OpAMD64VAESENCLAST128:
		return rewriteValue_OpAMD64VAESENCLAST128(v)
	case ssaop.OpAMD64VAESENCLAST256:
		return rewriteValue_OpAMD64VAESENCLAST256(v)
	case ssaop.OpAMD64VAESIMC128:
		return rewriteValue_OpAMD64VAESIMC128(v)
	case ssaop.OpAMD64VAESKEYGENASSIST128:
		return rewriteValue_OpAMD64VAESKEYGENASSIST128(v)
	case ssaop.OpAMD64VBROADCASTSD256:
		return rewriteValue_OpAMD64VBROADCASTSD256(v)
	case ssaop.OpAMD64VBROADCASTSD512:
		return rewriteValue_OpAMD64VBROADCASTSD512(v)
	case ssaop.OpAMD64VBROADCASTSDMasked256:
		return rewriteValue_OpAMD64VBROADCASTSDMasked256(v)
	case ssaop.OpAMD64VBROADCASTSDMasked512:
		return rewriteValue_OpAMD64VBROADCASTSDMasked512(v)
	case ssaop.OpAMD64VBROADCASTSS128:
		return rewriteValue_OpAMD64VBROADCASTSS128(v)
	case ssaop.OpAMD64VBROADCASTSS256:
		return rewriteValue_OpAMD64VBROADCASTSS256(v)
	case ssaop.OpAMD64VBROADCASTSS512:
		return rewriteValue_OpAMD64VBROADCASTSS512(v)
	case ssaop.OpAMD64VBROADCASTSSMasked128:
		return rewriteValue_OpAMD64VBROADCASTSSMasked128(v)
	case ssaop.OpAMD64VBROADCASTSSMasked256:
		return rewriteValue_OpAMD64VBROADCASTSSMasked256(v)
	case ssaop.OpAMD64VBROADCASTSSMasked512:
		return rewriteValue_OpAMD64VBROADCASTSSMasked512(v)
	case ssaop.OpAMD64VCMPPD128:
		return rewriteValue_OpAMD64VCMPPD128(v)
	case ssaop.OpAMD64VCMPPD256:
		return rewriteValue_OpAMD64VCMPPD256(v)
	case ssaop.OpAMD64VCMPPD512:
		return rewriteValue_OpAMD64VCMPPD512(v)
	case ssaop.OpAMD64VCMPPDMasked128:
		return rewriteValue_OpAMD64VCMPPDMasked128(v)
	case ssaop.OpAMD64VCMPPDMasked256:
		return rewriteValue_OpAMD64VCMPPDMasked256(v)
	case ssaop.OpAMD64VCMPPDMasked512:
		return rewriteValue_OpAMD64VCMPPDMasked512(v)
	case ssaop.OpAMD64VCMPPS128:
		return rewriteValue_OpAMD64VCMPPS128(v)
	case ssaop.OpAMD64VCMPPS256:
		return rewriteValue_OpAMD64VCMPPS256(v)
	case ssaop.OpAMD64VCMPPS512:
		return rewriteValue_OpAMD64VCMPPS512(v)
	case ssaop.OpAMD64VCMPPSMasked128:
		return rewriteValue_OpAMD64VCMPPSMasked128(v)
	case ssaop.OpAMD64VCMPPSMasked256:
		return rewriteValue_OpAMD64VCMPPSMasked256(v)
	case ssaop.OpAMD64VCMPPSMasked512:
		return rewriteValue_OpAMD64VCMPPSMasked512(v)
	case ssaop.OpAMD64VCVTDQ2PD256:
		return rewriteValue_OpAMD64VCVTDQ2PD256(v)
	case ssaop.OpAMD64VCVTDQ2PD512:
		return rewriteValue_OpAMD64VCVTDQ2PD512(v)
	case ssaop.OpAMD64VCVTDQ2PDMasked256:
		return rewriteValue_OpAMD64VCVTDQ2PDMasked256(v)
	case ssaop.OpAMD64VCVTDQ2PDMasked512:
		return rewriteValue_OpAMD64VCVTDQ2PDMasked512(v)
	case ssaop.OpAMD64VCVTDQ2PS128:
		return rewriteValue_OpAMD64VCVTDQ2PS128(v)
	case ssaop.OpAMD64VCVTDQ2PS256:
		return rewriteValue_OpAMD64VCVTDQ2PS256(v)
	case ssaop.OpAMD64VCVTDQ2PS512:
		return rewriteValue_OpAMD64VCVTDQ2PS512(v)
	case ssaop.OpAMD64VCVTDQ2PSMasked128:
		return rewriteValue_OpAMD64VCVTDQ2PSMasked128(v)
	case ssaop.OpAMD64VCVTDQ2PSMasked256:
		return rewriteValue_OpAMD64VCVTDQ2PSMasked256(v)
	case ssaop.OpAMD64VCVTDQ2PSMasked512:
		return rewriteValue_OpAMD64VCVTDQ2PSMasked512(v)
	case ssaop.OpAMD64VCVTPD2PS256:
		return rewriteValue_OpAMD64VCVTPD2PS256(v)
	case ssaop.OpAMD64VCVTPD2PSMasked256:
		return rewriteValue_OpAMD64VCVTPD2PSMasked256(v)
	case ssaop.OpAMD64VCVTPD2PSX128:
		return rewriteValue_OpAMD64VCVTPD2PSX128(v)
	case ssaop.OpAMD64VCVTPD2PSXMasked128:
		return rewriteValue_OpAMD64VCVTPD2PSXMasked128(v)
	case ssaop.OpAMD64VCVTPD2PSY128:
		return rewriteValue_OpAMD64VCVTPD2PSY128(v)
	case ssaop.OpAMD64VCVTPD2PSYMasked128:
		return rewriteValue_OpAMD64VCVTPD2PSYMasked128(v)
	case ssaop.OpAMD64VCVTPS2PD256:
		return rewriteValue_OpAMD64VCVTPS2PD256(v)
	case ssaop.OpAMD64VCVTPS2PD512:
		return rewriteValue_OpAMD64VCVTPS2PD512(v)
	case ssaop.OpAMD64VCVTPS2PDMasked256:
		return rewriteValue_OpAMD64VCVTPS2PDMasked256(v)
	case ssaop.OpAMD64VCVTPS2PDMasked512:
		return rewriteValue_OpAMD64VCVTPS2PDMasked512(v)
	case ssaop.OpAMD64VCVTQQ2PD128:
		return rewriteValue_OpAMD64VCVTQQ2PD128(v)
	case ssaop.OpAMD64VCVTQQ2PD256:
		return rewriteValue_OpAMD64VCVTQQ2PD256(v)
	case ssaop.OpAMD64VCVTQQ2PD512:
		return rewriteValue_OpAMD64VCVTQQ2PD512(v)
	case ssaop.OpAMD64VCVTQQ2PDMasked128:
		return rewriteValue_OpAMD64VCVTQQ2PDMasked128(v)
	case ssaop.OpAMD64VCVTQQ2PDMasked256:
		return rewriteValue_OpAMD64VCVTQQ2PDMasked256(v)
	case ssaop.OpAMD64VCVTQQ2PDMasked512:
		return rewriteValue_OpAMD64VCVTQQ2PDMasked512(v)
	case ssaop.OpAMD64VCVTQQ2PS256:
		return rewriteValue_OpAMD64VCVTQQ2PS256(v)
	case ssaop.OpAMD64VCVTQQ2PSMasked256:
		return rewriteValue_OpAMD64VCVTQQ2PSMasked256(v)
	case ssaop.OpAMD64VCVTQQ2PSX128:
		return rewriteValue_OpAMD64VCVTQQ2PSX128(v)
	case ssaop.OpAMD64VCVTQQ2PSXMasked128:
		return rewriteValue_OpAMD64VCVTQQ2PSXMasked128(v)
	case ssaop.OpAMD64VCVTQQ2PSY128:
		return rewriteValue_OpAMD64VCVTQQ2PSY128(v)
	case ssaop.OpAMD64VCVTQQ2PSYMasked128:
		return rewriteValue_OpAMD64VCVTQQ2PSYMasked128(v)
	case ssaop.OpAMD64VCVTTPD2DQ256:
		return rewriteValue_OpAMD64VCVTTPD2DQ256(v)
	case ssaop.OpAMD64VCVTTPD2DQMasked256:
		return rewriteValue_OpAMD64VCVTTPD2DQMasked256(v)
	case ssaop.OpAMD64VCVTTPD2DQX128:
		return rewriteValue_OpAMD64VCVTTPD2DQX128(v)
	case ssaop.OpAMD64VCVTTPD2DQXMasked128:
		return rewriteValue_OpAMD64VCVTTPD2DQXMasked128(v)
	case ssaop.OpAMD64VCVTTPD2DQY128:
		return rewriteValue_OpAMD64VCVTTPD2DQY128(v)
	case ssaop.OpAMD64VCVTTPD2DQYMasked128:
		return rewriteValue_OpAMD64VCVTTPD2DQYMasked128(v)
	case ssaop.OpAMD64VCVTTPD2QQ128:
		return rewriteValue_OpAMD64VCVTTPD2QQ128(v)
	case ssaop.OpAMD64VCVTTPD2QQ256:
		return rewriteValue_OpAMD64VCVTTPD2QQ256(v)
	case ssaop.OpAMD64VCVTTPD2QQ512:
		return rewriteValue_OpAMD64VCVTTPD2QQ512(v)
	case ssaop.OpAMD64VCVTTPD2QQMasked128:
		return rewriteValue_OpAMD64VCVTTPD2QQMasked128(v)
	case ssaop.OpAMD64VCVTTPD2QQMasked256:
		return rewriteValue_OpAMD64VCVTTPD2QQMasked256(v)
	case ssaop.OpAMD64VCVTTPD2QQMasked512:
		return rewriteValue_OpAMD64VCVTTPD2QQMasked512(v)
	case ssaop.OpAMD64VCVTTPD2UDQ256:
		return rewriteValue_OpAMD64VCVTTPD2UDQ256(v)
	case ssaop.OpAMD64VCVTTPD2UDQMasked256:
		return rewriteValue_OpAMD64VCVTTPD2UDQMasked256(v)
	case ssaop.OpAMD64VCVTTPD2UDQX128:
		return rewriteValue_OpAMD64VCVTTPD2UDQX128(v)
	case ssaop.OpAMD64VCVTTPD2UDQXMasked128:
		return rewriteValue_OpAMD64VCVTTPD2UDQXMasked128(v)
	case ssaop.OpAMD64VCVTTPD2UDQY128:
		return rewriteValue_OpAMD64VCVTTPD2UDQY128(v)
	case ssaop.OpAMD64VCVTTPD2UDQYMasked128:
		return rewriteValue_OpAMD64VCVTTPD2UDQYMasked128(v)
	case ssaop.OpAMD64VCVTTPD2UQQ128:
		return rewriteValue_OpAMD64VCVTTPD2UQQ128(v)
	case ssaop.OpAMD64VCVTTPD2UQQ256:
		return rewriteValue_OpAMD64VCVTTPD2UQQ256(v)
	case ssaop.OpAMD64VCVTTPD2UQQ512:
		return rewriteValue_OpAMD64VCVTTPD2UQQ512(v)
	case ssaop.OpAMD64VCVTTPD2UQQMasked128:
		return rewriteValue_OpAMD64VCVTTPD2UQQMasked128(v)
	case ssaop.OpAMD64VCVTTPD2UQQMasked256:
		return rewriteValue_OpAMD64VCVTTPD2UQQMasked256(v)
	case ssaop.OpAMD64VCVTTPD2UQQMasked512:
		return rewriteValue_OpAMD64VCVTTPD2UQQMasked512(v)
	case ssaop.OpAMD64VCVTTPS2DQ128:
		return rewriteValue_OpAMD64VCVTTPS2DQ128(v)
	case ssaop.OpAMD64VCVTTPS2DQ256:
		return rewriteValue_OpAMD64VCVTTPS2DQ256(v)
	case ssaop.OpAMD64VCVTTPS2DQ512:
		return rewriteValue_OpAMD64VCVTTPS2DQ512(v)
	case ssaop.OpAMD64VCVTTPS2DQMasked128:
		return rewriteValue_OpAMD64VCVTTPS2DQMasked128(v)
	case ssaop.OpAMD64VCVTTPS2DQMasked256:
		return rewriteValue_OpAMD64VCVTTPS2DQMasked256(v)
	case ssaop.OpAMD64VCVTTPS2DQMasked512:
		return rewriteValue_OpAMD64VCVTTPS2DQMasked512(v)
	case ssaop.OpAMD64VCVTTPS2QQ256:
		return rewriteValue_OpAMD64VCVTTPS2QQ256(v)
	case ssaop.OpAMD64VCVTTPS2QQ512:
		return rewriteValue_OpAMD64VCVTTPS2QQ512(v)
	case ssaop.OpAMD64VCVTTPS2QQMasked256:
		return rewriteValue_OpAMD64VCVTTPS2QQMasked256(v)
	case ssaop.OpAMD64VCVTTPS2QQMasked512:
		return rewriteValue_OpAMD64VCVTTPS2QQMasked512(v)
	case ssaop.OpAMD64VCVTTPS2UDQ128:
		return rewriteValue_OpAMD64VCVTTPS2UDQ128(v)
	case ssaop.OpAMD64VCVTTPS2UDQ256:
		return rewriteValue_OpAMD64VCVTTPS2UDQ256(v)
	case ssaop.OpAMD64VCVTTPS2UDQ512:
		return rewriteValue_OpAMD64VCVTTPS2UDQ512(v)
	case ssaop.OpAMD64VCVTTPS2UDQMasked128:
		return rewriteValue_OpAMD64VCVTTPS2UDQMasked128(v)
	case ssaop.OpAMD64VCVTTPS2UDQMasked256:
		return rewriteValue_OpAMD64VCVTTPS2UDQMasked256(v)
	case ssaop.OpAMD64VCVTTPS2UDQMasked512:
		return rewriteValue_OpAMD64VCVTTPS2UDQMasked512(v)
	case ssaop.OpAMD64VCVTTPS2UQQ256:
		return rewriteValue_OpAMD64VCVTTPS2UQQ256(v)
	case ssaop.OpAMD64VCVTTPS2UQQ512:
		return rewriteValue_OpAMD64VCVTTPS2UQQ512(v)
	case ssaop.OpAMD64VCVTTPS2UQQMasked256:
		return rewriteValue_OpAMD64VCVTTPS2UQQMasked256(v)
	case ssaop.OpAMD64VCVTTPS2UQQMasked512:
		return rewriteValue_OpAMD64VCVTTPS2UQQMasked512(v)
	case ssaop.OpAMD64VCVTUDQ2PD256:
		return rewriteValue_OpAMD64VCVTUDQ2PD256(v)
	case ssaop.OpAMD64VCVTUDQ2PD512:
		return rewriteValue_OpAMD64VCVTUDQ2PD512(v)
	case ssaop.OpAMD64VCVTUDQ2PDMasked256:
		return rewriteValue_OpAMD64VCVTUDQ2PDMasked256(v)
	case ssaop.OpAMD64VCVTUDQ2PDMasked512:
		return rewriteValue_OpAMD64VCVTUDQ2PDMasked512(v)
	case ssaop.OpAMD64VCVTUDQ2PS128:
		return rewriteValue_OpAMD64VCVTUDQ2PS128(v)
	case ssaop.OpAMD64VCVTUDQ2PS256:
		return rewriteValue_OpAMD64VCVTUDQ2PS256(v)
	case ssaop.OpAMD64VCVTUDQ2PS512:
		return rewriteValue_OpAMD64VCVTUDQ2PS512(v)
	case ssaop.OpAMD64VCVTUDQ2PSMasked128:
		return rewriteValue_OpAMD64VCVTUDQ2PSMasked128(v)
	case ssaop.OpAMD64VCVTUDQ2PSMasked256:
		return rewriteValue_OpAMD64VCVTUDQ2PSMasked256(v)
	case ssaop.OpAMD64VCVTUDQ2PSMasked512:
		return rewriteValue_OpAMD64VCVTUDQ2PSMasked512(v)
	case ssaop.OpAMD64VCVTUQQ2PD128:
		return rewriteValue_OpAMD64VCVTUQQ2PD128(v)
	case ssaop.OpAMD64VCVTUQQ2PD256:
		return rewriteValue_OpAMD64VCVTUQQ2PD256(v)
	case ssaop.OpAMD64VCVTUQQ2PD512:
		return rewriteValue_OpAMD64VCVTUQQ2PD512(v)
	case ssaop.OpAMD64VCVTUQQ2PDMasked128:
		return rewriteValue_OpAMD64VCVTUQQ2PDMasked128(v)
	case ssaop.OpAMD64VCVTUQQ2PDMasked256:
		return rewriteValue_OpAMD64VCVTUQQ2PDMasked256(v)
	case ssaop.OpAMD64VCVTUQQ2PDMasked512:
		return rewriteValue_OpAMD64VCVTUQQ2PDMasked512(v)
	case ssaop.OpAMD64VCVTUQQ2PS256:
		return rewriteValue_OpAMD64VCVTUQQ2PS256(v)
	case ssaop.OpAMD64VCVTUQQ2PSMasked256:
		return rewriteValue_OpAMD64VCVTUQQ2PSMasked256(v)
	case ssaop.OpAMD64VCVTUQQ2PSX128:
		return rewriteValue_OpAMD64VCVTUQQ2PSX128(v)
	case ssaop.OpAMD64VCVTUQQ2PSXMasked128:
		return rewriteValue_OpAMD64VCVTUQQ2PSXMasked128(v)
	case ssaop.OpAMD64VCVTUQQ2PSY128:
		return rewriteValue_OpAMD64VCVTUQQ2PSY128(v)
	case ssaop.OpAMD64VCVTUQQ2PSYMasked128:
		return rewriteValue_OpAMD64VCVTUQQ2PSYMasked128(v)
	case ssaop.OpAMD64VDIVPD128:
		return rewriteValue_OpAMD64VDIVPD128(v)
	case ssaop.OpAMD64VDIVPD256:
		return rewriteValue_OpAMD64VDIVPD256(v)
	case ssaop.OpAMD64VDIVPD512:
		return rewriteValue_OpAMD64VDIVPD512(v)
	case ssaop.OpAMD64VDIVPDMasked128:
		return rewriteValue_OpAMD64VDIVPDMasked128(v)
	case ssaop.OpAMD64VDIVPDMasked256:
		return rewriteValue_OpAMD64VDIVPDMasked256(v)
	case ssaop.OpAMD64VDIVPDMasked512:
		return rewriteValue_OpAMD64VDIVPDMasked512(v)
	case ssaop.OpAMD64VDIVPS128:
		return rewriteValue_OpAMD64VDIVPS128(v)
	case ssaop.OpAMD64VDIVPS256:
		return rewriteValue_OpAMD64VDIVPS256(v)
	case ssaop.OpAMD64VDIVPS512:
		return rewriteValue_OpAMD64VDIVPS512(v)
	case ssaop.OpAMD64VDIVPSMasked128:
		return rewriteValue_OpAMD64VDIVPSMasked128(v)
	case ssaop.OpAMD64VDIVPSMasked256:
		return rewriteValue_OpAMD64VDIVPSMasked256(v)
	case ssaop.OpAMD64VDIVPSMasked512:
		return rewriteValue_OpAMD64VDIVPSMasked512(v)
	case ssaop.OpAMD64VEXPANDPDMasked128:
		return rewriteValue_OpAMD64VEXPANDPDMasked128(v)
	case ssaop.OpAMD64VEXPANDPDMasked256:
		return rewriteValue_OpAMD64VEXPANDPDMasked256(v)
	case ssaop.OpAMD64VEXPANDPSMasked128:
		return rewriteValue_OpAMD64VEXPANDPSMasked128(v)
	case ssaop.OpAMD64VEXPANDPSMasked256:
		return rewriteValue_OpAMD64VEXPANDPSMasked256(v)
	case ssaop.OpAMD64VFMADD213PD128:
		return rewriteValue_OpAMD64VFMADD213PD128(v)
	case ssaop.OpAMD64VFMADD213PD256:
		return rewriteValue_OpAMD64VFMADD213PD256(v)
	case ssaop.OpAMD64VFMADD213PD512:
		return rewriteValue_OpAMD64VFMADD213PD512(v)
	case ssaop.OpAMD64VFMADD213PDMasked128:
		return rewriteValue_OpAMD64VFMADD213PDMasked128(v)
	case ssaop.OpAMD64VFMADD213PDMasked256:
		return rewriteValue_OpAMD64VFMADD213PDMasked256(v)
	case ssaop.OpAMD64VFMADD213PDMasked512:
		return rewriteValue_OpAMD64VFMADD213PDMasked512(v)
	case ssaop.OpAMD64VFMADD213PS128:
		return rewriteValue_OpAMD64VFMADD213PS128(v)
	case ssaop.OpAMD64VFMADD213PS256:
		return rewriteValue_OpAMD64VFMADD213PS256(v)
	case ssaop.OpAMD64VFMADD213PS512:
		return rewriteValue_OpAMD64VFMADD213PS512(v)
	case ssaop.OpAMD64VFMADD213PSMasked128:
		return rewriteValue_OpAMD64VFMADD213PSMasked128(v)
	case ssaop.OpAMD64VFMADD213PSMasked256:
		return rewriteValue_OpAMD64VFMADD213PSMasked256(v)
	case ssaop.OpAMD64VFMADD213PSMasked512:
		return rewriteValue_OpAMD64VFMADD213PSMasked512(v)
	case ssaop.OpAMD64VFMADDSUB213PD128:
		return rewriteValue_OpAMD64VFMADDSUB213PD128(v)
	case ssaop.OpAMD64VFMADDSUB213PD256:
		return rewriteValue_OpAMD64VFMADDSUB213PD256(v)
	case ssaop.OpAMD64VFMADDSUB213PD512:
		return rewriteValue_OpAMD64VFMADDSUB213PD512(v)
	case ssaop.OpAMD64VFMADDSUB213PDMasked128:
		return rewriteValue_OpAMD64VFMADDSUB213PDMasked128(v)
	case ssaop.OpAMD64VFMADDSUB213PDMasked256:
		return rewriteValue_OpAMD64VFMADDSUB213PDMasked256(v)
	case ssaop.OpAMD64VFMADDSUB213PDMasked512:
		return rewriteValue_OpAMD64VFMADDSUB213PDMasked512(v)
	case ssaop.OpAMD64VFMADDSUB213PS128:
		return rewriteValue_OpAMD64VFMADDSUB213PS128(v)
	case ssaop.OpAMD64VFMADDSUB213PS256:
		return rewriteValue_OpAMD64VFMADDSUB213PS256(v)
	case ssaop.OpAMD64VFMADDSUB213PS512:
		return rewriteValue_OpAMD64VFMADDSUB213PS512(v)
	case ssaop.OpAMD64VFMADDSUB213PSMasked128:
		return rewriteValue_OpAMD64VFMADDSUB213PSMasked128(v)
	case ssaop.OpAMD64VFMADDSUB213PSMasked256:
		return rewriteValue_OpAMD64VFMADDSUB213PSMasked256(v)
	case ssaop.OpAMD64VFMADDSUB213PSMasked512:
		return rewriteValue_OpAMD64VFMADDSUB213PSMasked512(v)
	case ssaop.OpAMD64VFMSUBADD213PD128:
		return rewriteValue_OpAMD64VFMSUBADD213PD128(v)
	case ssaop.OpAMD64VFMSUBADD213PD256:
		return rewriteValue_OpAMD64VFMSUBADD213PD256(v)
	case ssaop.OpAMD64VFMSUBADD213PD512:
		return rewriteValue_OpAMD64VFMSUBADD213PD512(v)
	case ssaop.OpAMD64VFMSUBADD213PDMasked128:
		return rewriteValue_OpAMD64VFMSUBADD213PDMasked128(v)
	case ssaop.OpAMD64VFMSUBADD213PDMasked256:
		return rewriteValue_OpAMD64VFMSUBADD213PDMasked256(v)
	case ssaop.OpAMD64VFMSUBADD213PDMasked512:
		return rewriteValue_OpAMD64VFMSUBADD213PDMasked512(v)
	case ssaop.OpAMD64VFMSUBADD213PS128:
		return rewriteValue_OpAMD64VFMSUBADD213PS128(v)
	case ssaop.OpAMD64VFMSUBADD213PS256:
		return rewriteValue_OpAMD64VFMSUBADD213PS256(v)
	case ssaop.OpAMD64VFMSUBADD213PS512:
		return rewriteValue_OpAMD64VFMSUBADD213PS512(v)
	case ssaop.OpAMD64VFMSUBADD213PSMasked128:
		return rewriteValue_OpAMD64VFMSUBADD213PSMasked128(v)
	case ssaop.OpAMD64VFMSUBADD213PSMasked256:
		return rewriteValue_OpAMD64VFMSUBADD213PSMasked256(v)
	case ssaop.OpAMD64VFMSUBADD213PSMasked512:
		return rewriteValue_OpAMD64VFMSUBADD213PSMasked512(v)
	case ssaop.OpAMD64VGF2P8AFFINEINVQB128:
		return rewriteValue_OpAMD64VGF2P8AFFINEINVQB128(v)
	case ssaop.OpAMD64VGF2P8AFFINEINVQB256:
		return rewriteValue_OpAMD64VGF2P8AFFINEINVQB256(v)
	case ssaop.OpAMD64VGF2P8AFFINEINVQB512:
		return rewriteValue_OpAMD64VGF2P8AFFINEINVQB512(v)
	case ssaop.OpAMD64VGF2P8AFFINEINVQBMasked128:
		return rewriteValue_OpAMD64VGF2P8AFFINEINVQBMasked128(v)
	case ssaop.OpAMD64VGF2P8AFFINEINVQBMasked256:
		return rewriteValue_OpAMD64VGF2P8AFFINEINVQBMasked256(v)
	case ssaop.OpAMD64VGF2P8AFFINEINVQBMasked512:
		return rewriteValue_OpAMD64VGF2P8AFFINEINVQBMasked512(v)
	case ssaop.OpAMD64VGF2P8AFFINEQB128:
		return rewriteValue_OpAMD64VGF2P8AFFINEQB128(v)
	case ssaop.OpAMD64VGF2P8AFFINEQB256:
		return rewriteValue_OpAMD64VGF2P8AFFINEQB256(v)
	case ssaop.OpAMD64VGF2P8AFFINEQB512:
		return rewriteValue_OpAMD64VGF2P8AFFINEQB512(v)
	case ssaop.OpAMD64VGF2P8AFFINEQBMasked128:
		return rewriteValue_OpAMD64VGF2P8AFFINEQBMasked128(v)
	case ssaop.OpAMD64VGF2P8AFFINEQBMasked256:
		return rewriteValue_OpAMD64VGF2P8AFFINEQBMasked256(v)
	case ssaop.OpAMD64VGF2P8AFFINEQBMasked512:
		return rewriteValue_OpAMD64VGF2P8AFFINEQBMasked512(v)
	case ssaop.OpAMD64VGF2P8MULB128:
		return rewriteValue_OpAMD64VGF2P8MULB128(v)
	case ssaop.OpAMD64VGF2P8MULB256:
		return rewriteValue_OpAMD64VGF2P8MULB256(v)
	case ssaop.OpAMD64VGF2P8MULBMasked128:
		return rewriteValue_OpAMD64VGF2P8MULBMasked128(v)
	case ssaop.OpAMD64VGF2P8MULBMasked256:
		return rewriteValue_OpAMD64VGF2P8MULBMasked256(v)
	case ssaop.OpAMD64VHADDPD128:
		return rewriteValue_OpAMD64VHADDPD128(v)
	case ssaop.OpAMD64VHADDPD256:
		return rewriteValue_OpAMD64VHADDPD256(v)
	case ssaop.OpAMD64VHADDPS128:
		return rewriteValue_OpAMD64VHADDPS128(v)
	case ssaop.OpAMD64VHADDPS256:
		return rewriteValue_OpAMD64VHADDPS256(v)
	case ssaop.OpAMD64VHSUBPD128:
		return rewriteValue_OpAMD64VHSUBPD128(v)
	case ssaop.OpAMD64VHSUBPD256:
		return rewriteValue_OpAMD64VHSUBPD256(v)
	case ssaop.OpAMD64VHSUBPS128:
		return rewriteValue_OpAMD64VHSUBPS128(v)
	case ssaop.OpAMD64VHSUBPS256:
		return rewriteValue_OpAMD64VHSUBPS256(v)
	case ssaop.OpAMD64VINSERTF128256:
		return rewriteValue_OpAMD64VINSERTF128256(v)
	case ssaop.OpAMD64VINSERTF64X4512:
		return rewriteValue_OpAMD64VINSERTF64X4512(v)
	case ssaop.OpAMD64VINSERTI128256:
		return rewriteValue_OpAMD64VINSERTI128256(v)
	case ssaop.OpAMD64VINSERTI64X4512:
		return rewriteValue_OpAMD64VINSERTI64X4512(v)
	case ssaop.OpAMD64VMAXPD128:
		return rewriteValue_OpAMD64VMAXPD128(v)
	case ssaop.OpAMD64VMAXPD256:
		return rewriteValue_OpAMD64VMAXPD256(v)
	case ssaop.OpAMD64VMAXPD512:
		return rewriteValue_OpAMD64VMAXPD512(v)
	case ssaop.OpAMD64VMAXPDMasked128:
		return rewriteValue_OpAMD64VMAXPDMasked128(v)
	case ssaop.OpAMD64VMAXPDMasked256:
		return rewriteValue_OpAMD64VMAXPDMasked256(v)
	case ssaop.OpAMD64VMAXPDMasked512:
		return rewriteValue_OpAMD64VMAXPDMasked512(v)
	case ssaop.OpAMD64VMAXPS128:
		return rewriteValue_OpAMD64VMAXPS128(v)
	case ssaop.OpAMD64VMAXPS256:
		return rewriteValue_OpAMD64VMAXPS256(v)
	case ssaop.OpAMD64VMAXPS512:
		return rewriteValue_OpAMD64VMAXPS512(v)
	case ssaop.OpAMD64VMAXPSMasked128:
		return rewriteValue_OpAMD64VMAXPSMasked128(v)
	case ssaop.OpAMD64VMAXPSMasked256:
		return rewriteValue_OpAMD64VMAXPSMasked256(v)
	case ssaop.OpAMD64VMAXPSMasked512:
		return rewriteValue_OpAMD64VMAXPSMasked512(v)
	case ssaop.OpAMD64VMINPD128:
		return rewriteValue_OpAMD64VMINPD128(v)
	case ssaop.OpAMD64VMINPD256:
		return rewriteValue_OpAMD64VMINPD256(v)
	case ssaop.OpAMD64VMINPD512:
		return rewriteValue_OpAMD64VMINPD512(v)
	case ssaop.OpAMD64VMINPDMasked128:
		return rewriteValue_OpAMD64VMINPDMasked128(v)
	case ssaop.OpAMD64VMINPDMasked256:
		return rewriteValue_OpAMD64VMINPDMasked256(v)
	case ssaop.OpAMD64VMINPDMasked512:
		return rewriteValue_OpAMD64VMINPDMasked512(v)
	case ssaop.OpAMD64VMINPS128:
		return rewriteValue_OpAMD64VMINPS128(v)
	case ssaop.OpAMD64VMINPS256:
		return rewriteValue_OpAMD64VMINPS256(v)
	case ssaop.OpAMD64VMINPS512:
		return rewriteValue_OpAMD64VMINPS512(v)
	case ssaop.OpAMD64VMINPSMasked128:
		return rewriteValue_OpAMD64VMINPSMasked128(v)
	case ssaop.OpAMD64VMINPSMasked256:
		return rewriteValue_OpAMD64VMINPSMasked256(v)
	case ssaop.OpAMD64VMINPSMasked512:
		return rewriteValue_OpAMD64VMINPSMasked512(v)
	case ssaop.OpAMD64VMOVD:
		return rewriteValue_OpAMD64VMOVD(v)
	case ssaop.OpAMD64VMOVDQU16Masked128:
		return rewriteValue_OpAMD64VMOVDQU16Masked128(v)
	case ssaop.OpAMD64VMOVDQU16Masked256:
		return rewriteValue_OpAMD64VMOVDQU16Masked256(v)
	case ssaop.OpAMD64VMOVDQU16Masked512:
		return rewriteValue_OpAMD64VMOVDQU16Masked512(v)
	case ssaop.OpAMD64VMOVDQU32Masked128:
		return rewriteValue_OpAMD64VMOVDQU32Masked128(v)
	case ssaop.OpAMD64VMOVDQU32Masked256:
		return rewriteValue_OpAMD64VMOVDQU32Masked256(v)
	case ssaop.OpAMD64VMOVDQU32Masked512:
		return rewriteValue_OpAMD64VMOVDQU32Masked512(v)
	case ssaop.OpAMD64VMOVDQU64Masked128:
		return rewriteValue_OpAMD64VMOVDQU64Masked128(v)
	case ssaop.OpAMD64VMOVDQU64Masked256:
		return rewriteValue_OpAMD64VMOVDQU64Masked256(v)
	case ssaop.OpAMD64VMOVDQU64Masked512:
		return rewriteValue_OpAMD64VMOVDQU64Masked512(v)
	case ssaop.OpAMD64VMOVDQU8Masked128:
		return rewriteValue_OpAMD64VMOVDQU8Masked128(v)
	case ssaop.OpAMD64VMOVDQU8Masked256:
		return rewriteValue_OpAMD64VMOVDQU8Masked256(v)
	case ssaop.OpAMD64VMOVDQU8Masked512:
		return rewriteValue_OpAMD64VMOVDQU8Masked512(v)
	case ssaop.OpAMD64VMOVDQUload128:
		return rewriteValue_OpAMD64VMOVDQUload128(v)
	case ssaop.OpAMD64VMOVDQUload256:
		return rewriteValue_OpAMD64VMOVDQUload256(v)
	case ssaop.OpAMD64VMOVDQUload512:
		return rewriteValue_OpAMD64VMOVDQUload512(v)
	case ssaop.OpAMD64VMOVDQUstore128:
		return rewriteValue_OpAMD64VMOVDQUstore128(v)
	case ssaop.OpAMD64VMOVDQUstore256:
		return rewriteValue_OpAMD64VMOVDQUstore256(v)
	case ssaop.OpAMD64VMOVDQUstore512:
		return rewriteValue_OpAMD64VMOVDQUstore512(v)
	case ssaop.OpAMD64VMOVQ:
		return rewriteValue_OpAMD64VMOVQ(v)
	case ssaop.OpAMD64VMOVSDf2v:
		return rewriteValue_OpAMD64VMOVSDf2v(v)
	case ssaop.OpAMD64VMOVSSf2v:
		return rewriteValue_OpAMD64VMOVSSf2v(v)
	case ssaop.OpAMD64VMULPD128:
		return rewriteValue_OpAMD64VMULPD128(v)
	case ssaop.OpAMD64VMULPD256:
		return rewriteValue_OpAMD64VMULPD256(v)
	case ssaop.OpAMD64VMULPD512:
		return rewriteValue_OpAMD64VMULPD512(v)
	case ssaop.OpAMD64VMULPDMasked128:
		return rewriteValue_OpAMD64VMULPDMasked128(v)
	case ssaop.OpAMD64VMULPDMasked256:
		return rewriteValue_OpAMD64VMULPDMasked256(v)
	case ssaop.OpAMD64VMULPDMasked512:
		return rewriteValue_OpAMD64VMULPDMasked512(v)
	case ssaop.OpAMD64VMULPS128:
		return rewriteValue_OpAMD64VMULPS128(v)
	case ssaop.OpAMD64VMULPS256:
		return rewriteValue_OpAMD64VMULPS256(v)
	case ssaop.OpAMD64VMULPS512:
		return rewriteValue_OpAMD64VMULPS512(v)
	case ssaop.OpAMD64VMULPSMasked128:
		return rewriteValue_OpAMD64VMULPSMasked128(v)
	case ssaop.OpAMD64VMULPSMasked256:
		return rewriteValue_OpAMD64VMULPSMasked256(v)
	case ssaop.OpAMD64VMULPSMasked512:
		return rewriteValue_OpAMD64VMULPSMasked512(v)
	case ssaop.OpAMD64VPABSB128:
		return rewriteValue_OpAMD64VPABSB128(v)
	case ssaop.OpAMD64VPABSB256:
		return rewriteValue_OpAMD64VPABSB256(v)
	case ssaop.OpAMD64VPABSBMasked128:
		return rewriteValue_OpAMD64VPABSBMasked128(v)
	case ssaop.OpAMD64VPABSBMasked256:
		return rewriteValue_OpAMD64VPABSBMasked256(v)
	case ssaop.OpAMD64VPABSD128:
		return rewriteValue_OpAMD64VPABSD128(v)
	case ssaop.OpAMD64VPABSD256:
		return rewriteValue_OpAMD64VPABSD256(v)
	case ssaop.OpAMD64VPABSD512:
		return rewriteValue_OpAMD64VPABSD512(v)
	case ssaop.OpAMD64VPABSDMasked128:
		return rewriteValue_OpAMD64VPABSDMasked128(v)
	case ssaop.OpAMD64VPABSDMasked256:
		return rewriteValue_OpAMD64VPABSDMasked256(v)
	case ssaop.OpAMD64VPABSDMasked512:
		return rewriteValue_OpAMD64VPABSDMasked512(v)
	case ssaop.OpAMD64VPABSQ128:
		return rewriteValue_OpAMD64VPABSQ128(v)
	case ssaop.OpAMD64VPABSQ256:
		return rewriteValue_OpAMD64VPABSQ256(v)
	case ssaop.OpAMD64VPABSQ512:
		return rewriteValue_OpAMD64VPABSQ512(v)
	case ssaop.OpAMD64VPABSQMasked128:
		return rewriteValue_OpAMD64VPABSQMasked128(v)
	case ssaop.OpAMD64VPABSQMasked256:
		return rewriteValue_OpAMD64VPABSQMasked256(v)
	case ssaop.OpAMD64VPABSQMasked512:
		return rewriteValue_OpAMD64VPABSQMasked512(v)
	case ssaop.OpAMD64VPABSW128:
		return rewriteValue_OpAMD64VPABSW128(v)
	case ssaop.OpAMD64VPABSW256:
		return rewriteValue_OpAMD64VPABSW256(v)
	case ssaop.OpAMD64VPABSWMasked128:
		return rewriteValue_OpAMD64VPABSWMasked128(v)
	case ssaop.OpAMD64VPABSWMasked256:
		return rewriteValue_OpAMD64VPABSWMasked256(v)
	case ssaop.OpAMD64VPACKSSDW128:
		return rewriteValue_OpAMD64VPACKSSDW128(v)
	case ssaop.OpAMD64VPACKSSDW256:
		return rewriteValue_OpAMD64VPACKSSDW256(v)
	case ssaop.OpAMD64VPACKSSDW512:
		return rewriteValue_OpAMD64VPACKSSDW512(v)
	case ssaop.OpAMD64VPACKSSDWMasked128:
		return rewriteValue_OpAMD64VPACKSSDWMasked128(v)
	case ssaop.OpAMD64VPACKSSDWMasked256:
		return rewriteValue_OpAMD64VPACKSSDWMasked256(v)
	case ssaop.OpAMD64VPACKSSDWMasked512:
		return rewriteValue_OpAMD64VPACKSSDWMasked512(v)
	case ssaop.OpAMD64VPACKUSDW128:
		return rewriteValue_OpAMD64VPACKUSDW128(v)
	case ssaop.OpAMD64VPACKUSDW256:
		return rewriteValue_OpAMD64VPACKUSDW256(v)
	case ssaop.OpAMD64VPACKUSDW512:
		return rewriteValue_OpAMD64VPACKUSDW512(v)
	case ssaop.OpAMD64VPACKUSDWMasked128:
		return rewriteValue_OpAMD64VPACKUSDWMasked128(v)
	case ssaop.OpAMD64VPACKUSDWMasked256:
		return rewriteValue_OpAMD64VPACKUSDWMasked256(v)
	case ssaop.OpAMD64VPACKUSDWMasked512:
		return rewriteValue_OpAMD64VPACKUSDWMasked512(v)
	case ssaop.OpAMD64VPADDB128:
		return rewriteValue_OpAMD64VPADDB128(v)
	case ssaop.OpAMD64VPADDB256:
		return rewriteValue_OpAMD64VPADDB256(v)
	case ssaop.OpAMD64VPADDBMasked128:
		return rewriteValue_OpAMD64VPADDBMasked128(v)
	case ssaop.OpAMD64VPADDBMasked256:
		return rewriteValue_OpAMD64VPADDBMasked256(v)
	case ssaop.OpAMD64VPADDD128:
		return rewriteValue_OpAMD64VPADDD128(v)
	case ssaop.OpAMD64VPADDD256:
		return rewriteValue_OpAMD64VPADDD256(v)
	case ssaop.OpAMD64VPADDD512:
		return rewriteValue_OpAMD64VPADDD512(v)
	case ssaop.OpAMD64VPADDDMasked128:
		return rewriteValue_OpAMD64VPADDDMasked128(v)
	case ssaop.OpAMD64VPADDDMasked256:
		return rewriteValue_OpAMD64VPADDDMasked256(v)
	case ssaop.OpAMD64VPADDDMasked512:
		return rewriteValue_OpAMD64VPADDDMasked512(v)
	case ssaop.OpAMD64VPADDQ128:
		return rewriteValue_OpAMD64VPADDQ128(v)
	case ssaop.OpAMD64VPADDQ256:
		return rewriteValue_OpAMD64VPADDQ256(v)
	case ssaop.OpAMD64VPADDQ512:
		return rewriteValue_OpAMD64VPADDQ512(v)
	case ssaop.OpAMD64VPADDQMasked128:
		return rewriteValue_OpAMD64VPADDQMasked128(v)
	case ssaop.OpAMD64VPADDQMasked256:
		return rewriteValue_OpAMD64VPADDQMasked256(v)
	case ssaop.OpAMD64VPADDQMasked512:
		return rewriteValue_OpAMD64VPADDQMasked512(v)
	case ssaop.OpAMD64VPADDSB128:
		return rewriteValue_OpAMD64VPADDSB128(v)
	case ssaop.OpAMD64VPADDSB256:
		return rewriteValue_OpAMD64VPADDSB256(v)
	case ssaop.OpAMD64VPADDSBMasked128:
		return rewriteValue_OpAMD64VPADDSBMasked128(v)
	case ssaop.OpAMD64VPADDSBMasked256:
		return rewriteValue_OpAMD64VPADDSBMasked256(v)
	case ssaop.OpAMD64VPADDSW128:
		return rewriteValue_OpAMD64VPADDSW128(v)
	case ssaop.OpAMD64VPADDSW256:
		return rewriteValue_OpAMD64VPADDSW256(v)
	case ssaop.OpAMD64VPADDSWMasked128:
		return rewriteValue_OpAMD64VPADDSWMasked128(v)
	case ssaop.OpAMD64VPADDSWMasked256:
		return rewriteValue_OpAMD64VPADDSWMasked256(v)
	case ssaop.OpAMD64VPADDUSB128:
		return rewriteValue_OpAMD64VPADDUSB128(v)
	case ssaop.OpAMD64VPADDUSB256:
		return rewriteValue_OpAMD64VPADDUSB256(v)
	case ssaop.OpAMD64VPADDUSBMasked128:
		return rewriteValue_OpAMD64VPADDUSBMasked128(v)
	case ssaop.OpAMD64VPADDUSBMasked256:
		return rewriteValue_OpAMD64VPADDUSBMasked256(v)
	case ssaop.OpAMD64VPADDUSW128:
		return rewriteValue_OpAMD64VPADDUSW128(v)
	case ssaop.OpAMD64VPADDUSW256:
		return rewriteValue_OpAMD64VPADDUSW256(v)
	case ssaop.OpAMD64VPADDUSWMasked128:
		return rewriteValue_OpAMD64VPADDUSWMasked128(v)
	case ssaop.OpAMD64VPADDUSWMasked256:
		return rewriteValue_OpAMD64VPADDUSWMasked256(v)
	case ssaop.OpAMD64VPADDW128:
		return rewriteValue_OpAMD64VPADDW128(v)
	case ssaop.OpAMD64VPADDW256:
		return rewriteValue_OpAMD64VPADDW256(v)
	case ssaop.OpAMD64VPADDWMasked128:
		return rewriteValue_OpAMD64VPADDWMasked128(v)
	case ssaop.OpAMD64VPADDWMasked256:
		return rewriteValue_OpAMD64VPADDWMasked256(v)
	case ssaop.OpAMD64VPALIGNR128:
		return rewriteValue_OpAMD64VPALIGNR128(v)
	case ssaop.OpAMD64VPALIGNR256:
		return rewriteValue_OpAMD64VPALIGNR256(v)
	case ssaop.OpAMD64VPALIGNRMasked128:
		return rewriteValue_OpAMD64VPALIGNRMasked128(v)
	case ssaop.OpAMD64VPALIGNRMasked256:
		return rewriteValue_OpAMD64VPALIGNRMasked256(v)
	case ssaop.OpAMD64VPAND128:
		return rewriteValue_OpAMD64VPAND128(v)
	case ssaop.OpAMD64VPAND256:
		return rewriteValue_OpAMD64VPAND256(v)
	case ssaop.OpAMD64VPANDD512:
		return rewriteValue_OpAMD64VPANDD512(v)
	case ssaop.OpAMD64VPANDDMasked128:
		return rewriteValue_OpAMD64VPANDDMasked128(v)
	case ssaop.OpAMD64VPANDDMasked256:
		return rewriteValue_OpAMD64VPANDDMasked256(v)
	case ssaop.OpAMD64VPANDDMasked512:
		return rewriteValue_OpAMD64VPANDDMasked512(v)
	case ssaop.OpAMD64VPANDN128:
		return rewriteValue_OpAMD64VPANDN128(v)
	case ssaop.OpAMD64VPANDN256:
		return rewriteValue_OpAMD64VPANDN256(v)
	case ssaop.OpAMD64VPANDND512:
		return rewriteValue_OpAMD64VPANDND512(v)
	case ssaop.OpAMD64VPANDNDMasked128:
		return rewriteValue_OpAMD64VPANDNDMasked128(v)
	case ssaop.OpAMD64VPANDNDMasked256:
		return rewriteValue_OpAMD64VPANDNDMasked256(v)
	case ssaop.OpAMD64VPANDNDMasked512:
		return rewriteValue_OpAMD64VPANDNDMasked512(v)
	case ssaop.OpAMD64VPANDNQ512:
		return rewriteValue_OpAMD64VPANDNQ512(v)
	case ssaop.OpAMD64VPANDNQMasked128:
		return rewriteValue_OpAMD64VPANDNQMasked128(v)
	case ssaop.OpAMD64VPANDNQMasked256:
		return rewriteValue_OpAMD64VPANDNQMasked256(v)
	case ssaop.OpAMD64VPANDNQMasked512:
		return rewriteValue_OpAMD64VPANDNQMasked512(v)
	case ssaop.OpAMD64VPANDQ512:
		return rewriteValue_OpAMD64VPANDQ512(v)
	case ssaop.OpAMD64VPANDQMasked128:
		return rewriteValue_OpAMD64VPANDQMasked128(v)
	case ssaop.OpAMD64VPANDQMasked256:
		return rewriteValue_OpAMD64VPANDQMasked256(v)
	case ssaop.OpAMD64VPANDQMasked512:
		return rewriteValue_OpAMD64VPANDQMasked512(v)
	case ssaop.OpAMD64VPAVGB128:
		return rewriteValue_OpAMD64VPAVGB128(v)
	case ssaop.OpAMD64VPAVGB256:
		return rewriteValue_OpAMD64VPAVGB256(v)
	case ssaop.OpAMD64VPAVGBMasked128:
		return rewriteValue_OpAMD64VPAVGBMasked128(v)
	case ssaop.OpAMD64VPAVGBMasked256:
		return rewriteValue_OpAMD64VPAVGBMasked256(v)
	case ssaop.OpAMD64VPAVGW128:
		return rewriteValue_OpAMD64VPAVGW128(v)
	case ssaop.OpAMD64VPAVGW256:
		return rewriteValue_OpAMD64VPAVGW256(v)
	case ssaop.OpAMD64VPAVGWMasked128:
		return rewriteValue_OpAMD64VPAVGWMasked128(v)
	case ssaop.OpAMD64VPAVGWMasked256:
		return rewriteValue_OpAMD64VPAVGWMasked256(v)
	case ssaop.OpAMD64VPBLENDMBMasked512:
		return rewriteValue_OpAMD64VPBLENDMBMasked512(v)
	case ssaop.OpAMD64VPBLENDMDMasked512:
		return rewriteValue_OpAMD64VPBLENDMDMasked512(v)
	case ssaop.OpAMD64VPBLENDMQMasked512:
		return rewriteValue_OpAMD64VPBLENDMQMasked512(v)
	case ssaop.OpAMD64VPBLENDMWMasked512:
		return rewriteValue_OpAMD64VPBLENDMWMasked512(v)
	case ssaop.OpAMD64VPBLENDVB128:
		return rewriteValue_OpAMD64VPBLENDVB128(v)
	case ssaop.OpAMD64VPBLENDVB256:
		return rewriteValue_OpAMD64VPBLENDVB256(v)
	case ssaop.OpAMD64VPBROADCASTB128:
		return rewriteValue_OpAMD64VPBROADCASTB128(v)
	case ssaop.OpAMD64VPBROADCASTB256:
		return rewriteValue_OpAMD64VPBROADCASTB256(v)
	case ssaop.OpAMD64VPBROADCASTB512:
		return rewriteValue_OpAMD64VPBROADCASTB512(v)
	case ssaop.OpAMD64VPBROADCASTBMasked128:
		return rewriteValue_OpAMD64VPBROADCASTBMasked128(v)
	case ssaop.OpAMD64VPBROADCASTBMasked256:
		return rewriteValue_OpAMD64VPBROADCASTBMasked256(v)
	case ssaop.OpAMD64VPBROADCASTBMasked512:
		return rewriteValue_OpAMD64VPBROADCASTBMasked512(v)
	case ssaop.OpAMD64VPBROADCASTD128:
		return rewriteValue_OpAMD64VPBROADCASTD128(v)
	case ssaop.OpAMD64VPBROADCASTD256:
		return rewriteValue_OpAMD64VPBROADCASTD256(v)
	case ssaop.OpAMD64VPBROADCASTD512:
		return rewriteValue_OpAMD64VPBROADCASTD512(v)
	case ssaop.OpAMD64VPBROADCASTDMasked128:
		return rewriteValue_OpAMD64VPBROADCASTDMasked128(v)
	case ssaop.OpAMD64VPBROADCASTDMasked256:
		return rewriteValue_OpAMD64VPBROADCASTDMasked256(v)
	case ssaop.OpAMD64VPBROADCASTDMasked512:
		return rewriteValue_OpAMD64VPBROADCASTDMasked512(v)
	case ssaop.OpAMD64VPBROADCASTQ128:
		return rewriteValue_OpAMD64VPBROADCASTQ128(v)
	case ssaop.OpAMD64VPBROADCASTQ256:
		return rewriteValue_OpAMD64VPBROADCASTQ256(v)
	case ssaop.OpAMD64VPBROADCASTQ512:
		return rewriteValue_OpAMD64VPBROADCASTQ512(v)
	case ssaop.OpAMD64VPBROADCASTQMasked128:
		return rewriteValue_OpAMD64VPBROADCASTQMasked128(v)
	case ssaop.OpAMD64VPBROADCASTQMasked256:
		return rewriteValue_OpAMD64VPBROADCASTQMasked256(v)
	case ssaop.OpAMD64VPBROADCASTQMasked512:
		return rewriteValue_OpAMD64VPBROADCASTQMasked512(v)
	case ssaop.OpAMD64VPBROADCASTW128:
		return rewriteValue_OpAMD64VPBROADCASTW128(v)
	case ssaop.OpAMD64VPBROADCASTW256:
		return rewriteValue_OpAMD64VPBROADCASTW256(v)
	case ssaop.OpAMD64VPBROADCASTW512:
		return rewriteValue_OpAMD64VPBROADCASTW512(v)
	case ssaop.OpAMD64VPCLMULQDQ128:
		return rewriteValue_OpAMD64VPCLMULQDQ128(v)
	case ssaop.OpAMD64VPCLMULQDQ256:
		return rewriteValue_OpAMD64VPCLMULQDQ256(v)
	case ssaop.OpAMD64VPCMPBMasked128:
		return rewriteValue_OpAMD64VPCMPBMasked128(v)
	case ssaop.OpAMD64VPCMPBMasked256:
		return rewriteValue_OpAMD64VPCMPBMasked256(v)
	case ssaop.OpAMD64VPCMPD512:
		return rewriteValue_OpAMD64VPCMPD512(v)
	case ssaop.OpAMD64VPCMPDMasked128:
		return rewriteValue_OpAMD64VPCMPDMasked128(v)
	case ssaop.OpAMD64VPCMPDMasked256:
		return rewriteValue_OpAMD64VPCMPDMasked256(v)
	case ssaop.OpAMD64VPCMPDMasked512:
		return rewriteValue_OpAMD64VPCMPDMasked512(v)
	case ssaop.OpAMD64VPCMPEQB128:
		return rewriteValue_OpAMD64VPCMPEQB128(v)
	case ssaop.OpAMD64VPCMPEQB256:
		return rewriteValue_OpAMD64VPCMPEQB256(v)
	case ssaop.OpAMD64VPCMPEQD128:
		return rewriteValue_OpAMD64VPCMPEQD128(v)
	case ssaop.OpAMD64VPCMPEQD256:
		return rewriteValue_OpAMD64VPCMPEQD256(v)
	case ssaop.OpAMD64VPCMPEQD512:
		return rewriteValue_OpAMD64VPCMPEQD512(v)
	case ssaop.OpAMD64VPCMPEQQ128:
		return rewriteValue_OpAMD64VPCMPEQQ128(v)
	case ssaop.OpAMD64VPCMPEQQ256:
		return rewriteValue_OpAMD64VPCMPEQQ256(v)
	case ssaop.OpAMD64VPCMPEQQ512:
		return rewriteValue_OpAMD64VPCMPEQQ512(v)
	case ssaop.OpAMD64VPCMPEQW128:
		return rewriteValue_OpAMD64VPCMPEQW128(v)
	case ssaop.OpAMD64VPCMPEQW256:
		return rewriteValue_OpAMD64VPCMPEQW256(v)
	case ssaop.OpAMD64VPCMPGTB128:
		return rewriteValue_OpAMD64VPCMPGTB128(v)
	case ssaop.OpAMD64VPCMPGTB256:
		return rewriteValue_OpAMD64VPCMPGTB256(v)
	case ssaop.OpAMD64VPCMPGTD128:
		return rewriteValue_OpAMD64VPCMPGTD128(v)
	case ssaop.OpAMD64VPCMPGTD256:
		return rewriteValue_OpAMD64VPCMPGTD256(v)
	case ssaop.OpAMD64VPCMPGTD512:
		return rewriteValue_OpAMD64VPCMPGTD512(v)
	case ssaop.OpAMD64VPCMPGTQ128:
		return rewriteValue_OpAMD64VPCMPGTQ128(v)
	case ssaop.OpAMD64VPCMPGTQ256:
		return rewriteValue_OpAMD64VPCMPGTQ256(v)
	case ssaop.OpAMD64VPCMPGTQ512:
		return rewriteValue_OpAMD64VPCMPGTQ512(v)
	case ssaop.OpAMD64VPCMPGTW128:
		return rewriteValue_OpAMD64VPCMPGTW128(v)
	case ssaop.OpAMD64VPCMPGTW256:
		return rewriteValue_OpAMD64VPCMPGTW256(v)
	case ssaop.OpAMD64VPCMPQ512:
		return rewriteValue_OpAMD64VPCMPQ512(v)
	case ssaop.OpAMD64VPCMPQMasked128:
		return rewriteValue_OpAMD64VPCMPQMasked128(v)
	case ssaop.OpAMD64VPCMPQMasked256:
		return rewriteValue_OpAMD64VPCMPQMasked256(v)
	case ssaop.OpAMD64VPCMPQMasked512:
		return rewriteValue_OpAMD64VPCMPQMasked512(v)
	case ssaop.OpAMD64VPCMPUBMasked128:
		return rewriteValue_OpAMD64VPCMPUBMasked128(v)
	case ssaop.OpAMD64VPCMPUBMasked256:
		return rewriteValue_OpAMD64VPCMPUBMasked256(v)
	case ssaop.OpAMD64VPCMPUD512:
		return rewriteValue_OpAMD64VPCMPUD512(v)
	case ssaop.OpAMD64VPCMPUDMasked128:
		return rewriteValue_OpAMD64VPCMPUDMasked128(v)
	case ssaop.OpAMD64VPCMPUDMasked256:
		return rewriteValue_OpAMD64VPCMPUDMasked256(v)
	case ssaop.OpAMD64VPCMPUDMasked512:
		return rewriteValue_OpAMD64VPCMPUDMasked512(v)
	case ssaop.OpAMD64VPCMPUQ512:
		return rewriteValue_OpAMD64VPCMPUQ512(v)
	case ssaop.OpAMD64VPCMPUQMasked128:
		return rewriteValue_OpAMD64VPCMPUQMasked128(v)
	case ssaop.OpAMD64VPCMPUQMasked256:
		return rewriteValue_OpAMD64VPCMPUQMasked256(v)
	case ssaop.OpAMD64VPCMPUQMasked512:
		return rewriteValue_OpAMD64VPCMPUQMasked512(v)
	case ssaop.OpAMD64VPCMPUWMasked128:
		return rewriteValue_OpAMD64VPCMPUWMasked128(v)
	case ssaop.OpAMD64VPCMPUWMasked256:
		return rewriteValue_OpAMD64VPCMPUWMasked256(v)
	case ssaop.OpAMD64VPCMPWMasked128:
		return rewriteValue_OpAMD64VPCMPWMasked128(v)
	case ssaop.OpAMD64VPCMPWMasked256:
		return rewriteValue_OpAMD64VPCMPWMasked256(v)
	case ssaop.OpAMD64VPDPWSSD128:
		return rewriteValue_OpAMD64VPDPWSSD128(v)
	case ssaop.OpAMD64VPDPWSSD256:
		return rewriteValue_OpAMD64VPDPWSSD256(v)
	case ssaop.OpAMD64VPDPWSSD512:
		return rewriteValue_OpAMD64VPDPWSSD512(v)
	case ssaop.OpAMD64VPDPWSSDMasked128:
		return rewriteValue_OpAMD64VPDPWSSDMasked128(v)
	case ssaop.OpAMD64VPDPWSSDMasked256:
		return rewriteValue_OpAMD64VPDPWSSDMasked256(v)
	case ssaop.OpAMD64VPDPWSSDMasked512:
		return rewriteValue_OpAMD64VPDPWSSDMasked512(v)
	case ssaop.OpAMD64VPERM2F128256:
		return rewriteValue_OpAMD64VPERM2F128256(v)
	case ssaop.OpAMD64VPERM2I128256:
		return rewriteValue_OpAMD64VPERM2I128256(v)
	case ssaop.OpAMD64VPERMB128:
		return rewriteValue_OpAMD64VPERMB128(v)
	case ssaop.OpAMD64VPERMB256:
		return rewriteValue_OpAMD64VPERMB256(v)
	case ssaop.OpAMD64VPERMBMasked128:
		return rewriteValue_OpAMD64VPERMBMasked128(v)
	case ssaop.OpAMD64VPERMBMasked256:
		return rewriteValue_OpAMD64VPERMBMasked256(v)
	case ssaop.OpAMD64VPERMD256:
		return rewriteValue_OpAMD64VPERMD256(v)
	case ssaop.OpAMD64VPERMD512:
		return rewriteValue_OpAMD64VPERMD512(v)
	case ssaop.OpAMD64VPERMDMasked256:
		return rewriteValue_OpAMD64VPERMDMasked256(v)
	case ssaop.OpAMD64VPERMDMasked512:
		return rewriteValue_OpAMD64VPERMDMasked512(v)
	case ssaop.OpAMD64VPERMI2B128:
		return rewriteValue_OpAMD64VPERMI2B128(v)
	case ssaop.OpAMD64VPERMI2B256:
		return rewriteValue_OpAMD64VPERMI2B256(v)
	case ssaop.OpAMD64VPERMI2BMasked128:
		return rewriteValue_OpAMD64VPERMI2BMasked128(v)
	case ssaop.OpAMD64VPERMI2BMasked256:
		return rewriteValue_OpAMD64VPERMI2BMasked256(v)
	case ssaop.OpAMD64VPERMI2D128:
		return rewriteValue_OpAMD64VPERMI2D128(v)
	case ssaop.OpAMD64VPERMI2D256:
		return rewriteValue_OpAMD64VPERMI2D256(v)
	case ssaop.OpAMD64VPERMI2D512:
		return rewriteValue_OpAMD64VPERMI2D512(v)
	case ssaop.OpAMD64VPERMI2DMasked128:
		return rewriteValue_OpAMD64VPERMI2DMasked128(v)
	case ssaop.OpAMD64VPERMI2DMasked256:
		return rewriteValue_OpAMD64VPERMI2DMasked256(v)
	case ssaop.OpAMD64VPERMI2DMasked512:
		return rewriteValue_OpAMD64VPERMI2DMasked512(v)
	case ssaop.OpAMD64VPERMI2PD128:
		return rewriteValue_OpAMD64VPERMI2PD128(v)
	case ssaop.OpAMD64VPERMI2PD256:
		return rewriteValue_OpAMD64VPERMI2PD256(v)
	case ssaop.OpAMD64VPERMI2PD512:
		return rewriteValue_OpAMD64VPERMI2PD512(v)
	case ssaop.OpAMD64VPERMI2PDMasked128:
		return rewriteValue_OpAMD64VPERMI2PDMasked128(v)
	case ssaop.OpAMD64VPERMI2PDMasked256:
		return rewriteValue_OpAMD64VPERMI2PDMasked256(v)
	case ssaop.OpAMD64VPERMI2PDMasked512:
		return rewriteValue_OpAMD64VPERMI2PDMasked512(v)
	case ssaop.OpAMD64VPERMI2PS128:
		return rewriteValue_OpAMD64VPERMI2PS128(v)
	case ssaop.OpAMD64VPERMI2PS256:
		return rewriteValue_OpAMD64VPERMI2PS256(v)
	case ssaop.OpAMD64VPERMI2PS512:
		return rewriteValue_OpAMD64VPERMI2PS512(v)
	case ssaop.OpAMD64VPERMI2PSMasked128:
		return rewriteValue_OpAMD64VPERMI2PSMasked128(v)
	case ssaop.OpAMD64VPERMI2PSMasked256:
		return rewriteValue_OpAMD64VPERMI2PSMasked256(v)
	case ssaop.OpAMD64VPERMI2PSMasked512:
		return rewriteValue_OpAMD64VPERMI2PSMasked512(v)
	case ssaop.OpAMD64VPERMI2Q128:
		return rewriteValue_OpAMD64VPERMI2Q128(v)
	case ssaop.OpAMD64VPERMI2Q256:
		return rewriteValue_OpAMD64VPERMI2Q256(v)
	case ssaop.OpAMD64VPERMI2Q512:
		return rewriteValue_OpAMD64VPERMI2Q512(v)
	case ssaop.OpAMD64VPERMI2QMasked128:
		return rewriteValue_OpAMD64VPERMI2QMasked128(v)
	case ssaop.OpAMD64VPERMI2QMasked256:
		return rewriteValue_OpAMD64VPERMI2QMasked256(v)
	case ssaop.OpAMD64VPERMI2QMasked512:
		return rewriteValue_OpAMD64VPERMI2QMasked512(v)
	case ssaop.OpAMD64VPERMI2W128:
		return rewriteValue_OpAMD64VPERMI2W128(v)
	case ssaop.OpAMD64VPERMI2W256:
		return rewriteValue_OpAMD64VPERMI2W256(v)
	case ssaop.OpAMD64VPERMI2WMasked128:
		return rewriteValue_OpAMD64VPERMI2WMasked128(v)
	case ssaop.OpAMD64VPERMI2WMasked256:
		return rewriteValue_OpAMD64VPERMI2WMasked256(v)
	case ssaop.OpAMD64VPERMPD256:
		return rewriteValue_OpAMD64VPERMPD256(v)
	case ssaop.OpAMD64VPERMPD512:
		return rewriteValue_OpAMD64VPERMPD512(v)
	case ssaop.OpAMD64VPERMPDMasked256:
		return rewriteValue_OpAMD64VPERMPDMasked256(v)
	case ssaop.OpAMD64VPERMPDMasked512:
		return rewriteValue_OpAMD64VPERMPDMasked512(v)
	case ssaop.OpAMD64VPERMPS256:
		return rewriteValue_OpAMD64VPERMPS256(v)
	case ssaop.OpAMD64VPERMPS512:
		return rewriteValue_OpAMD64VPERMPS512(v)
	case ssaop.OpAMD64VPERMPSMasked256:
		return rewriteValue_OpAMD64VPERMPSMasked256(v)
	case ssaop.OpAMD64VPERMPSMasked512:
		return rewriteValue_OpAMD64VPERMPSMasked512(v)
	case ssaop.OpAMD64VPERMQ256:
		return rewriteValue_OpAMD64VPERMQ256(v)
	case ssaop.OpAMD64VPERMQ512:
		return rewriteValue_OpAMD64VPERMQ512(v)
	case ssaop.OpAMD64VPERMQMasked256:
		return rewriteValue_OpAMD64VPERMQMasked256(v)
	case ssaop.OpAMD64VPERMQMasked512:
		return rewriteValue_OpAMD64VPERMQMasked512(v)
	case ssaop.OpAMD64VPERMW128:
		return rewriteValue_OpAMD64VPERMW128(v)
	case ssaop.OpAMD64VPERMW256:
		return rewriteValue_OpAMD64VPERMW256(v)
	case ssaop.OpAMD64VPERMWMasked128:
		return rewriteValue_OpAMD64VPERMWMasked128(v)
	case ssaop.OpAMD64VPERMWMasked256:
		return rewriteValue_OpAMD64VPERMWMasked256(v)
	case ssaop.OpAMD64VPEXPANDBMasked128:
		return rewriteValue_OpAMD64VPEXPANDBMasked128(v)
	case ssaop.OpAMD64VPEXPANDBMasked256:
		return rewriteValue_OpAMD64VPEXPANDBMasked256(v)
	case ssaop.OpAMD64VPEXPANDDMasked128:
		return rewriteValue_OpAMD64VPEXPANDDMasked128(v)
	case ssaop.OpAMD64VPEXPANDDMasked256:
		return rewriteValue_OpAMD64VPEXPANDDMasked256(v)
	case ssaop.OpAMD64VPEXPANDQMasked128:
		return rewriteValue_OpAMD64VPEXPANDQMasked128(v)
	case ssaop.OpAMD64VPEXPANDQMasked256:
		return rewriteValue_OpAMD64VPEXPANDQMasked256(v)
	case ssaop.OpAMD64VPEXPANDWMasked128:
		return rewriteValue_OpAMD64VPEXPANDWMasked128(v)
	case ssaop.OpAMD64VPEXPANDWMasked256:
		return rewriteValue_OpAMD64VPEXPANDWMasked256(v)
	case ssaop.OpAMD64VPHADDD128:
		return rewriteValue_OpAMD64VPHADDD128(v)
	case ssaop.OpAMD64VPHADDD256:
		return rewriteValue_OpAMD64VPHADDD256(v)
	case ssaop.OpAMD64VPHADDSW128:
		return rewriteValue_OpAMD64VPHADDSW128(v)
	case ssaop.OpAMD64VPHADDSW256:
		return rewriteValue_OpAMD64VPHADDSW256(v)
	case ssaop.OpAMD64VPHADDW128:
		return rewriteValue_OpAMD64VPHADDW128(v)
	case ssaop.OpAMD64VPHADDW256:
		return rewriteValue_OpAMD64VPHADDW256(v)
	case ssaop.OpAMD64VPHSUBD128:
		return rewriteValue_OpAMD64VPHSUBD128(v)
	case ssaop.OpAMD64VPHSUBD256:
		return rewriteValue_OpAMD64VPHSUBD256(v)
	case ssaop.OpAMD64VPHSUBSW128:
		return rewriteValue_OpAMD64VPHSUBSW128(v)
	case ssaop.OpAMD64VPHSUBSW256:
		return rewriteValue_OpAMD64VPHSUBSW256(v)
	case ssaop.OpAMD64VPHSUBW128:
		return rewriteValue_OpAMD64VPHSUBW128(v)
	case ssaop.OpAMD64VPHSUBW256:
		return rewriteValue_OpAMD64VPHSUBW256(v)
	case ssaop.OpAMD64VPINSRD128:
		return rewriteValue_OpAMD64VPINSRD128(v)
	case ssaop.OpAMD64VPINSRQ128:
		return rewriteValue_OpAMD64VPINSRQ128(v)
	case ssaop.OpAMD64VPLZCNTD128:
		return rewriteValue_OpAMD64VPLZCNTD128(v)
	case ssaop.OpAMD64VPLZCNTD256:
		return rewriteValue_OpAMD64VPLZCNTD256(v)
	case ssaop.OpAMD64VPLZCNTD512:
		return rewriteValue_OpAMD64VPLZCNTD512(v)
	case ssaop.OpAMD64VPLZCNTDMasked128:
		return rewriteValue_OpAMD64VPLZCNTDMasked128(v)
	case ssaop.OpAMD64VPLZCNTDMasked256:
		return rewriteValue_OpAMD64VPLZCNTDMasked256(v)
	case ssaop.OpAMD64VPLZCNTDMasked512:
		return rewriteValue_OpAMD64VPLZCNTDMasked512(v)
	case ssaop.OpAMD64VPLZCNTQ128:
		return rewriteValue_OpAMD64VPLZCNTQ128(v)
	case ssaop.OpAMD64VPLZCNTQ256:
		return rewriteValue_OpAMD64VPLZCNTQ256(v)
	case ssaop.OpAMD64VPLZCNTQ512:
		return rewriteValue_OpAMD64VPLZCNTQ512(v)
	case ssaop.OpAMD64VPLZCNTQMasked128:
		return rewriteValue_OpAMD64VPLZCNTQMasked128(v)
	case ssaop.OpAMD64VPLZCNTQMasked256:
		return rewriteValue_OpAMD64VPLZCNTQMasked256(v)
	case ssaop.OpAMD64VPLZCNTQMasked512:
		return rewriteValue_OpAMD64VPLZCNTQMasked512(v)
	case ssaop.OpAMD64VPMADDUBSW128:
		return rewriteValue_OpAMD64VPMADDUBSW128(v)
	case ssaop.OpAMD64VPMADDUBSW256:
		return rewriteValue_OpAMD64VPMADDUBSW256(v)
	case ssaop.OpAMD64VPMADDUBSWMasked128:
		return rewriteValue_OpAMD64VPMADDUBSWMasked128(v)
	case ssaop.OpAMD64VPMADDUBSWMasked256:
		return rewriteValue_OpAMD64VPMADDUBSWMasked256(v)
	case ssaop.OpAMD64VPMADDWD128:
		return rewriteValue_OpAMD64VPMADDWD128(v)
	case ssaop.OpAMD64VPMADDWD256:
		return rewriteValue_OpAMD64VPMADDWD256(v)
	case ssaop.OpAMD64VPMADDWDMasked128:
		return rewriteValue_OpAMD64VPMADDWDMasked128(v)
	case ssaop.OpAMD64VPMADDWDMasked256:
		return rewriteValue_OpAMD64VPMADDWDMasked256(v)
	case ssaop.OpAMD64VPMAXSB128:
		return rewriteValue_OpAMD64VPMAXSB128(v)
	case ssaop.OpAMD64VPMAXSB256:
		return rewriteValue_OpAMD64VPMAXSB256(v)
	case ssaop.OpAMD64VPMAXSBMasked128:
		return rewriteValue_OpAMD64VPMAXSBMasked128(v)
	case ssaop.OpAMD64VPMAXSBMasked256:
		return rewriteValue_OpAMD64VPMAXSBMasked256(v)
	case ssaop.OpAMD64VPMAXSD128:
		return rewriteValue_OpAMD64VPMAXSD128(v)
	case ssaop.OpAMD64VPMAXSD256:
		return rewriteValue_OpAMD64VPMAXSD256(v)
	case ssaop.OpAMD64VPMAXSD512:
		return rewriteValue_OpAMD64VPMAXSD512(v)
	case ssaop.OpAMD64VPMAXSDMasked128:
		return rewriteValue_OpAMD64VPMAXSDMasked128(v)
	case ssaop.OpAMD64VPMAXSDMasked256:
		return rewriteValue_OpAMD64VPMAXSDMasked256(v)
	case ssaop.OpAMD64VPMAXSDMasked512:
		return rewriteValue_OpAMD64VPMAXSDMasked512(v)
	case ssaop.OpAMD64VPMAXSQ128:
		return rewriteValue_OpAMD64VPMAXSQ128(v)
	case ssaop.OpAMD64VPMAXSQ256:
		return rewriteValue_OpAMD64VPMAXSQ256(v)
	case ssaop.OpAMD64VPMAXSQ512:
		return rewriteValue_OpAMD64VPMAXSQ512(v)
	case ssaop.OpAMD64VPMAXSQMasked128:
		return rewriteValue_OpAMD64VPMAXSQMasked128(v)
	case ssaop.OpAMD64VPMAXSQMasked256:
		return rewriteValue_OpAMD64VPMAXSQMasked256(v)
	case ssaop.OpAMD64VPMAXSQMasked512:
		return rewriteValue_OpAMD64VPMAXSQMasked512(v)
	case ssaop.OpAMD64VPMAXSW128:
		return rewriteValue_OpAMD64VPMAXSW128(v)
	case ssaop.OpAMD64VPMAXSW256:
		return rewriteValue_OpAMD64VPMAXSW256(v)
	case ssaop.OpAMD64VPMAXSWMasked128:
		return rewriteValue_OpAMD64VPMAXSWMasked128(v)
	case ssaop.OpAMD64VPMAXSWMasked256:
		return rewriteValue_OpAMD64VPMAXSWMasked256(v)
	case ssaop.OpAMD64VPMAXUB128:
		return rewriteValue_OpAMD64VPMAXUB128(v)
	case ssaop.OpAMD64VPMAXUB256:
		return rewriteValue_OpAMD64VPMAXUB256(v)
	case ssaop.OpAMD64VPMAXUBMasked128:
		return rewriteValue_OpAMD64VPMAXUBMasked128(v)
	case ssaop.OpAMD64VPMAXUBMasked256:
		return rewriteValue_OpAMD64VPMAXUBMasked256(v)
	case ssaop.OpAMD64VPMAXUD128:
		return rewriteValue_OpAMD64VPMAXUD128(v)
	case ssaop.OpAMD64VPMAXUD256:
		return rewriteValue_OpAMD64VPMAXUD256(v)
	case ssaop.OpAMD64VPMAXUD512:
		return rewriteValue_OpAMD64VPMAXUD512(v)
	case ssaop.OpAMD64VPMAXUDMasked128:
		return rewriteValue_OpAMD64VPMAXUDMasked128(v)
	case ssaop.OpAMD64VPMAXUDMasked256:
		return rewriteValue_OpAMD64VPMAXUDMasked256(v)
	case ssaop.OpAMD64VPMAXUDMasked512:
		return rewriteValue_OpAMD64VPMAXUDMasked512(v)
	case ssaop.OpAMD64VPMAXUQ128:
		return rewriteValue_OpAMD64VPMAXUQ128(v)
	case ssaop.OpAMD64VPMAXUQ256:
		return rewriteValue_OpAMD64VPMAXUQ256(v)
	case ssaop.OpAMD64VPMAXUQ512:
		return rewriteValue_OpAMD64VPMAXUQ512(v)
	case ssaop.OpAMD64VPMAXUQMasked128:
		return rewriteValue_OpAMD64VPMAXUQMasked128(v)
	case ssaop.OpAMD64VPMAXUQMasked256:
		return rewriteValue_OpAMD64VPMAXUQMasked256(v)
	case ssaop.OpAMD64VPMAXUQMasked512:
		return rewriteValue_OpAMD64VPMAXUQMasked512(v)
	case ssaop.OpAMD64VPMAXUW128:
		return rewriteValue_OpAMD64VPMAXUW128(v)
	case ssaop.OpAMD64VPMAXUW256:
		return rewriteValue_OpAMD64VPMAXUW256(v)
	case ssaop.OpAMD64VPMAXUWMasked128:
		return rewriteValue_OpAMD64VPMAXUWMasked128(v)
	case ssaop.OpAMD64VPMAXUWMasked256:
		return rewriteValue_OpAMD64VPMAXUWMasked256(v)
	case ssaop.OpAMD64VPMINSB128:
		return rewriteValue_OpAMD64VPMINSB128(v)
	case ssaop.OpAMD64VPMINSB256:
		return rewriteValue_OpAMD64VPMINSB256(v)
	case ssaop.OpAMD64VPMINSBMasked128:
		return rewriteValue_OpAMD64VPMINSBMasked128(v)
	case ssaop.OpAMD64VPMINSBMasked256:
		return rewriteValue_OpAMD64VPMINSBMasked256(v)
	case ssaop.OpAMD64VPMINSD128:
		return rewriteValue_OpAMD64VPMINSD128(v)
	case ssaop.OpAMD64VPMINSD256:
		return rewriteValue_OpAMD64VPMINSD256(v)
	case ssaop.OpAMD64VPMINSD512:
		return rewriteValue_OpAMD64VPMINSD512(v)
	case ssaop.OpAMD64VPMINSDMasked128:
		return rewriteValue_OpAMD64VPMINSDMasked128(v)
	case ssaop.OpAMD64VPMINSDMasked256:
		return rewriteValue_OpAMD64VPMINSDMasked256(v)
	case ssaop.OpAMD64VPMINSDMasked512:
		return rewriteValue_OpAMD64VPMINSDMasked512(v)
	case ssaop.OpAMD64VPMINSQ128:
		return rewriteValue_OpAMD64VPMINSQ128(v)
	case ssaop.OpAMD64VPMINSQ256:
		return rewriteValue_OpAMD64VPMINSQ256(v)
	case ssaop.OpAMD64VPMINSQ512:
		return rewriteValue_OpAMD64VPMINSQ512(v)
	case ssaop.OpAMD64VPMINSQMasked128:
		return rewriteValue_OpAMD64VPMINSQMasked128(v)
	case ssaop.OpAMD64VPMINSQMasked256:
		return rewriteValue_OpAMD64VPMINSQMasked256(v)
	case ssaop.OpAMD64VPMINSQMasked512:
		return rewriteValue_OpAMD64VPMINSQMasked512(v)
	case ssaop.OpAMD64VPMINSW128:
		return rewriteValue_OpAMD64VPMINSW128(v)
	case ssaop.OpAMD64VPMINSW256:
		return rewriteValue_OpAMD64VPMINSW256(v)
	case ssaop.OpAMD64VPMINSWMasked128:
		return rewriteValue_OpAMD64VPMINSWMasked128(v)
	case ssaop.OpAMD64VPMINSWMasked256:
		return rewriteValue_OpAMD64VPMINSWMasked256(v)
	case ssaop.OpAMD64VPMINUB128:
		return rewriteValue_OpAMD64VPMINUB128(v)
	case ssaop.OpAMD64VPMINUB256:
		return rewriteValue_OpAMD64VPMINUB256(v)
	case ssaop.OpAMD64VPMINUBMasked128:
		return rewriteValue_OpAMD64VPMINUBMasked128(v)
	case ssaop.OpAMD64VPMINUBMasked256:
		return rewriteValue_OpAMD64VPMINUBMasked256(v)
	case ssaop.OpAMD64VPMINUD128:
		return rewriteValue_OpAMD64VPMINUD128(v)
	case ssaop.OpAMD64VPMINUD256:
		return rewriteValue_OpAMD64VPMINUD256(v)
	case ssaop.OpAMD64VPMINUD512:
		return rewriteValue_OpAMD64VPMINUD512(v)
	case ssaop.OpAMD64VPMINUDMasked128:
		return rewriteValue_OpAMD64VPMINUDMasked128(v)
	case ssaop.OpAMD64VPMINUDMasked256:
		return rewriteValue_OpAMD64VPMINUDMasked256(v)
	case ssaop.OpAMD64VPMINUDMasked512:
		return rewriteValue_OpAMD64VPMINUDMasked512(v)
	case ssaop.OpAMD64VPMINUQ128:
		return rewriteValue_OpAMD64VPMINUQ128(v)
	case ssaop.OpAMD64VPMINUQ256:
		return rewriteValue_OpAMD64VPMINUQ256(v)
	case ssaop.OpAMD64VPMINUQ512:
		return rewriteValue_OpAMD64VPMINUQ512(v)
	case ssaop.OpAMD64VPMINUQMasked128:
		return rewriteValue_OpAMD64VPMINUQMasked128(v)
	case ssaop.OpAMD64VPMINUQMasked256:
		return rewriteValue_OpAMD64VPMINUQMasked256(v)
	case ssaop.OpAMD64VPMINUQMasked512:
		return rewriteValue_OpAMD64VPMINUQMasked512(v)
	case ssaop.OpAMD64VPMINUW128:
		return rewriteValue_OpAMD64VPMINUW128(v)
	case ssaop.OpAMD64VPMINUW256:
		return rewriteValue_OpAMD64VPMINUW256(v)
	case ssaop.OpAMD64VPMINUWMasked128:
		return rewriteValue_OpAMD64VPMINUWMasked128(v)
	case ssaop.OpAMD64VPMINUWMasked256:
		return rewriteValue_OpAMD64VPMINUWMasked256(v)
	case ssaop.OpAMD64VPMOVSXBD128:
		return rewriteValue_OpAMD64VPMOVSXBD128(v)
	case ssaop.OpAMD64VPMOVSXBD256:
		return rewriteValue_OpAMD64VPMOVSXBD256(v)
	case ssaop.OpAMD64VPMOVSXBD512:
		return rewriteValue_OpAMD64VPMOVSXBD512(v)
	case ssaop.OpAMD64VPMOVSXBDMasked128:
		return rewriteValue_OpAMD64VPMOVSXBDMasked128(v)
	case ssaop.OpAMD64VPMOVSXBDMasked256:
		return rewriteValue_OpAMD64VPMOVSXBDMasked256(v)
	case ssaop.OpAMD64VPMOVSXBDMasked512:
		return rewriteValue_OpAMD64VPMOVSXBDMasked512(v)
	case ssaop.OpAMD64VPMOVSXBQ128:
		return rewriteValue_OpAMD64VPMOVSXBQ128(v)
	case ssaop.OpAMD64VPMOVSXBQ256:
		return rewriteValue_OpAMD64VPMOVSXBQ256(v)
	case ssaop.OpAMD64VPMOVSXBQ512:
		return rewriteValue_OpAMD64VPMOVSXBQ512(v)
	case ssaop.OpAMD64VPMOVSXBQMasked256:
		return rewriteValue_OpAMD64VPMOVSXBQMasked256(v)
	case ssaop.OpAMD64VPMOVSXBQMasked512:
		return rewriteValue_OpAMD64VPMOVSXBQMasked512(v)
	case ssaop.OpAMD64VPMOVSXBW128:
		return rewriteValue_OpAMD64VPMOVSXBW128(v)
	case ssaop.OpAMD64VPMOVSXBW256:
		return rewriteValue_OpAMD64VPMOVSXBW256(v)
	case ssaop.OpAMD64VPMOVSXBW512:
		return rewriteValue_OpAMD64VPMOVSXBW512(v)
	case ssaop.OpAMD64VPMOVSXBWMasked128:
		return rewriteValue_OpAMD64VPMOVSXBWMasked128(v)
	case ssaop.OpAMD64VPMOVSXBWMasked256:
		return rewriteValue_OpAMD64VPMOVSXBWMasked256(v)
	case ssaop.OpAMD64VPMOVSXBWMasked512:
		return rewriteValue_OpAMD64VPMOVSXBWMasked512(v)
	case ssaop.OpAMD64VPMOVSXDQ128:
		return rewriteValue_OpAMD64VPMOVSXDQ128(v)
	case ssaop.OpAMD64VPMOVSXDQ256:
		return rewriteValue_OpAMD64VPMOVSXDQ256(v)
	case ssaop.OpAMD64VPMOVSXDQ512:
		return rewriteValue_OpAMD64VPMOVSXDQ512(v)
	case ssaop.OpAMD64VPMOVSXDQMasked128:
		return rewriteValue_OpAMD64VPMOVSXDQMasked128(v)
	case ssaop.OpAMD64VPMOVSXDQMasked256:
		return rewriteValue_OpAMD64VPMOVSXDQMasked256(v)
	case ssaop.OpAMD64VPMOVSXDQMasked512:
		return rewriteValue_OpAMD64VPMOVSXDQMasked512(v)
	case ssaop.OpAMD64VPMOVSXWD128:
		return rewriteValue_OpAMD64VPMOVSXWD128(v)
	case ssaop.OpAMD64VPMOVSXWD256:
		return rewriteValue_OpAMD64VPMOVSXWD256(v)
	case ssaop.OpAMD64VPMOVSXWD512:
		return rewriteValue_OpAMD64VPMOVSXWD512(v)
	case ssaop.OpAMD64VPMOVSXWDMasked128:
		return rewriteValue_OpAMD64VPMOVSXWDMasked128(v)
	case ssaop.OpAMD64VPMOVSXWDMasked256:
		return rewriteValue_OpAMD64VPMOVSXWDMasked256(v)
	case ssaop.OpAMD64VPMOVSXWDMasked512:
		return rewriteValue_OpAMD64VPMOVSXWDMasked512(v)
	case ssaop.OpAMD64VPMOVSXWQ128:
		return rewriteValue_OpAMD64VPMOVSXWQ128(v)
	case ssaop.OpAMD64VPMOVSXWQ256:
		return rewriteValue_OpAMD64VPMOVSXWQ256(v)
	case ssaop.OpAMD64VPMOVSXWQ512:
		return rewriteValue_OpAMD64VPMOVSXWQ512(v)
	case ssaop.OpAMD64VPMOVSXWQMasked128:
		return rewriteValue_OpAMD64VPMOVSXWQMasked128(v)
	case ssaop.OpAMD64VPMOVSXWQMasked256:
		return rewriteValue_OpAMD64VPMOVSXWQMasked256(v)
	case ssaop.OpAMD64VPMOVSXWQMasked512:
		return rewriteValue_OpAMD64VPMOVSXWQMasked512(v)
	case ssaop.OpAMD64VPMOVVec16x16ToM:
		return rewriteValue_OpAMD64VPMOVVec16x16ToM(v)
	case ssaop.OpAMD64VPMOVVec16x32ToM:
		return rewriteValue_OpAMD64VPMOVVec16x32ToM(v)
	case ssaop.OpAMD64VPMOVVec16x8ToM:
		return rewriteValue_OpAMD64VPMOVVec16x8ToM(v)
	case ssaop.OpAMD64VPMOVVec32x16ToM:
		return rewriteValue_OpAMD64VPMOVVec32x16ToM(v)
	case ssaop.OpAMD64VPMOVVec32x4ToM:
		return rewriteValue_OpAMD64VPMOVVec32x4ToM(v)
	case ssaop.OpAMD64VPMOVVec32x8ToM:
		return rewriteValue_OpAMD64VPMOVVec32x8ToM(v)
	case ssaop.OpAMD64VPMOVVec64x2ToM:
		return rewriteValue_OpAMD64VPMOVVec64x2ToM(v)
	case ssaop.OpAMD64VPMOVVec64x4ToM:
		return rewriteValue_OpAMD64VPMOVVec64x4ToM(v)
	case ssaop.OpAMD64VPMOVVec64x8ToM:
		return rewriteValue_OpAMD64VPMOVVec64x8ToM(v)
	case ssaop.OpAMD64VPMOVVec8x16ToM:
		return rewriteValue_OpAMD64VPMOVVec8x16ToM(v)
	case ssaop.OpAMD64VPMOVVec8x32ToM:
		return rewriteValue_OpAMD64VPMOVVec8x32ToM(v)
	case ssaop.OpAMD64VPMOVVec8x64ToM:
		return rewriteValue_OpAMD64VPMOVVec8x64ToM(v)
	case ssaop.OpAMD64VPMOVZXBD128:
		return rewriteValue_OpAMD64VPMOVZXBD128(v)
	case ssaop.OpAMD64VPMOVZXBD256:
		return rewriteValue_OpAMD64VPMOVZXBD256(v)
	case ssaop.OpAMD64VPMOVZXBD512:
		return rewriteValue_OpAMD64VPMOVZXBD512(v)
	case ssaop.OpAMD64VPMOVZXBDMasked128:
		return rewriteValue_OpAMD64VPMOVZXBDMasked128(v)
	case ssaop.OpAMD64VPMOVZXBDMasked256:
		return rewriteValue_OpAMD64VPMOVZXBDMasked256(v)
	case ssaop.OpAMD64VPMOVZXBDMasked512:
		return rewriteValue_OpAMD64VPMOVZXBDMasked512(v)
	case ssaop.OpAMD64VPMOVZXBQ128:
		return rewriteValue_OpAMD64VPMOVZXBQ128(v)
	case ssaop.OpAMD64VPMOVZXBQ256:
		return rewriteValue_OpAMD64VPMOVZXBQ256(v)
	case ssaop.OpAMD64VPMOVZXBQ512:
		return rewriteValue_OpAMD64VPMOVZXBQ512(v)
	case ssaop.OpAMD64VPMOVZXBQMasked256:
		return rewriteValue_OpAMD64VPMOVZXBQMasked256(v)
	case ssaop.OpAMD64VPMOVZXBQMasked512:
		return rewriteValue_OpAMD64VPMOVZXBQMasked512(v)
	case ssaop.OpAMD64VPMOVZXBW128:
		return rewriteValue_OpAMD64VPMOVZXBW128(v)
	case ssaop.OpAMD64VPMOVZXBW256:
		return rewriteValue_OpAMD64VPMOVZXBW256(v)
	case ssaop.OpAMD64VPMOVZXBW512:
		return rewriteValue_OpAMD64VPMOVZXBW512(v)
	case ssaop.OpAMD64VPMOVZXBWMasked128:
		return rewriteValue_OpAMD64VPMOVZXBWMasked128(v)
	case ssaop.OpAMD64VPMOVZXBWMasked256:
		return rewriteValue_OpAMD64VPMOVZXBWMasked256(v)
	case ssaop.OpAMD64VPMOVZXBWMasked512:
		return rewriteValue_OpAMD64VPMOVZXBWMasked512(v)
	case ssaop.OpAMD64VPMOVZXDQ128:
		return rewriteValue_OpAMD64VPMOVZXDQ128(v)
	case ssaop.OpAMD64VPMOVZXDQ256:
		return rewriteValue_OpAMD64VPMOVZXDQ256(v)
	case ssaop.OpAMD64VPMOVZXDQ512:
		return rewriteValue_OpAMD64VPMOVZXDQ512(v)
	case ssaop.OpAMD64VPMOVZXDQMasked128:
		return rewriteValue_OpAMD64VPMOVZXDQMasked128(v)
	case ssaop.OpAMD64VPMOVZXDQMasked256:
		return rewriteValue_OpAMD64VPMOVZXDQMasked256(v)
	case ssaop.OpAMD64VPMOVZXDQMasked512:
		return rewriteValue_OpAMD64VPMOVZXDQMasked512(v)
	case ssaop.OpAMD64VPMOVZXWD128:
		return rewriteValue_OpAMD64VPMOVZXWD128(v)
	case ssaop.OpAMD64VPMOVZXWD256:
		return rewriteValue_OpAMD64VPMOVZXWD256(v)
	case ssaop.OpAMD64VPMOVZXWD512:
		return rewriteValue_OpAMD64VPMOVZXWD512(v)
	case ssaop.OpAMD64VPMOVZXWDMasked128:
		return rewriteValue_OpAMD64VPMOVZXWDMasked128(v)
	case ssaop.OpAMD64VPMOVZXWDMasked256:
		return rewriteValue_OpAMD64VPMOVZXWDMasked256(v)
	case ssaop.OpAMD64VPMOVZXWDMasked512:
		return rewriteValue_OpAMD64VPMOVZXWDMasked512(v)
	case ssaop.OpAMD64VPMOVZXWQ128:
		return rewriteValue_OpAMD64VPMOVZXWQ128(v)
	case ssaop.OpAMD64VPMOVZXWQ256:
		return rewriteValue_OpAMD64VPMOVZXWQ256(v)
	case ssaop.OpAMD64VPMOVZXWQ512:
		return rewriteValue_OpAMD64VPMOVZXWQ512(v)
	case ssaop.OpAMD64VPMOVZXWQMasked128:
		return rewriteValue_OpAMD64VPMOVZXWQMasked128(v)
	case ssaop.OpAMD64VPMOVZXWQMasked256:
		return rewriteValue_OpAMD64VPMOVZXWQMasked256(v)
	case ssaop.OpAMD64VPMOVZXWQMasked512:
		return rewriteValue_OpAMD64VPMOVZXWQMasked512(v)
	case ssaop.OpAMD64VPMULDQ128:
		return rewriteValue_OpAMD64VPMULDQ128(v)
	case ssaop.OpAMD64VPMULDQ256:
		return rewriteValue_OpAMD64VPMULDQ256(v)
	case ssaop.OpAMD64VPMULHUW128:
		return rewriteValue_OpAMD64VPMULHUW128(v)
	case ssaop.OpAMD64VPMULHUW256:
		return rewriteValue_OpAMD64VPMULHUW256(v)
	case ssaop.OpAMD64VPMULHUWMasked128:
		return rewriteValue_OpAMD64VPMULHUWMasked128(v)
	case ssaop.OpAMD64VPMULHUWMasked256:
		return rewriteValue_OpAMD64VPMULHUWMasked256(v)
	case ssaop.OpAMD64VPMULHW128:
		return rewriteValue_OpAMD64VPMULHW128(v)
	case ssaop.OpAMD64VPMULHW256:
		return rewriteValue_OpAMD64VPMULHW256(v)
	case ssaop.OpAMD64VPMULHWMasked128:
		return rewriteValue_OpAMD64VPMULHWMasked128(v)
	case ssaop.OpAMD64VPMULHWMasked256:
		return rewriteValue_OpAMD64VPMULHWMasked256(v)
	case ssaop.OpAMD64VPMULLD128:
		return rewriteValue_OpAMD64VPMULLD128(v)
	case ssaop.OpAMD64VPMULLD256:
		return rewriteValue_OpAMD64VPMULLD256(v)
	case ssaop.OpAMD64VPMULLD512:
		return rewriteValue_OpAMD64VPMULLD512(v)
	case ssaop.OpAMD64VPMULLDMasked128:
		return rewriteValue_OpAMD64VPMULLDMasked128(v)
	case ssaop.OpAMD64VPMULLDMasked256:
		return rewriteValue_OpAMD64VPMULLDMasked256(v)
	case ssaop.OpAMD64VPMULLDMasked512:
		return rewriteValue_OpAMD64VPMULLDMasked512(v)
	case ssaop.OpAMD64VPMULLQ128:
		return rewriteValue_OpAMD64VPMULLQ128(v)
	case ssaop.OpAMD64VPMULLQ256:
		return rewriteValue_OpAMD64VPMULLQ256(v)
	case ssaop.OpAMD64VPMULLQ512:
		return rewriteValue_OpAMD64VPMULLQ512(v)
	case ssaop.OpAMD64VPMULLQMasked128:
		return rewriteValue_OpAMD64VPMULLQMasked128(v)
	case ssaop.OpAMD64VPMULLQMasked256:
		return rewriteValue_OpAMD64VPMULLQMasked256(v)
	case ssaop.OpAMD64VPMULLQMasked512:
		return rewriteValue_OpAMD64VPMULLQMasked512(v)
	case ssaop.OpAMD64VPMULLW128:
		return rewriteValue_OpAMD64VPMULLW128(v)
	case ssaop.OpAMD64VPMULLW256:
		return rewriteValue_OpAMD64VPMULLW256(v)
	case ssaop.OpAMD64VPMULLW512:
		return rewriteValue_OpAMD64VPMULLW512(v)
	case ssaop.OpAMD64VPMULLWMasked128:
		return rewriteValue_OpAMD64VPMULLWMasked128(v)
	case ssaop.OpAMD64VPMULLWMasked256:
		return rewriteValue_OpAMD64VPMULLWMasked256(v)
	case ssaop.OpAMD64VPMULUDQ128:
		return rewriteValue_OpAMD64VPMULUDQ128(v)
	case ssaop.OpAMD64VPMULUDQ256:
		return rewriteValue_OpAMD64VPMULUDQ256(v)
	case ssaop.OpAMD64VPOPCNTB128:
		return rewriteValue_OpAMD64VPOPCNTB128(v)
	case ssaop.OpAMD64VPOPCNTB256:
		return rewriteValue_OpAMD64VPOPCNTB256(v)
	case ssaop.OpAMD64VPOPCNTBMasked128:
		return rewriteValue_OpAMD64VPOPCNTBMasked128(v)
	case ssaop.OpAMD64VPOPCNTBMasked256:
		return rewriteValue_OpAMD64VPOPCNTBMasked256(v)
	case ssaop.OpAMD64VPOPCNTD128:
		return rewriteValue_OpAMD64VPOPCNTD128(v)
	case ssaop.OpAMD64VPOPCNTD256:
		return rewriteValue_OpAMD64VPOPCNTD256(v)
	case ssaop.OpAMD64VPOPCNTD512:
		return rewriteValue_OpAMD64VPOPCNTD512(v)
	case ssaop.OpAMD64VPOPCNTDMasked128:
		return rewriteValue_OpAMD64VPOPCNTDMasked128(v)
	case ssaop.OpAMD64VPOPCNTDMasked256:
		return rewriteValue_OpAMD64VPOPCNTDMasked256(v)
	case ssaop.OpAMD64VPOPCNTDMasked512:
		return rewriteValue_OpAMD64VPOPCNTDMasked512(v)
	case ssaop.OpAMD64VPOPCNTQ128:
		return rewriteValue_OpAMD64VPOPCNTQ128(v)
	case ssaop.OpAMD64VPOPCNTQ256:
		return rewriteValue_OpAMD64VPOPCNTQ256(v)
	case ssaop.OpAMD64VPOPCNTQ512:
		return rewriteValue_OpAMD64VPOPCNTQ512(v)
	case ssaop.OpAMD64VPOPCNTQMasked128:
		return rewriteValue_OpAMD64VPOPCNTQMasked128(v)
	case ssaop.OpAMD64VPOPCNTQMasked256:
		return rewriteValue_OpAMD64VPOPCNTQMasked256(v)
	case ssaop.OpAMD64VPOPCNTQMasked512:
		return rewriteValue_OpAMD64VPOPCNTQMasked512(v)
	case ssaop.OpAMD64VPOPCNTW128:
		return rewriteValue_OpAMD64VPOPCNTW128(v)
	case ssaop.OpAMD64VPOPCNTW256:
		return rewriteValue_OpAMD64VPOPCNTW256(v)
	case ssaop.OpAMD64VPOPCNTWMasked128:
		return rewriteValue_OpAMD64VPOPCNTWMasked128(v)
	case ssaop.OpAMD64VPOPCNTWMasked256:
		return rewriteValue_OpAMD64VPOPCNTWMasked256(v)
	case ssaop.OpAMD64VPOR128:
		return rewriteValue_OpAMD64VPOR128(v)
	case ssaop.OpAMD64VPOR256:
		return rewriteValue_OpAMD64VPOR256(v)
	case ssaop.OpAMD64VPORD512:
		return rewriteValue_OpAMD64VPORD512(v)
	case ssaop.OpAMD64VPORDMasked128:
		return rewriteValue_OpAMD64VPORDMasked128(v)
	case ssaop.OpAMD64VPORDMasked256:
		return rewriteValue_OpAMD64VPORDMasked256(v)
	case ssaop.OpAMD64VPORDMasked512:
		return rewriteValue_OpAMD64VPORDMasked512(v)
	case ssaop.OpAMD64VPORQ512:
		return rewriteValue_OpAMD64VPORQ512(v)
	case ssaop.OpAMD64VPORQMasked128:
		return rewriteValue_OpAMD64VPORQMasked128(v)
	case ssaop.OpAMD64VPORQMasked256:
		return rewriteValue_OpAMD64VPORQMasked256(v)
	case ssaop.OpAMD64VPORQMasked512:
		return rewriteValue_OpAMD64VPORQMasked512(v)
	case ssaop.OpAMD64VPROLD128:
		return rewriteValue_OpAMD64VPROLD128(v)
	case ssaop.OpAMD64VPROLD256:
		return rewriteValue_OpAMD64VPROLD256(v)
	case ssaop.OpAMD64VPROLD512:
		return rewriteValue_OpAMD64VPROLD512(v)
	case ssaop.OpAMD64VPROLDMasked128:
		return rewriteValue_OpAMD64VPROLDMasked128(v)
	case ssaop.OpAMD64VPROLDMasked256:
		return rewriteValue_OpAMD64VPROLDMasked256(v)
	case ssaop.OpAMD64VPROLDMasked512:
		return rewriteValue_OpAMD64VPROLDMasked512(v)
	case ssaop.OpAMD64VPROLQ128:
		return rewriteValue_OpAMD64VPROLQ128(v)
	case ssaop.OpAMD64VPROLQ256:
		return rewriteValue_OpAMD64VPROLQ256(v)
	case ssaop.OpAMD64VPROLQ512:
		return rewriteValue_OpAMD64VPROLQ512(v)
	case ssaop.OpAMD64VPROLQMasked128:
		return rewriteValue_OpAMD64VPROLQMasked128(v)
	case ssaop.OpAMD64VPROLQMasked256:
		return rewriteValue_OpAMD64VPROLQMasked256(v)
	case ssaop.OpAMD64VPROLQMasked512:
		return rewriteValue_OpAMD64VPROLQMasked512(v)
	case ssaop.OpAMD64VPROLVD128:
		return rewriteValue_OpAMD64VPROLVD128(v)
	case ssaop.OpAMD64VPROLVD256:
		return rewriteValue_OpAMD64VPROLVD256(v)
	case ssaop.OpAMD64VPROLVD512:
		return rewriteValue_OpAMD64VPROLVD512(v)
	case ssaop.OpAMD64VPROLVDMasked128:
		return rewriteValue_OpAMD64VPROLVDMasked128(v)
	case ssaop.OpAMD64VPROLVDMasked256:
		return rewriteValue_OpAMD64VPROLVDMasked256(v)
	case ssaop.OpAMD64VPROLVDMasked512:
		return rewriteValue_OpAMD64VPROLVDMasked512(v)
	case ssaop.OpAMD64VPROLVQ128:
		return rewriteValue_OpAMD64VPROLVQ128(v)
	case ssaop.OpAMD64VPROLVQ256:
		return rewriteValue_OpAMD64VPROLVQ256(v)
	case ssaop.OpAMD64VPROLVQ512:
		return rewriteValue_OpAMD64VPROLVQ512(v)
	case ssaop.OpAMD64VPROLVQMasked128:
		return rewriteValue_OpAMD64VPROLVQMasked128(v)
	case ssaop.OpAMD64VPROLVQMasked256:
		return rewriteValue_OpAMD64VPROLVQMasked256(v)
	case ssaop.OpAMD64VPROLVQMasked512:
		return rewriteValue_OpAMD64VPROLVQMasked512(v)
	case ssaop.OpAMD64VPRORD128:
		return rewriteValue_OpAMD64VPRORD128(v)
	case ssaop.OpAMD64VPRORD256:
		return rewriteValue_OpAMD64VPRORD256(v)
	case ssaop.OpAMD64VPRORD512:
		return rewriteValue_OpAMD64VPRORD512(v)
	case ssaop.OpAMD64VPRORDMasked128:
		return rewriteValue_OpAMD64VPRORDMasked128(v)
	case ssaop.OpAMD64VPRORDMasked256:
		return rewriteValue_OpAMD64VPRORDMasked256(v)
	case ssaop.OpAMD64VPRORDMasked512:
		return rewriteValue_OpAMD64VPRORDMasked512(v)
	case ssaop.OpAMD64VPRORQ128:
		return rewriteValue_OpAMD64VPRORQ128(v)
	case ssaop.OpAMD64VPRORQ256:
		return rewriteValue_OpAMD64VPRORQ256(v)
	case ssaop.OpAMD64VPRORQ512:
		return rewriteValue_OpAMD64VPRORQ512(v)
	case ssaop.OpAMD64VPRORQMasked128:
		return rewriteValue_OpAMD64VPRORQMasked128(v)
	case ssaop.OpAMD64VPRORQMasked256:
		return rewriteValue_OpAMD64VPRORQMasked256(v)
	case ssaop.OpAMD64VPRORQMasked512:
		return rewriteValue_OpAMD64VPRORQMasked512(v)
	case ssaop.OpAMD64VPRORVD128:
		return rewriteValue_OpAMD64VPRORVD128(v)
	case ssaop.OpAMD64VPRORVD256:
		return rewriteValue_OpAMD64VPRORVD256(v)
	case ssaop.OpAMD64VPRORVD512:
		return rewriteValue_OpAMD64VPRORVD512(v)
	case ssaop.OpAMD64VPRORVDMasked128:
		return rewriteValue_OpAMD64VPRORVDMasked128(v)
	case ssaop.OpAMD64VPRORVDMasked256:
		return rewriteValue_OpAMD64VPRORVDMasked256(v)
	case ssaop.OpAMD64VPRORVDMasked512:
		return rewriteValue_OpAMD64VPRORVDMasked512(v)
	case ssaop.OpAMD64VPRORVQ128:
		return rewriteValue_OpAMD64VPRORVQ128(v)
	case ssaop.OpAMD64VPRORVQ256:
		return rewriteValue_OpAMD64VPRORVQ256(v)
	case ssaop.OpAMD64VPRORVQ512:
		return rewriteValue_OpAMD64VPRORVQ512(v)
	case ssaop.OpAMD64VPRORVQMasked128:
		return rewriteValue_OpAMD64VPRORVQMasked128(v)
	case ssaop.OpAMD64VPRORVQMasked256:
		return rewriteValue_OpAMD64VPRORVQMasked256(v)
	case ssaop.OpAMD64VPRORVQMasked512:
		return rewriteValue_OpAMD64VPRORVQMasked512(v)
	case ssaop.OpAMD64VPSADBW128:
		return rewriteValue_OpAMD64VPSADBW128(v)
	case ssaop.OpAMD64VPSADBW256:
		return rewriteValue_OpAMD64VPSADBW256(v)
	case ssaop.OpAMD64VPSHLDD128:
		return rewriteValue_OpAMD64VPSHLDD128(v)
	case ssaop.OpAMD64VPSHLDD256:
		return rewriteValue_OpAMD64VPSHLDD256(v)
	case ssaop.OpAMD64VPSHLDD512:
		return rewriteValue_OpAMD64VPSHLDD512(v)
	case ssaop.OpAMD64VPSHLDDMasked128:
		return rewriteValue_OpAMD64VPSHLDDMasked128(v)
	case ssaop.OpAMD64VPSHLDDMasked256:
		return rewriteValue_OpAMD64VPSHLDDMasked256(v)
	case ssaop.OpAMD64VPSHLDDMasked512:
		return rewriteValue_OpAMD64VPSHLDDMasked512(v)
	case ssaop.OpAMD64VPSHLDQ128:
		return rewriteValue_OpAMD64VPSHLDQ128(v)
	case ssaop.OpAMD64VPSHLDQ256:
		return rewriteValue_OpAMD64VPSHLDQ256(v)
	case ssaop.OpAMD64VPSHLDQ512:
		return rewriteValue_OpAMD64VPSHLDQ512(v)
	case ssaop.OpAMD64VPSHLDQMasked128:
		return rewriteValue_OpAMD64VPSHLDQMasked128(v)
	case ssaop.OpAMD64VPSHLDQMasked256:
		return rewriteValue_OpAMD64VPSHLDQMasked256(v)
	case ssaop.OpAMD64VPSHLDQMasked512:
		return rewriteValue_OpAMD64VPSHLDQMasked512(v)
	case ssaop.OpAMD64VPSHLDVD128:
		return rewriteValue_OpAMD64VPSHLDVD128(v)
	case ssaop.OpAMD64VPSHLDVD256:
		return rewriteValue_OpAMD64VPSHLDVD256(v)
	case ssaop.OpAMD64VPSHLDVD512:
		return rewriteValue_OpAMD64VPSHLDVD512(v)
	case ssaop.OpAMD64VPSHLDVDMasked128:
		return rewriteValue_OpAMD64VPSHLDVDMasked128(v)
	case ssaop.OpAMD64VPSHLDVDMasked256:
		return rewriteValue_OpAMD64VPSHLDVDMasked256(v)
	case ssaop.OpAMD64VPSHLDVDMasked512:
		return rewriteValue_OpAMD64VPSHLDVDMasked512(v)
	case ssaop.OpAMD64VPSHLDVQ128:
		return rewriteValue_OpAMD64VPSHLDVQ128(v)
	case ssaop.OpAMD64VPSHLDVQ256:
		return rewriteValue_OpAMD64VPSHLDVQ256(v)
	case ssaop.OpAMD64VPSHLDVQ512:
		return rewriteValue_OpAMD64VPSHLDVQ512(v)
	case ssaop.OpAMD64VPSHLDVQMasked128:
		return rewriteValue_OpAMD64VPSHLDVQMasked128(v)
	case ssaop.OpAMD64VPSHLDVQMasked256:
		return rewriteValue_OpAMD64VPSHLDVQMasked256(v)
	case ssaop.OpAMD64VPSHLDVQMasked512:
		return rewriteValue_OpAMD64VPSHLDVQMasked512(v)
	case ssaop.OpAMD64VPSHLDVW128:
		return rewriteValue_OpAMD64VPSHLDVW128(v)
	case ssaop.OpAMD64VPSHLDVW256:
		return rewriteValue_OpAMD64VPSHLDVW256(v)
	case ssaop.OpAMD64VPSHLDVWMasked128:
		return rewriteValue_OpAMD64VPSHLDVWMasked128(v)
	case ssaop.OpAMD64VPSHLDVWMasked256:
		return rewriteValue_OpAMD64VPSHLDVWMasked256(v)
	case ssaop.OpAMD64VPSHLDW128:
		return rewriteValue_OpAMD64VPSHLDW128(v)
	case ssaop.OpAMD64VPSHLDW256:
		return rewriteValue_OpAMD64VPSHLDW256(v)
	case ssaop.OpAMD64VPSHLDWMasked128:
		return rewriteValue_OpAMD64VPSHLDWMasked128(v)
	case ssaop.OpAMD64VPSHLDWMasked256:
		return rewriteValue_OpAMD64VPSHLDWMasked256(v)
	case ssaop.OpAMD64VPSHRDD128:
		return rewriteValue_OpAMD64VPSHRDD128(v)
	case ssaop.OpAMD64VPSHRDD256:
		return rewriteValue_OpAMD64VPSHRDD256(v)
	case ssaop.OpAMD64VPSHRDD512:
		return rewriteValue_OpAMD64VPSHRDD512(v)
	case ssaop.OpAMD64VPSHRDDMasked128:
		return rewriteValue_OpAMD64VPSHRDDMasked128(v)
	case ssaop.OpAMD64VPSHRDDMasked256:
		return rewriteValue_OpAMD64VPSHRDDMasked256(v)
	case ssaop.OpAMD64VPSHRDDMasked512:
		return rewriteValue_OpAMD64VPSHRDDMasked512(v)
	case ssaop.OpAMD64VPSHRDQ128:
		return rewriteValue_OpAMD64VPSHRDQ128(v)
	case ssaop.OpAMD64VPSHRDQ256:
		return rewriteValue_OpAMD64VPSHRDQ256(v)
	case ssaop.OpAMD64VPSHRDQ512:
		return rewriteValue_OpAMD64VPSHRDQ512(v)
	case ssaop.OpAMD64VPSHRDQMasked128:
		return rewriteValue_OpAMD64VPSHRDQMasked128(v)
	case ssaop.OpAMD64VPSHRDQMasked256:
		return rewriteValue_OpAMD64VPSHRDQMasked256(v)
	case ssaop.OpAMD64VPSHRDQMasked512:
		return rewriteValue_OpAMD64VPSHRDQMasked512(v)
	case ssaop.OpAMD64VPSHRDVD128:
		return rewriteValue_OpAMD64VPSHRDVD128(v)
	case ssaop.OpAMD64VPSHRDVD256:
		return rewriteValue_OpAMD64VPSHRDVD256(v)
	case ssaop.OpAMD64VPSHRDVD512:
		return rewriteValue_OpAMD64VPSHRDVD512(v)
	case ssaop.OpAMD64VPSHRDVDMasked128:
		return rewriteValue_OpAMD64VPSHRDVDMasked128(v)
	case ssaop.OpAMD64VPSHRDVDMasked256:
		return rewriteValue_OpAMD64VPSHRDVDMasked256(v)
	case ssaop.OpAMD64VPSHRDVDMasked512:
		return rewriteValue_OpAMD64VPSHRDVDMasked512(v)
	case ssaop.OpAMD64VPSHRDVQ128:
		return rewriteValue_OpAMD64VPSHRDVQ128(v)
	case ssaop.OpAMD64VPSHRDVQ256:
		return rewriteValue_OpAMD64VPSHRDVQ256(v)
	case ssaop.OpAMD64VPSHRDVQ512:
		return rewriteValue_OpAMD64VPSHRDVQ512(v)
	case ssaop.OpAMD64VPSHRDVQMasked128:
		return rewriteValue_OpAMD64VPSHRDVQMasked128(v)
	case ssaop.OpAMD64VPSHRDVQMasked256:
		return rewriteValue_OpAMD64VPSHRDVQMasked256(v)
	case ssaop.OpAMD64VPSHRDVQMasked512:
		return rewriteValue_OpAMD64VPSHRDVQMasked512(v)
	case ssaop.OpAMD64VPSHRDVW128:
		return rewriteValue_OpAMD64VPSHRDVW128(v)
	case ssaop.OpAMD64VPSHRDVW256:
		return rewriteValue_OpAMD64VPSHRDVW256(v)
	case ssaop.OpAMD64VPSHRDVWMasked128:
		return rewriteValue_OpAMD64VPSHRDVWMasked128(v)
	case ssaop.OpAMD64VPSHRDVWMasked256:
		return rewriteValue_OpAMD64VPSHRDVWMasked256(v)
	case ssaop.OpAMD64VPSHRDW128:
		return rewriteValue_OpAMD64VPSHRDW128(v)
	case ssaop.OpAMD64VPSHRDW256:
		return rewriteValue_OpAMD64VPSHRDW256(v)
	case ssaop.OpAMD64VPSHRDWMasked128:
		return rewriteValue_OpAMD64VPSHRDWMasked128(v)
	case ssaop.OpAMD64VPSHRDWMasked256:
		return rewriteValue_OpAMD64VPSHRDWMasked256(v)
	case ssaop.OpAMD64VPSHUFB128:
		return rewriteValue_OpAMD64VPSHUFB128(v)
	case ssaop.OpAMD64VPSHUFB256:
		return rewriteValue_OpAMD64VPSHUFB256(v)
	case ssaop.OpAMD64VPSHUFBMasked128:
		return rewriteValue_OpAMD64VPSHUFBMasked128(v)
	case ssaop.OpAMD64VPSHUFBMasked256:
		return rewriteValue_OpAMD64VPSHUFBMasked256(v)
	case ssaop.OpAMD64VPSHUFD128:
		return rewriteValue_OpAMD64VPSHUFD128(v)
	case ssaop.OpAMD64VPSHUFD256:
		return rewriteValue_OpAMD64VPSHUFD256(v)
	case ssaop.OpAMD64VPSHUFD512:
		return rewriteValue_OpAMD64VPSHUFD512(v)
	case ssaop.OpAMD64VPSHUFDMasked128:
		return rewriteValue_OpAMD64VPSHUFDMasked128(v)
	case ssaop.OpAMD64VPSHUFDMasked256:
		return rewriteValue_OpAMD64VPSHUFDMasked256(v)
	case ssaop.OpAMD64VPSHUFDMasked512:
		return rewriteValue_OpAMD64VPSHUFDMasked512(v)
	case ssaop.OpAMD64VPSHUFHW128:
		return rewriteValue_OpAMD64VPSHUFHW128(v)
	case ssaop.OpAMD64VPSHUFHW256:
		return rewriteValue_OpAMD64VPSHUFHW256(v)
	case ssaop.OpAMD64VPSHUFHWMasked128:
		return rewriteValue_OpAMD64VPSHUFHWMasked128(v)
	case ssaop.OpAMD64VPSHUFHWMasked256:
		return rewriteValue_OpAMD64VPSHUFHWMasked256(v)
	case ssaop.OpAMD64VPSHUFLW128:
		return rewriteValue_OpAMD64VPSHUFLW128(v)
	case ssaop.OpAMD64VPSHUFLW256:
		return rewriteValue_OpAMD64VPSHUFLW256(v)
	case ssaop.OpAMD64VPSHUFLWMasked128:
		return rewriteValue_OpAMD64VPSHUFLWMasked128(v)
	case ssaop.OpAMD64VPSHUFLWMasked256:
		return rewriteValue_OpAMD64VPSHUFLWMasked256(v)
	case ssaop.OpAMD64VPSIGNB128:
		return rewriteValue_OpAMD64VPSIGNB128(v)
	case ssaop.OpAMD64VPSIGNB256:
		return rewriteValue_OpAMD64VPSIGNB256(v)
	case ssaop.OpAMD64VPSIGND128:
		return rewriteValue_OpAMD64VPSIGND128(v)
	case ssaop.OpAMD64VPSIGND256:
		return rewriteValue_OpAMD64VPSIGND256(v)
	case ssaop.OpAMD64VPSIGNW128:
		return rewriteValue_OpAMD64VPSIGNW128(v)
	case ssaop.OpAMD64VPSIGNW256:
		return rewriteValue_OpAMD64VPSIGNW256(v)
	case ssaop.OpAMD64VPSLLD128:
		return rewriteValue_OpAMD64VPSLLD128(v)
	case ssaop.OpAMD64VPSLLD128const:
		return rewriteValue_OpAMD64VPSLLD128const(v)
	case ssaop.OpAMD64VPSLLD256:
		return rewriteValue_OpAMD64VPSLLD256(v)
	case ssaop.OpAMD64VPSLLD256const:
		return rewriteValue_OpAMD64VPSLLD256const(v)
	case ssaop.OpAMD64VPSLLD512:
		return rewriteValue_OpAMD64VPSLLD512(v)
	case ssaop.OpAMD64VPSLLD512const:
		return rewriteValue_OpAMD64VPSLLD512const(v)
	case ssaop.OpAMD64VPSLLDMasked128:
		return rewriteValue_OpAMD64VPSLLDMasked128(v)
	case ssaop.OpAMD64VPSLLDMasked128const:
		return rewriteValue_OpAMD64VPSLLDMasked128const(v)
	case ssaop.OpAMD64VPSLLDMasked256:
		return rewriteValue_OpAMD64VPSLLDMasked256(v)
	case ssaop.OpAMD64VPSLLDMasked256const:
		return rewriteValue_OpAMD64VPSLLDMasked256const(v)
	case ssaop.OpAMD64VPSLLDMasked512:
		return rewriteValue_OpAMD64VPSLLDMasked512(v)
	case ssaop.OpAMD64VPSLLDMasked512const:
		return rewriteValue_OpAMD64VPSLLDMasked512const(v)
	case ssaop.OpAMD64VPSLLQ128:
		return rewriteValue_OpAMD64VPSLLQ128(v)
	case ssaop.OpAMD64VPSLLQ128const:
		return rewriteValue_OpAMD64VPSLLQ128const(v)
	case ssaop.OpAMD64VPSLLQ256:
		return rewriteValue_OpAMD64VPSLLQ256(v)
	case ssaop.OpAMD64VPSLLQ256const:
		return rewriteValue_OpAMD64VPSLLQ256const(v)
	case ssaop.OpAMD64VPSLLQ512:
		return rewriteValue_OpAMD64VPSLLQ512(v)
	case ssaop.OpAMD64VPSLLQ512const:
		return rewriteValue_OpAMD64VPSLLQ512const(v)
	case ssaop.OpAMD64VPSLLQMasked128:
		return rewriteValue_OpAMD64VPSLLQMasked128(v)
	case ssaop.OpAMD64VPSLLQMasked128const:
		return rewriteValue_OpAMD64VPSLLQMasked128const(v)
	case ssaop.OpAMD64VPSLLQMasked256:
		return rewriteValue_OpAMD64VPSLLQMasked256(v)
	case ssaop.OpAMD64VPSLLQMasked256const:
		return rewriteValue_OpAMD64VPSLLQMasked256const(v)
	case ssaop.OpAMD64VPSLLQMasked512:
		return rewriteValue_OpAMD64VPSLLQMasked512(v)
	case ssaop.OpAMD64VPSLLQMasked512const:
		return rewriteValue_OpAMD64VPSLLQMasked512const(v)
	case ssaop.OpAMD64VPSLLVD128:
		return rewriteValue_OpAMD64VPSLLVD128(v)
	case ssaop.OpAMD64VPSLLVD256:
		return rewriteValue_OpAMD64VPSLLVD256(v)
	case ssaop.OpAMD64VPSLLVD512:
		return rewriteValue_OpAMD64VPSLLVD512(v)
	case ssaop.OpAMD64VPSLLVDMasked128:
		return rewriteValue_OpAMD64VPSLLVDMasked128(v)
	case ssaop.OpAMD64VPSLLVDMasked256:
		return rewriteValue_OpAMD64VPSLLVDMasked256(v)
	case ssaop.OpAMD64VPSLLVDMasked512:
		return rewriteValue_OpAMD64VPSLLVDMasked512(v)
	case ssaop.OpAMD64VPSLLVQ128:
		return rewriteValue_OpAMD64VPSLLVQ128(v)
	case ssaop.OpAMD64VPSLLVQ256:
		return rewriteValue_OpAMD64VPSLLVQ256(v)
	case ssaop.OpAMD64VPSLLVQ512:
		return rewriteValue_OpAMD64VPSLLVQ512(v)
	case ssaop.OpAMD64VPSLLVQMasked128:
		return rewriteValue_OpAMD64VPSLLVQMasked128(v)
	case ssaop.OpAMD64VPSLLVQMasked256:
		return rewriteValue_OpAMD64VPSLLVQMasked256(v)
	case ssaop.OpAMD64VPSLLVQMasked512:
		return rewriteValue_OpAMD64VPSLLVQMasked512(v)
	case ssaop.OpAMD64VPSLLVW128:
		return rewriteValue_OpAMD64VPSLLVW128(v)
	case ssaop.OpAMD64VPSLLVW256:
		return rewriteValue_OpAMD64VPSLLVW256(v)
	case ssaop.OpAMD64VPSLLVWMasked128:
		return rewriteValue_OpAMD64VPSLLVWMasked128(v)
	case ssaop.OpAMD64VPSLLVWMasked256:
		return rewriteValue_OpAMD64VPSLLVWMasked256(v)
	case ssaop.OpAMD64VPSLLW128:
		return rewriteValue_OpAMD64VPSLLW128(v)
	case ssaop.OpAMD64VPSLLW128const:
		return rewriteValue_OpAMD64VPSLLW128const(v)
	case ssaop.OpAMD64VPSLLW256:
		return rewriteValue_OpAMD64VPSLLW256(v)
	case ssaop.OpAMD64VPSLLW256const:
		return rewriteValue_OpAMD64VPSLLW256const(v)
	case ssaop.OpAMD64VPSLLW512:
		return rewriteValue_OpAMD64VPSLLW512(v)
	case ssaop.OpAMD64VPSLLW512const:
		return rewriteValue_OpAMD64VPSLLW512const(v)
	case ssaop.OpAMD64VPSLLWMasked128:
		return rewriteValue_OpAMD64VPSLLWMasked128(v)
	case ssaop.OpAMD64VPSLLWMasked128const:
		return rewriteValue_OpAMD64VPSLLWMasked128const(v)
	case ssaop.OpAMD64VPSLLWMasked256:
		return rewriteValue_OpAMD64VPSLLWMasked256(v)
	case ssaop.OpAMD64VPSLLWMasked256const:
		return rewriteValue_OpAMD64VPSLLWMasked256const(v)
	case ssaop.OpAMD64VPSLLWMasked512:
		return rewriteValue_OpAMD64VPSLLWMasked512(v)
	case ssaop.OpAMD64VPSLLWMasked512const:
		return rewriteValue_OpAMD64VPSLLWMasked512const(v)
	case ssaop.OpAMD64VPSRAD128:
		return rewriteValue_OpAMD64VPSRAD128(v)
	case ssaop.OpAMD64VPSRAD128const:
		return rewriteValue_OpAMD64VPSRAD128const(v)
	case ssaop.OpAMD64VPSRAD256:
		return rewriteValue_OpAMD64VPSRAD256(v)
	case ssaop.OpAMD64VPSRAD256const:
		return rewriteValue_OpAMD64VPSRAD256const(v)
	case ssaop.OpAMD64VPSRAD512:
		return rewriteValue_OpAMD64VPSRAD512(v)
	case ssaop.OpAMD64VPSRAD512const:
		return rewriteValue_OpAMD64VPSRAD512const(v)
	case ssaop.OpAMD64VPSRADMasked128:
		return rewriteValue_OpAMD64VPSRADMasked128(v)
	case ssaop.OpAMD64VPSRADMasked128const:
		return rewriteValue_OpAMD64VPSRADMasked128const(v)
	case ssaop.OpAMD64VPSRADMasked256:
		return rewriteValue_OpAMD64VPSRADMasked256(v)
	case ssaop.OpAMD64VPSRADMasked256const:
		return rewriteValue_OpAMD64VPSRADMasked256const(v)
	case ssaop.OpAMD64VPSRADMasked512:
		return rewriteValue_OpAMD64VPSRADMasked512(v)
	case ssaop.OpAMD64VPSRADMasked512const:
		return rewriteValue_OpAMD64VPSRADMasked512const(v)
	case ssaop.OpAMD64VPSRAQ128:
		return rewriteValue_OpAMD64VPSRAQ128(v)
	case ssaop.OpAMD64VPSRAQ128const:
		return rewriteValue_OpAMD64VPSRAQ128const(v)
	case ssaop.OpAMD64VPSRAQ256:
		return rewriteValue_OpAMD64VPSRAQ256(v)
	case ssaop.OpAMD64VPSRAQ256const:
		return rewriteValue_OpAMD64VPSRAQ256const(v)
	case ssaop.OpAMD64VPSRAQ512:
		return rewriteValue_OpAMD64VPSRAQ512(v)
	case ssaop.OpAMD64VPSRAQ512const:
		return rewriteValue_OpAMD64VPSRAQ512const(v)
	case ssaop.OpAMD64VPSRAQMasked128:
		return rewriteValue_OpAMD64VPSRAQMasked128(v)
	case ssaop.OpAMD64VPSRAQMasked128const:
		return rewriteValue_OpAMD64VPSRAQMasked128const(v)
	case ssaop.OpAMD64VPSRAQMasked256:
		return rewriteValue_OpAMD64VPSRAQMasked256(v)
	case ssaop.OpAMD64VPSRAQMasked256const:
		return rewriteValue_OpAMD64VPSRAQMasked256const(v)
	case ssaop.OpAMD64VPSRAQMasked512:
		return rewriteValue_OpAMD64VPSRAQMasked512(v)
	case ssaop.OpAMD64VPSRAQMasked512const:
		return rewriteValue_OpAMD64VPSRAQMasked512const(v)
	case ssaop.OpAMD64VPSRAVD128:
		return rewriteValue_OpAMD64VPSRAVD128(v)
	case ssaop.OpAMD64VPSRAVD256:
		return rewriteValue_OpAMD64VPSRAVD256(v)
	case ssaop.OpAMD64VPSRAVD512:
		return rewriteValue_OpAMD64VPSRAVD512(v)
	case ssaop.OpAMD64VPSRAVDMasked128:
		return rewriteValue_OpAMD64VPSRAVDMasked128(v)
	case ssaop.OpAMD64VPSRAVDMasked256:
		return rewriteValue_OpAMD64VPSRAVDMasked256(v)
	case ssaop.OpAMD64VPSRAVDMasked512:
		return rewriteValue_OpAMD64VPSRAVDMasked512(v)
	case ssaop.OpAMD64VPSRAVQ128:
		return rewriteValue_OpAMD64VPSRAVQ128(v)
	case ssaop.OpAMD64VPSRAVQ256:
		return rewriteValue_OpAMD64VPSRAVQ256(v)
	case ssaop.OpAMD64VPSRAVQ512:
		return rewriteValue_OpAMD64VPSRAVQ512(v)
	case ssaop.OpAMD64VPSRAVQMasked128:
		return rewriteValue_OpAMD64VPSRAVQMasked128(v)
	case ssaop.OpAMD64VPSRAVQMasked256:
		return rewriteValue_OpAMD64VPSRAVQMasked256(v)
	case ssaop.OpAMD64VPSRAVQMasked512:
		return rewriteValue_OpAMD64VPSRAVQMasked512(v)
	case ssaop.OpAMD64VPSRAVW128:
		return rewriteValue_OpAMD64VPSRAVW128(v)
	case ssaop.OpAMD64VPSRAVW256:
		return rewriteValue_OpAMD64VPSRAVW256(v)
	case ssaop.OpAMD64VPSRAVWMasked128:
		return rewriteValue_OpAMD64VPSRAVWMasked128(v)
	case ssaop.OpAMD64VPSRAVWMasked256:
		return rewriteValue_OpAMD64VPSRAVWMasked256(v)
	case ssaop.OpAMD64VPSRAW128:
		return rewriteValue_OpAMD64VPSRAW128(v)
	case ssaop.OpAMD64VPSRAW128const:
		return rewriteValue_OpAMD64VPSRAW128const(v)
	case ssaop.OpAMD64VPSRAW256:
		return rewriteValue_OpAMD64VPSRAW256(v)
	case ssaop.OpAMD64VPSRAW256const:
		return rewriteValue_OpAMD64VPSRAW256const(v)
	case ssaop.OpAMD64VPSRAW512:
		return rewriteValue_OpAMD64VPSRAW512(v)
	case ssaop.OpAMD64VPSRAW512const:
		return rewriteValue_OpAMD64VPSRAW512const(v)
	case ssaop.OpAMD64VPSRAWMasked128:
		return rewriteValue_OpAMD64VPSRAWMasked128(v)
	case ssaop.OpAMD64VPSRAWMasked128const:
		return rewriteValue_OpAMD64VPSRAWMasked128const(v)
	case ssaop.OpAMD64VPSRAWMasked256:
		return rewriteValue_OpAMD64VPSRAWMasked256(v)
	case ssaop.OpAMD64VPSRAWMasked256const:
		return rewriteValue_OpAMD64VPSRAWMasked256const(v)
	case ssaop.OpAMD64VPSRAWMasked512:
		return rewriteValue_OpAMD64VPSRAWMasked512(v)
	case ssaop.OpAMD64VPSRAWMasked512const:
		return rewriteValue_OpAMD64VPSRAWMasked512const(v)
	case ssaop.OpAMD64VPSRLD128:
		return rewriteValue_OpAMD64VPSRLD128(v)
	case ssaop.OpAMD64VPSRLD128const:
		return rewriteValue_OpAMD64VPSRLD128const(v)
	case ssaop.OpAMD64VPSRLD256:
		return rewriteValue_OpAMD64VPSRLD256(v)
	case ssaop.OpAMD64VPSRLD256const:
		return rewriteValue_OpAMD64VPSRLD256const(v)
	case ssaop.OpAMD64VPSRLD512:
		return rewriteValue_OpAMD64VPSRLD512(v)
	case ssaop.OpAMD64VPSRLD512const:
		return rewriteValue_OpAMD64VPSRLD512const(v)
	case ssaop.OpAMD64VPSRLDMasked128:
		return rewriteValue_OpAMD64VPSRLDMasked128(v)
	case ssaop.OpAMD64VPSRLDMasked128const:
		return rewriteValue_OpAMD64VPSRLDMasked128const(v)
	case ssaop.OpAMD64VPSRLDMasked256:
		return rewriteValue_OpAMD64VPSRLDMasked256(v)
	case ssaop.OpAMD64VPSRLDMasked256const:
		return rewriteValue_OpAMD64VPSRLDMasked256const(v)
	case ssaop.OpAMD64VPSRLDMasked512:
		return rewriteValue_OpAMD64VPSRLDMasked512(v)
	case ssaop.OpAMD64VPSRLDMasked512const:
		return rewriteValue_OpAMD64VPSRLDMasked512const(v)
	case ssaop.OpAMD64VPSRLQ128:
		return rewriteValue_OpAMD64VPSRLQ128(v)
	case ssaop.OpAMD64VPSRLQ128const:
		return rewriteValue_OpAMD64VPSRLQ128const(v)
	case ssaop.OpAMD64VPSRLQ256:
		return rewriteValue_OpAMD64VPSRLQ256(v)
	case ssaop.OpAMD64VPSRLQ256const:
		return rewriteValue_OpAMD64VPSRLQ256const(v)
	case ssaop.OpAMD64VPSRLQ512:
		return rewriteValue_OpAMD64VPSRLQ512(v)
	case ssaop.OpAMD64VPSRLQ512const:
		return rewriteValue_OpAMD64VPSRLQ512const(v)
	case ssaop.OpAMD64VPSRLQMasked128:
		return rewriteValue_OpAMD64VPSRLQMasked128(v)
	case ssaop.OpAMD64VPSRLQMasked128const:
		return rewriteValue_OpAMD64VPSRLQMasked128const(v)
	case ssaop.OpAMD64VPSRLQMasked256:
		return rewriteValue_OpAMD64VPSRLQMasked256(v)
	case ssaop.OpAMD64VPSRLQMasked256const:
		return rewriteValue_OpAMD64VPSRLQMasked256const(v)
	case ssaop.OpAMD64VPSRLQMasked512:
		return rewriteValue_OpAMD64VPSRLQMasked512(v)
	case ssaop.OpAMD64VPSRLQMasked512const:
		return rewriteValue_OpAMD64VPSRLQMasked512const(v)
	case ssaop.OpAMD64VPSRLVD128:
		return rewriteValue_OpAMD64VPSRLVD128(v)
	case ssaop.OpAMD64VPSRLVD256:
		return rewriteValue_OpAMD64VPSRLVD256(v)
	case ssaop.OpAMD64VPSRLVD512:
		return rewriteValue_OpAMD64VPSRLVD512(v)
	case ssaop.OpAMD64VPSRLVDMasked128:
		return rewriteValue_OpAMD64VPSRLVDMasked128(v)
	case ssaop.OpAMD64VPSRLVDMasked256:
		return rewriteValue_OpAMD64VPSRLVDMasked256(v)
	case ssaop.OpAMD64VPSRLVDMasked512:
		return rewriteValue_OpAMD64VPSRLVDMasked512(v)
	case ssaop.OpAMD64VPSRLVQ128:
		return rewriteValue_OpAMD64VPSRLVQ128(v)
	case ssaop.OpAMD64VPSRLVQ256:
		return rewriteValue_OpAMD64VPSRLVQ256(v)
	case ssaop.OpAMD64VPSRLVQ512:
		return rewriteValue_OpAMD64VPSRLVQ512(v)
	case ssaop.OpAMD64VPSRLVQMasked128:
		return rewriteValue_OpAMD64VPSRLVQMasked128(v)
	case ssaop.OpAMD64VPSRLVQMasked256:
		return rewriteValue_OpAMD64VPSRLVQMasked256(v)
	case ssaop.OpAMD64VPSRLVQMasked512:
		return rewriteValue_OpAMD64VPSRLVQMasked512(v)
	case ssaop.OpAMD64VPSRLVW128:
		return rewriteValue_OpAMD64VPSRLVW128(v)
	case ssaop.OpAMD64VPSRLVW256:
		return rewriteValue_OpAMD64VPSRLVW256(v)
	case ssaop.OpAMD64VPSRLVWMasked128:
		return rewriteValue_OpAMD64VPSRLVWMasked128(v)
	case ssaop.OpAMD64VPSRLVWMasked256:
		return rewriteValue_OpAMD64VPSRLVWMasked256(v)
	case ssaop.OpAMD64VPSRLW128:
		return rewriteValue_OpAMD64VPSRLW128(v)
	case ssaop.OpAMD64VPSRLW128const:
		return rewriteValue_OpAMD64VPSRLW128const(v)
	case ssaop.OpAMD64VPSRLW256:
		return rewriteValue_OpAMD64VPSRLW256(v)
	case ssaop.OpAMD64VPSRLW256const:
		return rewriteValue_OpAMD64VPSRLW256const(v)
	case ssaop.OpAMD64VPSRLW512:
		return rewriteValue_OpAMD64VPSRLW512(v)
	case ssaop.OpAMD64VPSRLW512const:
		return rewriteValue_OpAMD64VPSRLW512const(v)
	case ssaop.OpAMD64VPSRLWMasked128:
		return rewriteValue_OpAMD64VPSRLWMasked128(v)
	case ssaop.OpAMD64VPSRLWMasked128const:
		return rewriteValue_OpAMD64VPSRLWMasked128const(v)
	case ssaop.OpAMD64VPSRLWMasked256:
		return rewriteValue_OpAMD64VPSRLWMasked256(v)
	case ssaop.OpAMD64VPSRLWMasked256const:
		return rewriteValue_OpAMD64VPSRLWMasked256const(v)
	case ssaop.OpAMD64VPSRLWMasked512:
		return rewriteValue_OpAMD64VPSRLWMasked512(v)
	case ssaop.OpAMD64VPSRLWMasked512const:
		return rewriteValue_OpAMD64VPSRLWMasked512const(v)
	case ssaop.OpAMD64VPSUBB128:
		return rewriteValue_OpAMD64VPSUBB128(v)
	case ssaop.OpAMD64VPSUBB256:
		return rewriteValue_OpAMD64VPSUBB256(v)
	case ssaop.OpAMD64VPSUBBMasked128:
		return rewriteValue_OpAMD64VPSUBBMasked128(v)
	case ssaop.OpAMD64VPSUBBMasked256:
		return rewriteValue_OpAMD64VPSUBBMasked256(v)
	case ssaop.OpAMD64VPSUBD128:
		return rewriteValue_OpAMD64VPSUBD128(v)
	case ssaop.OpAMD64VPSUBD256:
		return rewriteValue_OpAMD64VPSUBD256(v)
	case ssaop.OpAMD64VPSUBD512:
		return rewriteValue_OpAMD64VPSUBD512(v)
	case ssaop.OpAMD64VPSUBDMasked128:
		return rewriteValue_OpAMD64VPSUBDMasked128(v)
	case ssaop.OpAMD64VPSUBDMasked256:
		return rewriteValue_OpAMD64VPSUBDMasked256(v)
	case ssaop.OpAMD64VPSUBDMasked512:
		return rewriteValue_OpAMD64VPSUBDMasked512(v)
	case ssaop.OpAMD64VPSUBQ128:
		return rewriteValue_OpAMD64VPSUBQ128(v)
	case ssaop.OpAMD64VPSUBQ256:
		return rewriteValue_OpAMD64VPSUBQ256(v)
	case ssaop.OpAMD64VPSUBQ512:
		return rewriteValue_OpAMD64VPSUBQ512(v)
	case ssaop.OpAMD64VPSUBQMasked128:
		return rewriteValue_OpAMD64VPSUBQMasked128(v)
	case ssaop.OpAMD64VPSUBQMasked256:
		return rewriteValue_OpAMD64VPSUBQMasked256(v)
	case ssaop.OpAMD64VPSUBQMasked512:
		return rewriteValue_OpAMD64VPSUBQMasked512(v)
	case ssaop.OpAMD64VPSUBSB128:
		return rewriteValue_OpAMD64VPSUBSB128(v)
	case ssaop.OpAMD64VPSUBSB256:
		return rewriteValue_OpAMD64VPSUBSB256(v)
	case ssaop.OpAMD64VPSUBSBMasked128:
		return rewriteValue_OpAMD64VPSUBSBMasked128(v)
	case ssaop.OpAMD64VPSUBSBMasked256:
		return rewriteValue_OpAMD64VPSUBSBMasked256(v)
	case ssaop.OpAMD64VPSUBSW128:
		return rewriteValue_OpAMD64VPSUBSW128(v)
	case ssaop.OpAMD64VPSUBSW256:
		return rewriteValue_OpAMD64VPSUBSW256(v)
	case ssaop.OpAMD64VPSUBSWMasked128:
		return rewriteValue_OpAMD64VPSUBSWMasked128(v)
	case ssaop.OpAMD64VPSUBSWMasked256:
		return rewriteValue_OpAMD64VPSUBSWMasked256(v)
	case ssaop.OpAMD64VPSUBUSB128:
		return rewriteValue_OpAMD64VPSUBUSB128(v)
	case ssaop.OpAMD64VPSUBUSB256:
		return rewriteValue_OpAMD64VPSUBUSB256(v)
	case ssaop.OpAMD64VPSUBUSBMasked128:
		return rewriteValue_OpAMD64VPSUBUSBMasked128(v)
	case ssaop.OpAMD64VPSUBUSBMasked256:
		return rewriteValue_OpAMD64VPSUBUSBMasked256(v)
	case ssaop.OpAMD64VPSUBUSW128:
		return rewriteValue_OpAMD64VPSUBUSW128(v)
	case ssaop.OpAMD64VPSUBUSW256:
		return rewriteValue_OpAMD64VPSUBUSW256(v)
	case ssaop.OpAMD64VPSUBUSWMasked128:
		return rewriteValue_OpAMD64VPSUBUSWMasked128(v)
	case ssaop.OpAMD64VPSUBUSWMasked256:
		return rewriteValue_OpAMD64VPSUBUSWMasked256(v)
	case ssaop.OpAMD64VPSUBW128:
		return rewriteValue_OpAMD64VPSUBW128(v)
	case ssaop.OpAMD64VPSUBW256:
		return rewriteValue_OpAMD64VPSUBW256(v)
	case ssaop.OpAMD64VPSUBWMasked128:
		return rewriteValue_OpAMD64VPSUBWMasked128(v)
	case ssaop.OpAMD64VPSUBWMasked256:
		return rewriteValue_OpAMD64VPSUBWMasked256(v)
	case ssaop.OpAMD64VPTERNLOGD128:
		return rewriteValue_OpAMD64VPTERNLOGD128(v)
	case ssaop.OpAMD64VPTERNLOGD256:
		return rewriteValue_OpAMD64VPTERNLOGD256(v)
	case ssaop.OpAMD64VPTERNLOGD512:
		return rewriteValue_OpAMD64VPTERNLOGD512(v)
	case ssaop.OpAMD64VPTERNLOGQ128:
		return rewriteValue_OpAMD64VPTERNLOGQ128(v)
	case ssaop.OpAMD64VPTERNLOGQ256:
		return rewriteValue_OpAMD64VPTERNLOGQ256(v)
	case ssaop.OpAMD64VPTERNLOGQ512:
		return rewriteValue_OpAMD64VPTERNLOGQ512(v)
	case ssaop.OpAMD64VPUNPCKHBW128:
		return rewriteValue_OpAMD64VPUNPCKHBW128(v)
	case ssaop.OpAMD64VPUNPCKHBW256:
		return rewriteValue_OpAMD64VPUNPCKHBW256(v)
	case ssaop.OpAMD64VPUNPCKHDQ128:
		return rewriteValue_OpAMD64VPUNPCKHDQ128(v)
	case ssaop.OpAMD64VPUNPCKHDQ256:
		return rewriteValue_OpAMD64VPUNPCKHDQ256(v)
	case ssaop.OpAMD64VPUNPCKHDQ512:
		return rewriteValue_OpAMD64VPUNPCKHDQ512(v)
	case ssaop.OpAMD64VPUNPCKHQDQ128:
		return rewriteValue_OpAMD64VPUNPCKHQDQ128(v)
	case ssaop.OpAMD64VPUNPCKHQDQ256:
		return rewriteValue_OpAMD64VPUNPCKHQDQ256(v)
	case ssaop.OpAMD64VPUNPCKHQDQ512:
		return rewriteValue_OpAMD64VPUNPCKHQDQ512(v)
	case ssaop.OpAMD64VPUNPCKHWD128:
		return rewriteValue_OpAMD64VPUNPCKHWD128(v)
	case ssaop.OpAMD64VPUNPCKHWD256:
		return rewriteValue_OpAMD64VPUNPCKHWD256(v)
	case ssaop.OpAMD64VPUNPCKLBW128:
		return rewriteValue_OpAMD64VPUNPCKLBW128(v)
	case ssaop.OpAMD64VPUNPCKLBW256:
		return rewriteValue_OpAMD64VPUNPCKLBW256(v)
	case ssaop.OpAMD64VPUNPCKLDQ128:
		return rewriteValue_OpAMD64VPUNPCKLDQ128(v)
	case ssaop.OpAMD64VPUNPCKLDQ256:
		return rewriteValue_OpAMD64VPUNPCKLDQ256(v)
	case ssaop.OpAMD64VPUNPCKLDQ512:
		return rewriteValue_OpAMD64VPUNPCKLDQ512(v)
	case ssaop.OpAMD64VPUNPCKLQDQ128:
		return rewriteValue_OpAMD64VPUNPCKLQDQ128(v)
	case ssaop.OpAMD64VPUNPCKLQDQ256:
		return rewriteValue_OpAMD64VPUNPCKLQDQ256(v)
	case ssaop.OpAMD64VPUNPCKLQDQ512:
		return rewriteValue_OpAMD64VPUNPCKLQDQ512(v)
	case ssaop.OpAMD64VPUNPCKLWD128:
		return rewriteValue_OpAMD64VPUNPCKLWD128(v)
	case ssaop.OpAMD64VPUNPCKLWD256:
		return rewriteValue_OpAMD64VPUNPCKLWD256(v)
	case ssaop.OpAMD64VPXOR128:
		return rewriteValue_OpAMD64VPXOR128(v)
	case ssaop.OpAMD64VPXOR256:
		return rewriteValue_OpAMD64VPXOR256(v)
	case ssaop.OpAMD64VPXORD512:
		return rewriteValue_OpAMD64VPXORD512(v)
	case ssaop.OpAMD64VPXORDMasked128:
		return rewriteValue_OpAMD64VPXORDMasked128(v)
	case ssaop.OpAMD64VPXORDMasked256:
		return rewriteValue_OpAMD64VPXORDMasked256(v)
	case ssaop.OpAMD64VPXORDMasked512:
		return rewriteValue_OpAMD64VPXORDMasked512(v)
	case ssaop.OpAMD64VPXORQ512:
		return rewriteValue_OpAMD64VPXORQ512(v)
	case ssaop.OpAMD64VPXORQMasked128:
		return rewriteValue_OpAMD64VPXORQMasked128(v)
	case ssaop.OpAMD64VPXORQMasked256:
		return rewriteValue_OpAMD64VPXORQMasked256(v)
	case ssaop.OpAMD64VPXORQMasked512:
		return rewriteValue_OpAMD64VPXORQMasked512(v)
	case ssaop.OpAMD64VRCP14PD128:
		return rewriteValue_OpAMD64VRCP14PD128(v)
	case ssaop.OpAMD64VRCP14PD256:
		return rewriteValue_OpAMD64VRCP14PD256(v)
	case ssaop.OpAMD64VRCP14PD512:
		return rewriteValue_OpAMD64VRCP14PD512(v)
	case ssaop.OpAMD64VRCP14PDMasked128:
		return rewriteValue_OpAMD64VRCP14PDMasked128(v)
	case ssaop.OpAMD64VRCP14PDMasked256:
		return rewriteValue_OpAMD64VRCP14PDMasked256(v)
	case ssaop.OpAMD64VRCP14PDMasked512:
		return rewriteValue_OpAMD64VRCP14PDMasked512(v)
	case ssaop.OpAMD64VRCP14PS512:
		return rewriteValue_OpAMD64VRCP14PS512(v)
	case ssaop.OpAMD64VRCP14PSMasked128:
		return rewriteValue_OpAMD64VRCP14PSMasked128(v)
	case ssaop.OpAMD64VRCP14PSMasked256:
		return rewriteValue_OpAMD64VRCP14PSMasked256(v)
	case ssaop.OpAMD64VRCP14PSMasked512:
		return rewriteValue_OpAMD64VRCP14PSMasked512(v)
	case ssaop.OpAMD64VRCPPS128:
		return rewriteValue_OpAMD64VRCPPS128(v)
	case ssaop.OpAMD64VRCPPS256:
		return rewriteValue_OpAMD64VRCPPS256(v)
	case ssaop.OpAMD64VREDUCEPD128:
		return rewriteValue_OpAMD64VREDUCEPD128(v)
	case ssaop.OpAMD64VREDUCEPD256:
		return rewriteValue_OpAMD64VREDUCEPD256(v)
	case ssaop.OpAMD64VREDUCEPD512:
		return rewriteValue_OpAMD64VREDUCEPD512(v)
	case ssaop.OpAMD64VREDUCEPDMasked128:
		return rewriteValue_OpAMD64VREDUCEPDMasked128(v)
	case ssaop.OpAMD64VREDUCEPDMasked256:
		return rewriteValue_OpAMD64VREDUCEPDMasked256(v)
	case ssaop.OpAMD64VREDUCEPDMasked512:
		return rewriteValue_OpAMD64VREDUCEPDMasked512(v)
	case ssaop.OpAMD64VREDUCEPS128:
		return rewriteValue_OpAMD64VREDUCEPS128(v)
	case ssaop.OpAMD64VREDUCEPS256:
		return rewriteValue_OpAMD64VREDUCEPS256(v)
	case ssaop.OpAMD64VREDUCEPS512:
		return rewriteValue_OpAMD64VREDUCEPS512(v)
	case ssaop.OpAMD64VREDUCEPSMasked128:
		return rewriteValue_OpAMD64VREDUCEPSMasked128(v)
	case ssaop.OpAMD64VREDUCEPSMasked256:
		return rewriteValue_OpAMD64VREDUCEPSMasked256(v)
	case ssaop.OpAMD64VREDUCEPSMasked512:
		return rewriteValue_OpAMD64VREDUCEPSMasked512(v)
	case ssaop.OpAMD64VRNDSCALEPD128:
		return rewriteValue_OpAMD64VRNDSCALEPD128(v)
	case ssaop.OpAMD64VRNDSCALEPD256:
		return rewriteValue_OpAMD64VRNDSCALEPD256(v)
	case ssaop.OpAMD64VRNDSCALEPD512:
		return rewriteValue_OpAMD64VRNDSCALEPD512(v)
	case ssaop.OpAMD64VRNDSCALEPDMasked128:
		return rewriteValue_OpAMD64VRNDSCALEPDMasked128(v)
	case ssaop.OpAMD64VRNDSCALEPDMasked256:
		return rewriteValue_OpAMD64VRNDSCALEPDMasked256(v)
	case ssaop.OpAMD64VRNDSCALEPDMasked512:
		return rewriteValue_OpAMD64VRNDSCALEPDMasked512(v)
	case ssaop.OpAMD64VRNDSCALEPS128:
		return rewriteValue_OpAMD64VRNDSCALEPS128(v)
	case ssaop.OpAMD64VRNDSCALEPS256:
		return rewriteValue_OpAMD64VRNDSCALEPS256(v)
	case ssaop.OpAMD64VRNDSCALEPS512:
		return rewriteValue_OpAMD64VRNDSCALEPS512(v)
	case ssaop.OpAMD64VRNDSCALEPSMasked128:
		return rewriteValue_OpAMD64VRNDSCALEPSMasked128(v)
	case ssaop.OpAMD64VRNDSCALEPSMasked256:
		return rewriteValue_OpAMD64VRNDSCALEPSMasked256(v)
	case ssaop.OpAMD64VRNDSCALEPSMasked512:
		return rewriteValue_OpAMD64VRNDSCALEPSMasked512(v)
	case ssaop.OpAMD64VROUNDPD128:
		return rewriteValue_OpAMD64VROUNDPD128(v)
	case ssaop.OpAMD64VROUNDPD256:
		return rewriteValue_OpAMD64VROUNDPD256(v)
	case ssaop.OpAMD64VROUNDPS128:
		return rewriteValue_OpAMD64VROUNDPS128(v)
	case ssaop.OpAMD64VROUNDPS256:
		return rewriteValue_OpAMD64VROUNDPS256(v)
	case ssaop.OpAMD64VRSQRT14PD128:
		return rewriteValue_OpAMD64VRSQRT14PD128(v)
	case ssaop.OpAMD64VRSQRT14PD256:
		return rewriteValue_OpAMD64VRSQRT14PD256(v)
	case ssaop.OpAMD64VRSQRT14PD512:
		return rewriteValue_OpAMD64VRSQRT14PD512(v)
	case ssaop.OpAMD64VRSQRT14PDMasked128:
		return rewriteValue_OpAMD64VRSQRT14PDMasked128(v)
	case ssaop.OpAMD64VRSQRT14PDMasked256:
		return rewriteValue_OpAMD64VRSQRT14PDMasked256(v)
	case ssaop.OpAMD64VRSQRT14PDMasked512:
		return rewriteValue_OpAMD64VRSQRT14PDMasked512(v)
	case ssaop.OpAMD64VRSQRT14PS512:
		return rewriteValue_OpAMD64VRSQRT14PS512(v)
	case ssaop.OpAMD64VRSQRT14PSMasked128:
		return rewriteValue_OpAMD64VRSQRT14PSMasked128(v)
	case ssaop.OpAMD64VRSQRT14PSMasked256:
		return rewriteValue_OpAMD64VRSQRT14PSMasked256(v)
	case ssaop.OpAMD64VRSQRT14PSMasked512:
		return rewriteValue_OpAMD64VRSQRT14PSMasked512(v)
	case ssaop.OpAMD64VRSQRTPS128:
		return rewriteValue_OpAMD64VRSQRTPS128(v)
	case ssaop.OpAMD64VRSQRTPS256:
		return rewriteValue_OpAMD64VRSQRTPS256(v)
	case ssaop.OpAMD64VSCALEFPD128:
		return rewriteValue_OpAMD64VSCALEFPD128(v)
	case ssaop.OpAMD64VSCALEFPD256:
		return rewriteValue_OpAMD64VSCALEFPD256(v)
	case ssaop.OpAMD64VSCALEFPD512:
		return rewriteValue_OpAMD64VSCALEFPD512(v)
	case ssaop.OpAMD64VSCALEFPDMasked128:
		return rewriteValue_OpAMD64VSCALEFPDMasked128(v)
	case ssaop.OpAMD64VSCALEFPDMasked256:
		return rewriteValue_OpAMD64VSCALEFPDMasked256(v)
	case ssaop.OpAMD64VSCALEFPDMasked512:
		return rewriteValue_OpAMD64VSCALEFPDMasked512(v)
	case ssaop.OpAMD64VSCALEFPS128:
		return rewriteValue_OpAMD64VSCALEFPS128(v)
	case ssaop.OpAMD64VSCALEFPS256:
		return rewriteValue_OpAMD64VSCALEFPS256(v)
	case ssaop.OpAMD64VSCALEFPS512:
		return rewriteValue_OpAMD64VSCALEFPS512(v)
	case ssaop.OpAMD64VSCALEFPSMasked128:
		return rewriteValue_OpAMD64VSCALEFPSMasked128(v)
	case ssaop.OpAMD64VSCALEFPSMasked256:
		return rewriteValue_OpAMD64VSCALEFPSMasked256(v)
	case ssaop.OpAMD64VSCALEFPSMasked512:
		return rewriteValue_OpAMD64VSCALEFPSMasked512(v)
	case ssaop.OpAMD64VSHUFPD128:
		return rewriteValue_OpAMD64VSHUFPD128(v)
	case ssaop.OpAMD64VSHUFPD256:
		return rewriteValue_OpAMD64VSHUFPD256(v)
	case ssaop.OpAMD64VSHUFPD512:
		return rewriteValue_OpAMD64VSHUFPD512(v)
	case ssaop.OpAMD64VSHUFPS128:
		return rewriteValue_OpAMD64VSHUFPS128(v)
	case ssaop.OpAMD64VSHUFPS256:
		return rewriteValue_OpAMD64VSHUFPS256(v)
	case ssaop.OpAMD64VSHUFPS512:
		return rewriteValue_OpAMD64VSHUFPS512(v)
	case ssaop.OpAMD64VSQRTPD128:
		return rewriteValue_OpAMD64VSQRTPD128(v)
	case ssaop.OpAMD64VSQRTPD256:
		return rewriteValue_OpAMD64VSQRTPD256(v)
	case ssaop.OpAMD64VSQRTPD512:
		return rewriteValue_OpAMD64VSQRTPD512(v)
	case ssaop.OpAMD64VSQRTPDMasked128:
		return rewriteValue_OpAMD64VSQRTPDMasked128(v)
	case ssaop.OpAMD64VSQRTPDMasked256:
		return rewriteValue_OpAMD64VSQRTPDMasked256(v)
	case ssaop.OpAMD64VSQRTPDMasked512:
		return rewriteValue_OpAMD64VSQRTPDMasked512(v)
	case ssaop.OpAMD64VSQRTPS128:
		return rewriteValue_OpAMD64VSQRTPS128(v)
	case ssaop.OpAMD64VSQRTPS256:
		return rewriteValue_OpAMD64VSQRTPS256(v)
	case ssaop.OpAMD64VSQRTPS512:
		return rewriteValue_OpAMD64VSQRTPS512(v)
	case ssaop.OpAMD64VSQRTPSMasked128:
		return rewriteValue_OpAMD64VSQRTPSMasked128(v)
	case ssaop.OpAMD64VSQRTPSMasked256:
		return rewriteValue_OpAMD64VSQRTPSMasked256(v)
	case ssaop.OpAMD64VSQRTPSMasked512:
		return rewriteValue_OpAMD64VSQRTPSMasked512(v)
	case ssaop.OpAMD64VSUBPD128:
		return rewriteValue_OpAMD64VSUBPD128(v)
	case ssaop.OpAMD64VSUBPD256:
		return rewriteValue_OpAMD64VSUBPD256(v)
	case ssaop.OpAMD64VSUBPD512:
		return rewriteValue_OpAMD64VSUBPD512(v)
	case ssaop.OpAMD64VSUBPDMasked128:
		return rewriteValue_OpAMD64VSUBPDMasked128(v)
	case ssaop.OpAMD64VSUBPDMasked256:
		return rewriteValue_OpAMD64VSUBPDMasked256(v)
	case ssaop.OpAMD64VSUBPDMasked512:
		return rewriteValue_OpAMD64VSUBPDMasked512(v)
	case ssaop.OpAMD64VSUBPS128:
		return rewriteValue_OpAMD64VSUBPS128(v)
	case ssaop.OpAMD64VSUBPS256:
		return rewriteValue_OpAMD64VSUBPS256(v)
	case ssaop.OpAMD64VSUBPS512:
		return rewriteValue_OpAMD64VSUBPS512(v)
	case ssaop.OpAMD64VSUBPSMasked128:
		return rewriteValue_OpAMD64VSUBPSMasked128(v)
	case ssaop.OpAMD64VSUBPSMasked256:
		return rewriteValue_OpAMD64VSUBPSMasked256(v)
	case ssaop.OpAMD64VSUBPSMasked512:
		return rewriteValue_OpAMD64VSUBPSMasked512(v)
	case ssaop.OpAMD64XADDLlock:
		return rewriteValue_OpAMD64XADDLlock(v)
	case ssaop.OpAMD64XADDQlock:
		return rewriteValue_OpAMD64XADDQlock(v)
	case ssaop.OpAMD64XCHGL:
		return rewriteValue_OpAMD64XCHGL(v)
	case ssaop.OpAMD64XCHGQ:
		return rewriteValue_OpAMD64XCHGQ(v)
	case ssaop.OpAMD64XORBconstmodify:
		return rewriteValue_OpAMD64XORBconstmodify(v)
	case ssaop.OpAMD64XORL:
		return rewriteValue_OpAMD64XORL(v)
	case ssaop.OpAMD64XORLconst:
		return rewriteValue_OpAMD64XORLconst(v)
	case ssaop.OpAMD64XORLconstmodify:
		return rewriteValue_OpAMD64XORLconstmodify(v)
	case ssaop.OpAMD64XORLload:
		return rewriteValue_OpAMD64XORLload(v)
	case ssaop.OpAMD64XORLmodify:
		return rewriteValue_OpAMD64XORLmodify(v)
	case ssaop.OpAMD64XORQ:
		return rewriteValue_OpAMD64XORQ(v)
	case ssaop.OpAMD64XORQconst:
		return rewriteValue_OpAMD64XORQconst(v)
	case ssaop.OpAMD64XORQconstmodify:
		return rewriteValue_OpAMD64XORQconstmodify(v)
	case ssaop.OpAMD64XORQload:
		return rewriteValue_OpAMD64XORQload(v)
	case ssaop.OpAMD64XORQmodify:
		return rewriteValue_OpAMD64XORQmodify(v)
	case ssaop.OpAMD64XORWconstmodify:
		return rewriteValue_OpAMD64XORWconstmodify(v)
	case ssaop.OpAbsInt16x16:
		v.Op = ssaop.OpAMD64VPABSW256
		return true
	case ssaop.OpAbsInt16x32:
		v.Op = ssaop.OpAMD64VPABSW512
		return true
	case ssaop.OpAbsInt16x8:
		v.Op = ssaop.OpAMD64VPABSW128
		return true
	case ssaop.OpAbsInt32x16:
		v.Op = ssaop.OpAMD64VPABSD512
		return true
	case ssaop.OpAbsInt32x4:
		v.Op = ssaop.OpAMD64VPABSD128
		return true
	case ssaop.OpAbsInt32x8:
		v.Op = ssaop.OpAMD64VPABSD256
		return true
	case ssaop.OpAbsInt64x2:
		v.Op = ssaop.OpAMD64VPABSQ128
		return true
	case ssaop.OpAbsInt64x4:
		v.Op = ssaop.OpAMD64VPABSQ256
		return true
	case ssaop.OpAbsInt64x8:
		v.Op = ssaop.OpAMD64VPABSQ512
		return true
	case ssaop.OpAbsInt8x16:
		v.Op = ssaop.OpAMD64VPABSB128
		return true
	case ssaop.OpAbsInt8x32:
		v.Op = ssaop.OpAMD64VPABSB256
		return true
	case ssaop.OpAbsInt8x64:
		v.Op = ssaop.OpAMD64VPABSB512
		return true
	case ssaop.OpAdd16:
		v.Op = ssaop.OpAMD64ADDL
		return true
	case ssaop.OpAdd32:
		v.Op = ssaop.OpAMD64ADDL
		return true
	case ssaop.OpAdd32F:
		v.Op = ssaop.OpAMD64ADDSS
		return true
	case ssaop.OpAdd64:
		v.Op = ssaop.OpAMD64ADDQ
		return true
	case ssaop.OpAdd64F:
		v.Op = ssaop.OpAMD64ADDSD
		return true
	case ssaop.OpAdd8:
		v.Op = ssaop.OpAMD64ADDL
		return true
	case ssaop.OpAddFloat32x16:
		v.Op = ssaop.OpAMD64VADDPS512
		return true
	case ssaop.OpAddFloat32x4:
		v.Op = ssaop.OpAMD64VADDPS128
		return true
	case ssaop.OpAddFloat32x8:
		v.Op = ssaop.OpAMD64VADDPS256
		return true
	case ssaop.OpAddFloat64x2:
		v.Op = ssaop.OpAMD64VADDPD128
		return true
	case ssaop.OpAddFloat64x4:
		v.Op = ssaop.OpAMD64VADDPD256
		return true
	case ssaop.OpAddFloat64x8:
		v.Op = ssaop.OpAMD64VADDPD512
		return true
	case ssaop.OpAddInt16x16:
		v.Op = ssaop.OpAMD64VPADDW256
		return true
	case ssaop.OpAddInt16x32:
		v.Op = ssaop.OpAMD64VPADDW512
		return true
	case ssaop.OpAddInt16x8:
		v.Op = ssaop.OpAMD64VPADDW128
		return true
	case ssaop.OpAddInt32x16:
		v.Op = ssaop.OpAMD64VPADDD512
		return true
	case ssaop.OpAddInt32x4:
		v.Op = ssaop.OpAMD64VPADDD128
		return true
	case ssaop.OpAddInt32x8:
		v.Op = ssaop.OpAMD64VPADDD256
		return true
	case ssaop.OpAddInt64x2:
		v.Op = ssaop.OpAMD64VPADDQ128
		return true
	case ssaop.OpAddInt64x4:
		v.Op = ssaop.OpAMD64VPADDQ256
		return true
	case ssaop.OpAddInt64x8:
		v.Op = ssaop.OpAMD64VPADDQ512
		return true
	case ssaop.OpAddInt8x16:
		v.Op = ssaop.OpAMD64VPADDB128
		return true
	case ssaop.OpAddInt8x32:
		v.Op = ssaop.OpAMD64VPADDB256
		return true
	case ssaop.OpAddInt8x64:
		v.Op = ssaop.OpAMD64VPADDB512
		return true
	case ssaop.OpAddOddSubEvenFloat32x4:
		v.Op = ssaop.OpAMD64VADDSUBPS128
		return true
	case ssaop.OpAddOddSubEvenFloat32x8:
		v.Op = ssaop.OpAMD64VADDSUBPS256
		return true
	case ssaop.OpAddOddSubEvenFloat64x2:
		v.Op = ssaop.OpAMD64VADDSUBPD128
		return true
	case ssaop.OpAddOddSubEvenFloat64x4:
		v.Op = ssaop.OpAMD64VADDSUBPD256
		return true
	case ssaop.OpAddPtr:
		v.Op = ssaop.OpAMD64ADDQ
		return true
	case ssaop.OpAddSaturatedInt16x16:
		v.Op = ssaop.OpAMD64VPADDSW256
		return true
	case ssaop.OpAddSaturatedInt16x32:
		v.Op = ssaop.OpAMD64VPADDSW512
		return true
	case ssaop.OpAddSaturatedInt16x8:
		v.Op = ssaop.OpAMD64VPADDSW128
		return true
	case ssaop.OpAddSaturatedInt8x16:
		v.Op = ssaop.OpAMD64VPADDSB128
		return true
	case ssaop.OpAddSaturatedInt8x32:
		v.Op = ssaop.OpAMD64VPADDSB256
		return true
	case ssaop.OpAddSaturatedInt8x64:
		v.Op = ssaop.OpAMD64VPADDSB512
		return true
	case ssaop.OpAddSaturatedUint16x16:
		v.Op = ssaop.OpAMD64VPADDUSW256
		return true
	case ssaop.OpAddSaturatedUint16x32:
		v.Op = ssaop.OpAMD64VPADDUSW512
		return true
	case ssaop.OpAddSaturatedUint16x8:
		v.Op = ssaop.OpAMD64VPADDUSW128
		return true
	case ssaop.OpAddSaturatedUint8x16:
		v.Op = ssaop.OpAMD64VPADDUSB128
		return true
	case ssaop.OpAddSaturatedUint8x32:
		v.Op = ssaop.OpAMD64VPADDUSB256
		return true
	case ssaop.OpAddSaturatedUint8x64:
		v.Op = ssaop.OpAMD64VPADDUSB512
		return true
	case ssaop.OpAddUint16x16:
		v.Op = ssaop.OpAMD64VPADDW256
		return true
	case ssaop.OpAddUint16x32:
		v.Op = ssaop.OpAMD64VPADDW512
		return true
	case ssaop.OpAddUint16x8:
		v.Op = ssaop.OpAMD64VPADDW128
		return true
	case ssaop.OpAddUint32x16:
		v.Op = ssaop.OpAMD64VPADDD512
		return true
	case ssaop.OpAddUint32x4:
		v.Op = ssaop.OpAMD64VPADDD128
		return true
	case ssaop.OpAddUint32x8:
		v.Op = ssaop.OpAMD64VPADDD256
		return true
	case ssaop.OpAddUint64x2:
		v.Op = ssaop.OpAMD64VPADDQ128
		return true
	case ssaop.OpAddUint64x4:
		v.Op = ssaop.OpAMD64VPADDQ256
		return true
	case ssaop.OpAddUint64x8:
		v.Op = ssaop.OpAMD64VPADDQ512
		return true
	case ssaop.OpAddUint8x16:
		v.Op = ssaop.OpAMD64VPADDB128
		return true
	case ssaop.OpAddUint8x32:
		v.Op = ssaop.OpAMD64VPADDB256
		return true
	case ssaop.OpAddUint8x64:
		v.Op = ssaop.OpAMD64VPADDB512
		return true
	case ssaop.OpAddr:
		return rewriteValue_OpAddr(v)
	case ssaop.OpAnd16:
		v.Op = ssaop.OpAMD64ANDL
		return true
	case ssaop.OpAnd32:
		v.Op = ssaop.OpAMD64ANDL
		return true
	case ssaop.OpAnd64:
		v.Op = ssaop.OpAMD64ANDQ
		return true
	case ssaop.OpAnd8:
		v.Op = ssaop.OpAMD64ANDL
		return true
	case ssaop.OpAndB:
		v.Op = ssaop.OpAMD64ANDL
		return true
	case ssaop.OpAndInt16x16:
		v.Op = ssaop.OpAMD64VPAND256
		return true
	case ssaop.OpAndInt16x32:
		v.Op = ssaop.OpAMD64VPANDD512
		return true
	case ssaop.OpAndInt16x8:
		v.Op = ssaop.OpAMD64VPAND128
		return true
	case ssaop.OpAndInt32x16:
		v.Op = ssaop.OpAMD64VPANDD512
		return true
	case ssaop.OpAndInt32x4:
		v.Op = ssaop.OpAMD64VPAND128
		return true
	case ssaop.OpAndInt32x8:
		v.Op = ssaop.OpAMD64VPAND256
		return true
	case ssaop.OpAndInt64x2:
		v.Op = ssaop.OpAMD64VPAND128
		return true
	case ssaop.OpAndInt64x4:
		v.Op = ssaop.OpAMD64VPAND256
		return true
	case ssaop.OpAndInt64x8:
		v.Op = ssaop.OpAMD64VPANDQ512
		return true
	case ssaop.OpAndInt8x16:
		v.Op = ssaop.OpAMD64VPAND128
		return true
	case ssaop.OpAndInt8x32:
		v.Op = ssaop.OpAMD64VPAND256
		return true
	case ssaop.OpAndInt8x64:
		v.Op = ssaop.OpAMD64VPANDD512
		return true
	case ssaop.OpAndNotInt16x16:
		v.Op = ssaop.OpAMD64VPANDN256
		return true
	case ssaop.OpAndNotInt16x32:
		v.Op = ssaop.OpAMD64VPANDND512
		return true
	case ssaop.OpAndNotInt16x8:
		v.Op = ssaop.OpAMD64VPANDN128
		return true
	case ssaop.OpAndNotInt32x16:
		v.Op = ssaop.OpAMD64VPANDND512
		return true
	case ssaop.OpAndNotInt32x4:
		v.Op = ssaop.OpAMD64VPANDN128
		return true
	case ssaop.OpAndNotInt32x8:
		v.Op = ssaop.OpAMD64VPANDN256
		return true
	case ssaop.OpAndNotInt64x2:
		v.Op = ssaop.OpAMD64VPANDN128
		return true
	case ssaop.OpAndNotInt64x4:
		v.Op = ssaop.OpAMD64VPANDN256
		return true
	case ssaop.OpAndNotInt64x8:
		v.Op = ssaop.OpAMD64VPANDNQ512
		return true
	case ssaop.OpAndNotInt8x16:
		v.Op = ssaop.OpAMD64VPANDN128
		return true
	case ssaop.OpAndNotInt8x32:
		v.Op = ssaop.OpAMD64VPANDN256
		return true
	case ssaop.OpAndNotInt8x64:
		v.Op = ssaop.OpAMD64VPANDND512
		return true
	case ssaop.OpAndNotUint16x16:
		v.Op = ssaop.OpAMD64VPANDN256
		return true
	case ssaop.OpAndNotUint16x32:
		v.Op = ssaop.OpAMD64VPANDND512
		return true
	case ssaop.OpAndNotUint16x8:
		v.Op = ssaop.OpAMD64VPANDN128
		return true
	case ssaop.OpAndNotUint32x16:
		v.Op = ssaop.OpAMD64VPANDND512
		return true
	case ssaop.OpAndNotUint32x4:
		v.Op = ssaop.OpAMD64VPANDN128
		return true
	case ssaop.OpAndNotUint32x8:
		v.Op = ssaop.OpAMD64VPANDN256
		return true
	case ssaop.OpAndNotUint64x2:
		v.Op = ssaop.OpAMD64VPANDN128
		return true
	case ssaop.OpAndNotUint64x4:
		v.Op = ssaop.OpAMD64VPANDN256
		return true
	case ssaop.OpAndNotUint64x8:
		v.Op = ssaop.OpAMD64VPANDNQ512
		return true
	case ssaop.OpAndNotUint8x16:
		v.Op = ssaop.OpAMD64VPANDN128
		return true
	case ssaop.OpAndNotUint8x32:
		v.Op = ssaop.OpAMD64VPANDN256
		return true
	case ssaop.OpAndNotUint8x64:
		v.Op = ssaop.OpAMD64VPANDND512
		return true
	case ssaop.OpAndUint16x16:
		v.Op = ssaop.OpAMD64VPAND256
		return true
	case ssaop.OpAndUint16x32:
		v.Op = ssaop.OpAMD64VPANDD512
		return true
	case ssaop.OpAndUint16x8:
		v.Op = ssaop.OpAMD64VPAND128
		return true
	case ssaop.OpAndUint32x16:
		v.Op = ssaop.OpAMD64VPANDD512
		return true
	case ssaop.OpAndUint32x4:
		v.Op = ssaop.OpAMD64VPAND128
		return true
	case ssaop.OpAndUint32x8:
		v.Op = ssaop.OpAMD64VPAND256
		return true
	case ssaop.OpAndUint64x2:
		v.Op = ssaop.OpAMD64VPAND128
		return true
	case ssaop.OpAndUint64x4:
		v.Op = ssaop.OpAMD64VPAND256
		return true
	case ssaop.OpAndUint64x8:
		v.Op = ssaop.OpAMD64VPANDQ512
		return true
	case ssaop.OpAndUint8x16:
		v.Op = ssaop.OpAMD64VPAND128
		return true
	case ssaop.OpAndUint8x32:
		v.Op = ssaop.OpAMD64VPAND256
		return true
	case ssaop.OpAndUint8x64:
		v.Op = ssaop.OpAMD64VPANDD512
		return true
	case ssaop.OpAtomicAdd32:
		return rewriteValue_OpAtomicAdd32(v)
	case ssaop.OpAtomicAdd64:
		return rewriteValue_OpAtomicAdd64(v)
	case ssaop.OpAtomicAnd32:
		return rewriteValue_OpAtomicAnd32(v)
	case ssaop.OpAtomicAnd32value:
		return rewriteValue_OpAtomicAnd32value(v)
	case ssaop.OpAtomicAnd64value:
		return rewriteValue_OpAtomicAnd64value(v)
	case ssaop.OpAtomicAnd8:
		return rewriteValue_OpAtomicAnd8(v)
	case ssaop.OpAtomicCompareAndSwap32:
		return rewriteValue_OpAtomicCompareAndSwap32(v)
	case ssaop.OpAtomicCompareAndSwap64:
		return rewriteValue_OpAtomicCompareAndSwap64(v)
	case ssaop.OpAtomicExchange32:
		return rewriteValue_OpAtomicExchange32(v)
	case ssaop.OpAtomicExchange64:
		return rewriteValue_OpAtomicExchange64(v)
	case ssaop.OpAtomicExchange8:
		return rewriteValue_OpAtomicExchange8(v)
	case ssaop.OpAtomicLoad32:
		return rewriteValue_OpAtomicLoad32(v)
	case ssaop.OpAtomicLoad64:
		return rewriteValue_OpAtomicLoad64(v)
	case ssaop.OpAtomicLoad8:
		return rewriteValue_OpAtomicLoad8(v)
	case ssaop.OpAtomicLoadPtr:
		return rewriteValue_OpAtomicLoadPtr(v)
	case ssaop.OpAtomicOr32:
		return rewriteValue_OpAtomicOr32(v)
	case ssaop.OpAtomicOr32value:
		return rewriteValue_OpAtomicOr32value(v)
	case ssaop.OpAtomicOr64value:
		return rewriteValue_OpAtomicOr64value(v)
	case ssaop.OpAtomicOr8:
		return rewriteValue_OpAtomicOr8(v)
	case ssaop.OpAtomicStore32:
		return rewriteValue_OpAtomicStore32(v)
	case ssaop.OpAtomicStore64:
		return rewriteValue_OpAtomicStore64(v)
	case ssaop.OpAtomicStore8:
		return rewriteValue_OpAtomicStore8(v)
	case ssaop.OpAtomicStorePtrNoWB:
		return rewriteValue_OpAtomicStorePtrNoWB(v)
	case ssaop.OpAverageUint16x16:
		v.Op = ssaop.OpAMD64VPAVGW256
		return true
	case ssaop.OpAverageUint16x32:
		v.Op = ssaop.OpAMD64VPAVGW512
		return true
	case ssaop.OpAverageUint16x8:
		v.Op = ssaop.OpAMD64VPAVGW128
		return true
	case ssaop.OpAverageUint8x16:
		v.Op = ssaop.OpAMD64VPAVGB128
		return true
	case ssaop.OpAverageUint8x32:
		v.Op = ssaop.OpAMD64VPAVGB256
		return true
	case ssaop.OpAverageUint8x64:
		v.Op = ssaop.OpAMD64VPAVGB512
		return true
	case ssaop.OpAvg64u:
		v.Op = ssaop.OpAMD64AVGQU
		return true
	case ssaop.OpBitLen16:
		return rewriteValue_OpBitLen16(v)
	case ssaop.OpBitLen32:
		return rewriteValue_OpBitLen32(v)
	case ssaop.OpBitLen64:
		return rewriteValue_OpBitLen64(v)
	case ssaop.OpBitLen8:
		return rewriteValue_OpBitLen8(v)
	case ssaop.OpBswap16:
		return rewriteValue_OpBswap16(v)
	case ssaop.OpBswap32:
		v.Op = ssaop.OpAMD64BSWAPL
		return true
	case ssaop.OpBswap64:
		v.Op = ssaop.OpAMD64BSWAPQ
		return true
	case ssaop.OpCeil:
		return rewriteValue_OpCeil(v)
	case ssaop.OpCeilFloat32x4:
		return rewriteValue_OpCeilFloat32x4(v)
	case ssaop.OpCeilFloat32x8:
		return rewriteValue_OpCeilFloat32x8(v)
	case ssaop.OpCeilFloat64x2:
		return rewriteValue_OpCeilFloat64x2(v)
	case ssaop.OpCeilFloat64x4:
		return rewriteValue_OpCeilFloat64x4(v)
	case ssaop.OpCeilScaledFloat32x16:
		return rewriteValue_OpCeilScaledFloat32x16(v)
	case ssaop.OpCeilScaledFloat32x4:
		return rewriteValue_OpCeilScaledFloat32x4(v)
	case ssaop.OpCeilScaledFloat32x8:
		return rewriteValue_OpCeilScaledFloat32x8(v)
	case ssaop.OpCeilScaledFloat64x2:
		return rewriteValue_OpCeilScaledFloat64x2(v)
	case ssaop.OpCeilScaledFloat64x4:
		return rewriteValue_OpCeilScaledFloat64x4(v)
	case ssaop.OpCeilScaledFloat64x8:
		return rewriteValue_OpCeilScaledFloat64x8(v)
	case ssaop.OpCeilScaledResidueFloat32x16:
		return rewriteValue_OpCeilScaledResidueFloat32x16(v)
	case ssaop.OpCeilScaledResidueFloat32x4:
		return rewriteValue_OpCeilScaledResidueFloat32x4(v)
	case ssaop.OpCeilScaledResidueFloat32x8:
		return rewriteValue_OpCeilScaledResidueFloat32x8(v)
	case ssaop.OpCeilScaledResidueFloat64x2:
		return rewriteValue_OpCeilScaledResidueFloat64x2(v)
	case ssaop.OpCeilScaledResidueFloat64x4:
		return rewriteValue_OpCeilScaledResidueFloat64x4(v)
	case ssaop.OpCeilScaledResidueFloat64x8:
		return rewriteValue_OpCeilScaledResidueFloat64x8(v)
	case ssaop.OpClosureCall:
		v.Op = ssaop.OpAMD64CALLclosure
		return true
	case ssaop.OpCom16:
		v.Op = ssaop.OpAMD64NOTL
		return true
	case ssaop.OpCom32:
		v.Op = ssaop.OpAMD64NOTL
		return true
	case ssaop.OpCom64:
		v.Op = ssaop.OpAMD64NOTQ
		return true
	case ssaop.OpCom8:
		v.Op = ssaop.OpAMD64NOTL
		return true
	case ssaop.OpCompressFloat32x16:
		return rewriteValue_OpCompressFloat32x16(v)
	case ssaop.OpCompressFloat32x4:
		return rewriteValue_OpCompressFloat32x4(v)
	case ssaop.OpCompressFloat32x8:
		return rewriteValue_OpCompressFloat32x8(v)
	case ssaop.OpCompressFloat64x2:
		return rewriteValue_OpCompressFloat64x2(v)
	case ssaop.OpCompressFloat64x4:
		return rewriteValue_OpCompressFloat64x4(v)
	case ssaop.OpCompressFloat64x8:
		return rewriteValue_OpCompressFloat64x8(v)
	case ssaop.OpCompressInt16x16:
		return rewriteValue_OpCompressInt16x16(v)
	case ssaop.OpCompressInt16x32:
		return rewriteValue_OpCompressInt16x32(v)
	case ssaop.OpCompressInt16x8:
		return rewriteValue_OpCompressInt16x8(v)
	case ssaop.OpCompressInt32x16:
		return rewriteValue_OpCompressInt32x16(v)
	case ssaop.OpCompressInt32x4:
		return rewriteValue_OpCompressInt32x4(v)
	case ssaop.OpCompressInt32x8:
		return rewriteValue_OpCompressInt32x8(v)
	case ssaop.OpCompressInt64x2:
		return rewriteValue_OpCompressInt64x2(v)
	case ssaop.OpCompressInt64x4:
		return rewriteValue_OpCompressInt64x4(v)
	case ssaop.OpCompressInt64x8:
		return rewriteValue_OpCompressInt64x8(v)
	case ssaop.OpCompressInt8x16:
		return rewriteValue_OpCompressInt8x16(v)
	case ssaop.OpCompressInt8x32:
		return rewriteValue_OpCompressInt8x32(v)
	case ssaop.OpCompressInt8x64:
		return rewriteValue_OpCompressInt8x64(v)
	case ssaop.OpCompressUint16x16:
		return rewriteValue_OpCompressUint16x16(v)
	case ssaop.OpCompressUint16x32:
		return rewriteValue_OpCompressUint16x32(v)
	case ssaop.OpCompressUint16x8:
		return rewriteValue_OpCompressUint16x8(v)
	case ssaop.OpCompressUint32x16:
		return rewriteValue_OpCompressUint32x16(v)
	case ssaop.OpCompressUint32x4:
		return rewriteValue_OpCompressUint32x4(v)
	case ssaop.OpCompressUint32x8:
		return rewriteValue_OpCompressUint32x8(v)
	case ssaop.OpCompressUint64x2:
		return rewriteValue_OpCompressUint64x2(v)
	case ssaop.OpCompressUint64x4:
		return rewriteValue_OpCompressUint64x4(v)
	case ssaop.OpCompressUint64x8:
		return rewriteValue_OpCompressUint64x8(v)
	case ssaop.OpCompressUint8x16:
		return rewriteValue_OpCompressUint8x16(v)
	case ssaop.OpCompressUint8x32:
		return rewriteValue_OpCompressUint8x32(v)
	case ssaop.OpCompressUint8x64:
		return rewriteValue_OpCompressUint8x64(v)
	case ssaop.OpConcatAddPairsFloat32x4:
		v.Op = ssaop.OpAMD64VHADDPS128
		return true
	case ssaop.OpConcatAddPairsFloat64x2:
		v.Op = ssaop.OpAMD64VHADDPD128
		return true
	case ssaop.OpConcatAddPairsGroupedFloat32x8:
		v.Op = ssaop.OpAMD64VHADDPS256
		return true
	case ssaop.OpConcatAddPairsGroupedFloat64x4:
		v.Op = ssaop.OpAMD64VHADDPD256
		return true
	case ssaop.OpConcatAddPairsGroupedInt16x16:
		v.Op = ssaop.OpAMD64VPHADDW256
		return true
	case ssaop.OpConcatAddPairsGroupedInt32x8:
		v.Op = ssaop.OpAMD64VPHADDD256
		return true
	case ssaop.OpConcatAddPairsGroupedUint16x16:
		v.Op = ssaop.OpAMD64VPHADDW256
		return true
	case ssaop.OpConcatAddPairsGroupedUint32x8:
		v.Op = ssaop.OpAMD64VPHADDD256
		return true
	case ssaop.OpConcatAddPairsInt16x8:
		v.Op = ssaop.OpAMD64VPHADDW128
		return true
	case ssaop.OpConcatAddPairsInt32x4:
		v.Op = ssaop.OpAMD64VPHADDD128
		return true
	case ssaop.OpConcatAddPairsSaturatedGroupedInt16x16:
		v.Op = ssaop.OpAMD64VPHADDSW256
		return true
	case ssaop.OpConcatAddPairsSaturatedInt16x8:
		v.Op = ssaop.OpAMD64VPHADDSW128
		return true
	case ssaop.OpConcatAddPairsUint16x8:
		v.Op = ssaop.OpAMD64VPHADDW128
		return true
	case ssaop.OpConcatAddPairsUint32x4:
		v.Op = ssaop.OpAMD64VPHADDD128
		return true
	case ssaop.OpConcatPermute128ScalarsFloat32x8:
		v.Op = ssaop.OpAMD64VPERM2F128256
		return true
	case ssaop.OpConcatPermute128ScalarsFloat64x4:
		v.Op = ssaop.OpAMD64VPERM2F128256
		return true
	case ssaop.OpConcatPermute128ScalarsInt16x16:
		v.Op = ssaop.OpAMD64VPERM2I128256
		return true
	case ssaop.OpConcatPermute128ScalarsInt32x8:
		v.Op = ssaop.OpAMD64VPERM2I128256
		return true
	case ssaop.OpConcatPermute128ScalarsInt64x4:
		v.Op = ssaop.OpAMD64VPERM2I128256
		return true
	case ssaop.OpConcatPermute128ScalarsInt8x32:
		v.Op = ssaop.OpAMD64VPERM2I128256
		return true
	case ssaop.OpConcatPermute128ScalarsUint16x16:
		v.Op = ssaop.OpAMD64VPERM2I128256
		return true
	case ssaop.OpConcatPermute128ScalarsUint32x8:
		v.Op = ssaop.OpAMD64VPERM2I128256
		return true
	case ssaop.OpConcatPermute128ScalarsUint64x4:
		v.Op = ssaop.OpAMD64VPERM2I128256
		return true
	case ssaop.OpConcatPermute128ScalarsUint8x32:
		v.Op = ssaop.OpAMD64VPERM2I128256
		return true
	case ssaop.OpConcatPermuteFloat32x16:
		v.Op = ssaop.OpAMD64VPERMI2PS512
		return true
	case ssaop.OpConcatPermuteFloat32x4:
		v.Op = ssaop.OpAMD64VPERMI2PS128
		return true
	case ssaop.OpConcatPermuteFloat32x8:
		v.Op = ssaop.OpAMD64VPERMI2PS256
		return true
	case ssaop.OpConcatPermuteFloat64x2:
		v.Op = ssaop.OpAMD64VPERMI2PD128
		return true
	case ssaop.OpConcatPermuteFloat64x4:
		v.Op = ssaop.OpAMD64VPERMI2PD256
		return true
	case ssaop.OpConcatPermuteFloat64x8:
		v.Op = ssaop.OpAMD64VPERMI2PD512
		return true
	case ssaop.OpConcatPermuteInt16x16:
		v.Op = ssaop.OpAMD64VPERMI2W256
		return true
	case ssaop.OpConcatPermuteInt16x32:
		v.Op = ssaop.OpAMD64VPERMI2W512
		return true
	case ssaop.OpConcatPermuteInt16x8:
		v.Op = ssaop.OpAMD64VPERMI2W128
		return true
	case ssaop.OpConcatPermuteInt32x16:
		v.Op = ssaop.OpAMD64VPERMI2D512
		return true
	case ssaop.OpConcatPermuteInt32x4:
		v.Op = ssaop.OpAMD64VPERMI2D128
		return true
	case ssaop.OpConcatPermuteInt32x8:
		v.Op = ssaop.OpAMD64VPERMI2D256
		return true
	case ssaop.OpConcatPermuteInt64x2:
		v.Op = ssaop.OpAMD64VPERMI2Q128
		return true
	case ssaop.OpConcatPermuteInt64x4:
		v.Op = ssaop.OpAMD64VPERMI2Q256
		return true
	case ssaop.OpConcatPermuteInt64x8:
		v.Op = ssaop.OpAMD64VPERMI2Q512
		return true
	case ssaop.OpConcatPermuteInt8x16:
		v.Op = ssaop.OpAMD64VPERMI2B128
		return true
	case ssaop.OpConcatPermuteInt8x32:
		v.Op = ssaop.OpAMD64VPERMI2B256
		return true
	case ssaop.OpConcatPermuteInt8x64:
		v.Op = ssaop.OpAMD64VPERMI2B512
		return true
	case ssaop.OpConcatPermuteUint16x16:
		v.Op = ssaop.OpAMD64VPERMI2W256
		return true
	case ssaop.OpConcatPermuteUint16x32:
		v.Op = ssaop.OpAMD64VPERMI2W512
		return true
	case ssaop.OpConcatPermuteUint16x8:
		v.Op = ssaop.OpAMD64VPERMI2W128
		return true
	case ssaop.OpConcatPermuteUint32x16:
		v.Op = ssaop.OpAMD64VPERMI2D512
		return true
	case ssaop.OpConcatPermuteUint32x4:
		v.Op = ssaop.OpAMD64VPERMI2D128
		return true
	case ssaop.OpConcatPermuteUint32x8:
		v.Op = ssaop.OpAMD64VPERMI2D256
		return true
	case ssaop.OpConcatPermuteUint64x2:
		v.Op = ssaop.OpAMD64VPERMI2Q128
		return true
	case ssaop.OpConcatPermuteUint64x4:
		v.Op = ssaop.OpAMD64VPERMI2Q256
		return true
	case ssaop.OpConcatPermuteUint64x8:
		v.Op = ssaop.OpAMD64VPERMI2Q512
		return true
	case ssaop.OpConcatPermuteUint8x16:
		v.Op = ssaop.OpAMD64VPERMI2B128
		return true
	case ssaop.OpConcatPermuteUint8x32:
		v.Op = ssaop.OpAMD64VPERMI2B256
		return true
	case ssaop.OpConcatPermuteUint8x64:
		v.Op = ssaop.OpAMD64VPERMI2B512
		return true
	case ssaop.OpConcatSaturateToInt16GroupedInt32x16:
		v.Op = ssaop.OpAMD64VPACKSSDW512
		return true
	case ssaop.OpConcatSaturateToInt16GroupedInt32x8:
		v.Op = ssaop.OpAMD64VPACKSSDW256
		return true
	case ssaop.OpConcatSaturateToInt16Int32x4:
		v.Op = ssaop.OpAMD64VPACKSSDW128
		return true
	case ssaop.OpConcatSaturateToUint16GroupedInt32x16:
		v.Op = ssaop.OpAMD64VPACKUSDW512
		return true
	case ssaop.OpConcatSaturateToUint16GroupedInt32x8:
		v.Op = ssaop.OpAMD64VPACKUSDW256
		return true
	case ssaop.OpConcatSaturateToUint16Int32x4:
		v.Op = ssaop.OpAMD64VPACKUSDW128
		return true
	case ssaop.OpConcatShiftBytesRightGroupedUint8x32:
		v.Op = ssaop.OpAMD64VPALIGNR256
		return true
	case ssaop.OpConcatShiftBytesRightGroupedUint8x64:
		v.Op = ssaop.OpAMD64VPALIGNR512
		return true
	case ssaop.OpConcatShiftBytesRightUint8x16:
		v.Op = ssaop.OpAMD64VPALIGNR128
		return true
	case ssaop.OpConcatSubPairsFloat32x4:
		v.Op = ssaop.OpAMD64VHSUBPS128
		return true
	case ssaop.OpConcatSubPairsFloat64x2:
		v.Op = ssaop.OpAMD64VHSUBPD128
		return true
	case ssaop.OpConcatSubPairsGroupedFloat32x8:
		v.Op = ssaop.OpAMD64VHSUBPS256
		return true
	case ssaop.OpConcatSubPairsGroupedFloat64x4:
		v.Op = ssaop.OpAMD64VHSUBPD256
		return true
	case ssaop.OpConcatSubPairsGroupedInt16x16:
		v.Op = ssaop.OpAMD64VPHSUBW256
		return true
	case ssaop.OpConcatSubPairsGroupedInt32x8:
		v.Op = ssaop.OpAMD64VPHSUBD256
		return true
	case ssaop.OpConcatSubPairsGroupedUint16x16:
		v.Op = ssaop.OpAMD64VPHSUBW256
		return true
	case ssaop.OpConcatSubPairsGroupedUint32x8:
		v.Op = ssaop.OpAMD64VPHSUBD256
		return true
	case ssaop.OpConcatSubPairsInt16x8:
		v.Op = ssaop.OpAMD64VPHSUBW128
		return true
	case ssaop.OpConcatSubPairsInt32x4:
		v.Op = ssaop.OpAMD64VPHSUBD128
		return true
	case ssaop.OpConcatSubPairsSaturatedGroupedInt16x16:
		v.Op = ssaop.OpAMD64VPHSUBSW256
		return true
	case ssaop.OpConcatSubPairsSaturatedInt16x8:
		v.Op = ssaop.OpAMD64VPHSUBSW128
		return true
	case ssaop.OpConcatSubPairsUint16x8:
		v.Op = ssaop.OpAMD64VPHSUBW128
		return true
	case ssaop.OpConcatSubPairsUint32x4:
		v.Op = ssaop.OpAMD64VPHSUBD128
		return true
	case ssaop.OpCondSelect:
		return rewriteValue_OpCondSelect(v)
	case ssaop.OpConst16:
		return rewriteValue_OpConst16(v)
	case ssaop.OpConst32:
		v.Op = ssaop.OpAMD64MOVLconst
		return true
	case ssaop.OpConst32F:
		v.Op = ssaop.OpAMD64MOVSSconst
		return true
	case ssaop.OpConst64:
		v.Op = ssaop.OpAMD64MOVQconst
		return true
	case ssaop.OpConst64F:
		v.Op = ssaop.OpAMD64MOVSDconst
		return true
	case ssaop.OpConst8:
		return rewriteValue_OpConst8(v)
	case ssaop.OpConstBool:
		return rewriteValue_OpConstBool(v)
	case ssaop.OpConstNil:
		return rewriteValue_OpConstNil(v)
	case ssaop.OpConvertToFloat32Float64x2:
		v.Op = ssaop.OpAMD64VCVTPD2PSX128
		return true
	case ssaop.OpConvertToFloat32Float64x4:
		v.Op = ssaop.OpAMD64VCVTPD2PSY128
		return true
	case ssaop.OpConvertToFloat32Float64x8:
		v.Op = ssaop.OpAMD64VCVTPD2PS256
		return true
	case ssaop.OpConvertToFloat32Int32x16:
		v.Op = ssaop.OpAMD64VCVTDQ2PS512
		return true
	case ssaop.OpConvertToFloat32Int32x4:
		v.Op = ssaop.OpAMD64VCVTDQ2PS128
		return true
	case ssaop.OpConvertToFloat32Int32x8:
		v.Op = ssaop.OpAMD64VCVTDQ2PS256
		return true
	case ssaop.OpConvertToFloat32Int64x2:
		v.Op = ssaop.OpAMD64VCVTQQ2PSX128
		return true
	case ssaop.OpConvertToFloat32Int64x4:
		v.Op = ssaop.OpAMD64VCVTQQ2PSY128
		return true
	case ssaop.OpConvertToFloat32Int64x8:
		v.Op = ssaop.OpAMD64VCVTQQ2PS256
		return true
	case ssaop.OpConvertToFloat32Uint32x16:
		v.Op = ssaop.OpAMD64VCVTUDQ2PS512
		return true
	case ssaop.OpConvertToFloat32Uint32x4:
		v.Op = ssaop.OpAMD64VCVTUDQ2PS128
		return true
	case ssaop.OpConvertToFloat32Uint32x8:
		v.Op = ssaop.OpAMD64VCVTUDQ2PS256
		return true
	case ssaop.OpConvertToFloat32Uint64x2:
		v.Op = ssaop.OpAMD64VCVTUQQ2PSX128
		return true
	case ssaop.OpConvertToFloat32Uint64x4:
		v.Op = ssaop.OpAMD64VCVTUQQ2PSY128
		return true
	case ssaop.OpConvertToFloat32Uint64x8:
		v.Op = ssaop.OpAMD64VCVTUQQ2PS256
		return true
	case ssaop.OpConvertToFloat64Float32x4:
		v.Op = ssaop.OpAMD64VCVTPS2PD256
		return true
	case ssaop.OpConvertToFloat64Float32x8:
		v.Op = ssaop.OpAMD64VCVTPS2PD512
		return true
	case ssaop.OpConvertToFloat64Int32x4:
		v.Op = ssaop.OpAMD64VCVTDQ2PD256
		return true
	case ssaop.OpConvertToFloat64Int32x8:
		v.Op = ssaop.OpAMD64VCVTDQ2PD512
		return true
	case ssaop.OpConvertToFloat64Int64x2:
		v.Op = ssaop.OpAMD64VCVTQQ2PD128
		return true
	case ssaop.OpConvertToFloat64Int64x4:
		v.Op = ssaop.OpAMD64VCVTQQ2PD256
		return true
	case ssaop.OpConvertToFloat64Int64x8:
		v.Op = ssaop.OpAMD64VCVTQQ2PD512
		return true
	case ssaop.OpConvertToFloat64Uint32x4:
		v.Op = ssaop.OpAMD64VCVTUDQ2PD256
		return true
	case ssaop.OpConvertToFloat64Uint32x8:
		v.Op = ssaop.OpAMD64VCVTUDQ2PD512
		return true
	case ssaop.OpConvertToFloat64Uint64x2:
		v.Op = ssaop.OpAMD64VCVTUQQ2PD128
		return true
	case ssaop.OpConvertToFloat64Uint64x4:
		v.Op = ssaop.OpAMD64VCVTUQQ2PD256
		return true
	case ssaop.OpConvertToFloat64Uint64x8:
		v.Op = ssaop.OpAMD64VCVTUQQ2PD512
		return true
	case ssaop.OpConvertToInt32Float32x16:
		v.Op = ssaop.OpAMD64VCVTTPS2DQ512
		return true
	case ssaop.OpConvertToInt32Float32x4:
		v.Op = ssaop.OpAMD64VCVTTPS2DQ128
		return true
	case ssaop.OpConvertToInt32Float32x8:
		v.Op = ssaop.OpAMD64VCVTTPS2DQ256
		return true
	case ssaop.OpConvertToInt32Float64x2:
		v.Op = ssaop.OpAMD64VCVTTPD2DQX128
		return true
	case ssaop.OpConvertToInt32Float64x4:
		v.Op = ssaop.OpAMD64VCVTTPD2DQY128
		return true
	case ssaop.OpConvertToInt32Float64x8:
		v.Op = ssaop.OpAMD64VCVTTPD2DQ256
		return true
	case ssaop.OpConvertToInt64Float32x4:
		v.Op = ssaop.OpAMD64VCVTTPS2QQ256
		return true
	case ssaop.OpConvertToInt64Float32x8:
		v.Op = ssaop.OpAMD64VCVTTPS2QQ512
		return true
	case ssaop.OpConvertToInt64Float64x2:
		v.Op = ssaop.OpAMD64VCVTTPD2QQ128
		return true
	case ssaop.OpConvertToInt64Float64x4:
		v.Op = ssaop.OpAMD64VCVTTPD2QQ256
		return true
	case ssaop.OpConvertToInt64Float64x8:
		v.Op = ssaop.OpAMD64VCVTTPD2QQ512
		return true
	case ssaop.OpConvertToUint32Float32x16:
		v.Op = ssaop.OpAMD64VCVTTPS2UDQ512
		return true
	case ssaop.OpConvertToUint32Float32x4:
		v.Op = ssaop.OpAMD64VCVTTPS2UDQ128
		return true
	case ssaop.OpConvertToUint32Float32x8:
		v.Op = ssaop.OpAMD64VCVTTPS2UDQ256
		return true
	case ssaop.OpConvertToUint32Float64x2:
		v.Op = ssaop.OpAMD64VCVTTPD2UDQX128
		return true
	case ssaop.OpConvertToUint32Float64x4:
		v.Op = ssaop.OpAMD64VCVTTPD2UDQY128
		return true
	case ssaop.OpConvertToUint32Float64x8:
		v.Op = ssaop.OpAMD64VCVTTPD2UDQ256
		return true
	case ssaop.OpConvertToUint64Float32x4:
		v.Op = ssaop.OpAMD64VCVTTPS2UQQ256
		return true
	case ssaop.OpConvertToUint64Float32x8:
		v.Op = ssaop.OpAMD64VCVTTPS2UQQ512
		return true
	case ssaop.OpConvertToUint64Float64x2:
		v.Op = ssaop.OpAMD64VCVTTPD2UQQ128
		return true
	case ssaop.OpConvertToUint64Float64x4:
		v.Op = ssaop.OpAMD64VCVTTPD2UQQ256
		return true
	case ssaop.OpConvertToUint64Float64x8:
		v.Op = ssaop.OpAMD64VCVTTPD2UQQ512
		return true
	case ssaop.OpCtz16:
		return rewriteValue_OpCtz16(v)
	case ssaop.OpCtz16NonZero:
		return rewriteValue_OpCtz16NonZero(v)
	case ssaop.OpCtz32:
		return rewriteValue_OpCtz32(v)
	case ssaop.OpCtz32NonZero:
		return rewriteValue_OpCtz32NonZero(v)
	case ssaop.OpCtz64:
		return rewriteValue_OpCtz64(v)
	case ssaop.OpCtz64NonZero:
		return rewriteValue_OpCtz64NonZero(v)
	case ssaop.OpCtz8:
		return rewriteValue_OpCtz8(v)
	case ssaop.OpCtz8NonZero:
		return rewriteValue_OpCtz8NonZero(v)
	case ssaop.OpCvt16toMask16x16:
		return rewriteValue_OpCvt16toMask16x16(v)
	case ssaop.OpCvt16toMask32x16:
		return rewriteValue_OpCvt16toMask32x16(v)
	case ssaop.OpCvt16toMask8x16:
		return rewriteValue_OpCvt16toMask8x16(v)
	case ssaop.OpCvt32Fto32:
		return rewriteValue_OpCvt32Fto32(v)
	case ssaop.OpCvt32Fto64:
		return rewriteValue_OpCvt32Fto64(v)
	case ssaop.OpCvt32Fto64F:
		v.Op = ssaop.OpAMD64CVTSS2SD
		return true
	case ssaop.OpCvt32to32F:
		v.Op = ssaop.OpAMD64CVTSL2SS
		return true
	case ssaop.OpCvt32to64F:
		v.Op = ssaop.OpAMD64CVTSL2SD
		return true
	case ssaop.OpCvt32toMask16x32:
		return rewriteValue_OpCvt32toMask16x32(v)
	case ssaop.OpCvt32toMask8x32:
		return rewriteValue_OpCvt32toMask8x32(v)
	case ssaop.OpCvt64Fto32:
		return rewriteValue_OpCvt64Fto32(v)
	case ssaop.OpCvt64Fto32F:
		v.Op = ssaop.OpAMD64CVTSD2SS
		return true
	case ssaop.OpCvt64Fto64:
		return rewriteValue_OpCvt64Fto64(v)
	case ssaop.OpCvt64to32F:
		v.Op = ssaop.OpAMD64CVTSQ2SS
		return true
	case ssaop.OpCvt64to64F:
		v.Op = ssaop.OpAMD64CVTSQ2SD
		return true
	case ssaop.OpCvt64toMask8x64:
		return rewriteValue_OpCvt64toMask8x64(v)
	case ssaop.OpCvt8toMask16x8:
		return rewriteValue_OpCvt8toMask16x8(v)
	case ssaop.OpCvt8toMask32x4:
		return rewriteValue_OpCvt8toMask32x4(v)
	case ssaop.OpCvt8toMask32x8:
		return rewriteValue_OpCvt8toMask32x8(v)
	case ssaop.OpCvt8toMask64x2:
		return rewriteValue_OpCvt8toMask64x2(v)
	case ssaop.OpCvt8toMask64x4:
		return rewriteValue_OpCvt8toMask64x4(v)
	case ssaop.OpCvt8toMask64x8:
		return rewriteValue_OpCvt8toMask64x8(v)
	case ssaop.OpCvtBoolToUint8:
		v.Op = ssaop.OpCopy
		return true
	case ssaop.OpCvtMask16x16to16:
		return rewriteValue_OpCvtMask16x16to16(v)
	case ssaop.OpCvtMask16x32to32:
		return rewriteValue_OpCvtMask16x32to32(v)
	case ssaop.OpCvtMask16x8to8:
		return rewriteValue_OpCvtMask16x8to8(v)
	case ssaop.OpCvtMask32x16to16:
		return rewriteValue_OpCvtMask32x16to16(v)
	case ssaop.OpCvtMask32x4to8:
		v.Op = ssaop.OpAMD64VMOVMSKPS128
		return true
	case ssaop.OpCvtMask32x8to8:
		v.Op = ssaop.OpAMD64VMOVMSKPS256
		return true
	case ssaop.OpCvtMask64x2to8:
		v.Op = ssaop.OpAMD64VMOVMSKPD128
		return true
	case ssaop.OpCvtMask64x4to8:
		v.Op = ssaop.OpAMD64VMOVMSKPD256
		return true
	case ssaop.OpCvtMask64x8to8:
		return rewriteValue_OpCvtMask64x8to8(v)
	case ssaop.OpCvtMask8x16to16:
		v.Op = ssaop.OpAMD64VPMOVMSKB128
		return true
	case ssaop.OpCvtMask8x32to32:
		v.Op = ssaop.OpAMD64VPMOVMSKB256
		return true
	case ssaop.OpCvtMask8x64to64:
		return rewriteValue_OpCvtMask8x64to64(v)
	case ssaop.OpDiv128u:
		v.Op = ssaop.OpAMD64DIVQU2
		return true
	case ssaop.OpDiv16:
		return rewriteValue_OpDiv16(v)
	case ssaop.OpDiv16u:
		return rewriteValue_OpDiv16u(v)
	case ssaop.OpDiv32:
		return rewriteValue_OpDiv32(v)
	case ssaop.OpDiv32F:
		v.Op = ssaop.OpAMD64DIVSS
		return true
	case ssaop.OpDiv32u:
		return rewriteValue_OpDiv32u(v)
	case ssaop.OpDiv64:
		return rewriteValue_OpDiv64(v)
	case ssaop.OpDiv64F:
		v.Op = ssaop.OpAMD64DIVSD
		return true
	case ssaop.OpDiv64u:
		return rewriteValue_OpDiv64u(v)
	case ssaop.OpDiv8:
		return rewriteValue_OpDiv8(v)
	case ssaop.OpDiv8u:
		return rewriteValue_OpDiv8u(v)
	case ssaop.OpDivFloat32x16:
		v.Op = ssaop.OpAMD64VDIVPS512
		return true
	case ssaop.OpDivFloat32x4:
		v.Op = ssaop.OpAMD64VDIVPS128
		return true
	case ssaop.OpDivFloat32x8:
		v.Op = ssaop.OpAMD64VDIVPS256
		return true
	case ssaop.OpDivFloat64x2:
		v.Op = ssaop.OpAMD64VDIVPD128
		return true
	case ssaop.OpDivFloat64x4:
		v.Op = ssaop.OpAMD64VDIVPD256
		return true
	case ssaop.OpDivFloat64x8:
		v.Op = ssaop.OpAMD64VDIVPD512
		return true
	case ssaop.OpDotProductPairsInt16x16:
		v.Op = ssaop.OpAMD64VPMADDWD256
		return true
	case ssaop.OpDotProductPairsInt16x32:
		v.Op = ssaop.OpAMD64VPMADDWD512
		return true
	case ssaop.OpDotProductPairsInt16x8:
		v.Op = ssaop.OpAMD64VPMADDWD128
		return true
	case ssaop.OpDotProductPairsSaturatedUint8x16:
		v.Op = ssaop.OpAMD64VPMADDUBSW128
		return true
	case ssaop.OpDotProductPairsSaturatedUint8x32:
		v.Op = ssaop.OpAMD64VPMADDUBSW256
		return true
	case ssaop.OpDotProductPairsSaturatedUint8x64:
		v.Op = ssaop.OpAMD64VPMADDUBSW512
		return true
	case ssaop.OpEq16:
		return rewriteValue_OpEq16(v)
	case ssaop.OpEq32:
		return rewriteValue_OpEq32(v)
	case ssaop.OpEq32F:
		return rewriteValue_OpEq32F(v)
	case ssaop.OpEq64:
		return rewriteValue_OpEq64(v)
	case ssaop.OpEq64F:
		return rewriteValue_OpEq64F(v)
	case ssaop.OpEq8:
		return rewriteValue_OpEq8(v)
	case ssaop.OpEqB:
		return rewriteValue_OpEqB(v)
	case ssaop.OpEqPtr:
		return rewriteValue_OpEqPtr(v)
	case ssaop.OpEqualFloat32x16:
		return rewriteValue_OpEqualFloat32x16(v)
	case ssaop.OpEqualFloat32x4:
		return rewriteValue_OpEqualFloat32x4(v)
	case ssaop.OpEqualFloat32x8:
		return rewriteValue_OpEqualFloat32x8(v)
	case ssaop.OpEqualFloat64x2:
		return rewriteValue_OpEqualFloat64x2(v)
	case ssaop.OpEqualFloat64x4:
		return rewriteValue_OpEqualFloat64x4(v)
	case ssaop.OpEqualFloat64x8:
		return rewriteValue_OpEqualFloat64x8(v)
	case ssaop.OpEqualInt16x16:
		v.Op = ssaop.OpAMD64VPCMPEQW256
		return true
	case ssaop.OpEqualInt16x32:
		return rewriteValue_OpEqualInt16x32(v)
	case ssaop.OpEqualInt16x8:
		v.Op = ssaop.OpAMD64VPCMPEQW128
		return true
	case ssaop.OpEqualInt32x16:
		return rewriteValue_OpEqualInt32x16(v)
	case ssaop.OpEqualInt32x4:
		v.Op = ssaop.OpAMD64VPCMPEQD128
		return true
	case ssaop.OpEqualInt32x8:
		v.Op = ssaop.OpAMD64VPCMPEQD256
		return true
	case ssaop.OpEqualInt64x2:
		v.Op = ssaop.OpAMD64VPCMPEQQ128
		return true
	case ssaop.OpEqualInt64x4:
		v.Op = ssaop.OpAMD64VPCMPEQQ256
		return true
	case ssaop.OpEqualInt64x8:
		return rewriteValue_OpEqualInt64x8(v)
	case ssaop.OpEqualInt8x16:
		v.Op = ssaop.OpAMD64VPCMPEQB128
		return true
	case ssaop.OpEqualInt8x32:
		v.Op = ssaop.OpAMD64VPCMPEQB256
		return true
	case ssaop.OpEqualInt8x64:
		return rewriteValue_OpEqualInt8x64(v)
	case ssaop.OpEqualUint16x16:
		v.Op = ssaop.OpAMD64VPCMPEQW256
		return true
	case ssaop.OpEqualUint16x32:
		return rewriteValue_OpEqualUint16x32(v)
	case ssaop.OpEqualUint16x8:
		v.Op = ssaop.OpAMD64VPCMPEQW128
		return true
	case ssaop.OpEqualUint32x16:
		return rewriteValue_OpEqualUint32x16(v)
	case ssaop.OpEqualUint32x4:
		v.Op = ssaop.OpAMD64VPCMPEQD128
		return true
	case ssaop.OpEqualUint32x8:
		v.Op = ssaop.OpAMD64VPCMPEQD256
		return true
	case ssaop.OpEqualUint64x2:
		v.Op = ssaop.OpAMD64VPCMPEQQ128
		return true
	case ssaop.OpEqualUint64x4:
		v.Op = ssaop.OpAMD64VPCMPEQQ256
		return true
	case ssaop.OpEqualUint64x8:
		return rewriteValue_OpEqualUint64x8(v)
	case ssaop.OpEqualUint8x16:
		v.Op = ssaop.OpAMD64VPCMPEQB128
		return true
	case ssaop.OpEqualUint8x32:
		v.Op = ssaop.OpAMD64VPCMPEQB256
		return true
	case ssaop.OpEqualUint8x64:
		return rewriteValue_OpEqualUint8x64(v)
	case ssaop.OpExpandFloat32x16:
		return rewriteValue_OpExpandFloat32x16(v)
	case ssaop.OpExpandFloat32x4:
		return rewriteValue_OpExpandFloat32x4(v)
	case ssaop.OpExpandFloat32x8:
		return rewriteValue_OpExpandFloat32x8(v)
	case ssaop.OpExpandFloat64x2:
		return rewriteValue_OpExpandFloat64x2(v)
	case ssaop.OpExpandFloat64x4:
		return rewriteValue_OpExpandFloat64x4(v)
	case ssaop.OpExpandFloat64x8:
		return rewriteValue_OpExpandFloat64x8(v)
	case ssaop.OpExpandInt16x16:
		return rewriteValue_OpExpandInt16x16(v)
	case ssaop.OpExpandInt16x32:
		return rewriteValue_OpExpandInt16x32(v)
	case ssaop.OpExpandInt16x8:
		return rewriteValue_OpExpandInt16x8(v)
	case ssaop.OpExpandInt32x16:
		return rewriteValue_OpExpandInt32x16(v)
	case ssaop.OpExpandInt32x4:
		return rewriteValue_OpExpandInt32x4(v)
	case ssaop.OpExpandInt32x8:
		return rewriteValue_OpExpandInt32x8(v)
	case ssaop.OpExpandInt64x2:
		return rewriteValue_OpExpandInt64x2(v)
	case ssaop.OpExpandInt64x4:
		return rewriteValue_OpExpandInt64x4(v)
	case ssaop.OpExpandInt64x8:
		return rewriteValue_OpExpandInt64x8(v)
	case ssaop.OpExpandInt8x16:
		return rewriteValue_OpExpandInt8x16(v)
	case ssaop.OpExpandInt8x32:
		return rewriteValue_OpExpandInt8x32(v)
	case ssaop.OpExpandInt8x64:
		return rewriteValue_OpExpandInt8x64(v)
	case ssaop.OpExpandUint16x16:
		return rewriteValue_OpExpandUint16x16(v)
	case ssaop.OpExpandUint16x32:
		return rewriteValue_OpExpandUint16x32(v)
	case ssaop.OpExpandUint16x8:
		return rewriteValue_OpExpandUint16x8(v)
	case ssaop.OpExpandUint32x16:
		return rewriteValue_OpExpandUint32x16(v)
	case ssaop.OpExpandUint32x4:
		return rewriteValue_OpExpandUint32x4(v)
	case ssaop.OpExpandUint32x8:
		return rewriteValue_OpExpandUint32x8(v)
	case ssaop.OpExpandUint64x2:
		return rewriteValue_OpExpandUint64x2(v)
	case ssaop.OpExpandUint64x4:
		return rewriteValue_OpExpandUint64x4(v)
	case ssaop.OpExpandUint64x8:
		return rewriteValue_OpExpandUint64x8(v)
	case ssaop.OpExpandUint8x16:
		return rewriteValue_OpExpandUint8x16(v)
	case ssaop.OpExpandUint8x32:
		return rewriteValue_OpExpandUint8x32(v)
	case ssaop.OpExpandUint8x64:
		return rewriteValue_OpExpandUint8x64(v)
	case ssaop.OpExtendLo2ToInt64Int16x8:
		v.Op = ssaop.OpAMD64VPMOVSXWQ128
		return true
	case ssaop.OpExtendLo2ToInt64Int32x4:
		v.Op = ssaop.OpAMD64VPMOVSXDQ128
		return true
	case ssaop.OpExtendLo2ToInt64Int8x16:
		v.Op = ssaop.OpAMD64VPMOVSXBQ128
		return true
	case ssaop.OpExtendLo2ToUint64Uint16x8:
		v.Op = ssaop.OpAMD64VPMOVZXWQ128
		return true
	case ssaop.OpExtendLo2ToUint64Uint32x4:
		v.Op = ssaop.OpAMD64VPMOVZXDQ128
		return true
	case ssaop.OpExtendLo2ToUint64Uint8x16:
		v.Op = ssaop.OpAMD64VPMOVZXBQ128
		return true
	case ssaop.OpExtendLo4ToInt32Int16x8:
		v.Op = ssaop.OpAMD64VPMOVSXWD128
		return true
	case ssaop.OpExtendLo4ToInt32Int8x16:
		v.Op = ssaop.OpAMD64VPMOVSXBD128
		return true
	case ssaop.OpExtendLo4ToInt64Int16x8:
		v.Op = ssaop.OpAMD64VPMOVSXWQ256
		return true
	case ssaop.OpExtendLo4ToInt64Int8x16:
		v.Op = ssaop.OpAMD64VPMOVSXBQ256
		return true
	case ssaop.OpExtendLo4ToUint32Uint16x8:
		v.Op = ssaop.OpAMD64VPMOVZXWD128
		return true
	case ssaop.OpExtendLo4ToUint32Uint8x16:
		v.Op = ssaop.OpAMD64VPMOVZXBD128
		return true
	case ssaop.OpExtendLo4ToUint64Uint16x8:
		v.Op = ssaop.OpAMD64VPMOVZXWQ256
		return true
	case ssaop.OpExtendLo4ToUint64Uint8x16:
		v.Op = ssaop.OpAMD64VPMOVZXBQ256
		return true
	case ssaop.OpExtendLo8ToInt16Int8x16:
		v.Op = ssaop.OpAMD64VPMOVSXBW128
		return true
	case ssaop.OpExtendLo8ToInt32Int8x16:
		v.Op = ssaop.OpAMD64VPMOVSXBD256
		return true
	case ssaop.OpExtendLo8ToInt64Int8x16:
		v.Op = ssaop.OpAMD64VPMOVSXBQ512
		return true
	case ssaop.OpExtendLo8ToUint16Uint8x16:
		v.Op = ssaop.OpAMD64VPMOVZXBW128
		return true
	case ssaop.OpExtendLo8ToUint32Uint8x16:
		v.Op = ssaop.OpAMD64VPMOVZXBD256
		return true
	case ssaop.OpExtendLo8ToUint64Uint8x16:
		v.Op = ssaop.OpAMD64VPMOVZXBQ512
		return true
	case ssaop.OpExtendToInt16Int8x16:
		v.Op = ssaop.OpAMD64VPMOVSXBW256
		return true
	case ssaop.OpExtendToInt16Int8x32:
		v.Op = ssaop.OpAMD64VPMOVSXBW512
		return true
	case ssaop.OpExtendToInt32Int16x16:
		v.Op = ssaop.OpAMD64VPMOVSXWD512
		return true
	case ssaop.OpExtendToInt32Int16x8:
		v.Op = ssaop.OpAMD64VPMOVSXWD256
		return true
	case ssaop.OpExtendToInt32Int8x16:
		v.Op = ssaop.OpAMD64VPMOVSXBD512
		return true
	case ssaop.OpExtendToInt64Int16x8:
		v.Op = ssaop.OpAMD64VPMOVSXWQ512
		return true
	case ssaop.OpExtendToInt64Int32x4:
		v.Op = ssaop.OpAMD64VPMOVSXDQ256
		return true
	case ssaop.OpExtendToInt64Int32x8:
		v.Op = ssaop.OpAMD64VPMOVSXDQ512
		return true
	case ssaop.OpExtendToUint16Uint8x16:
		v.Op = ssaop.OpAMD64VPMOVZXBW256
		return true
	case ssaop.OpExtendToUint16Uint8x32:
		v.Op = ssaop.OpAMD64VPMOVZXBW512
		return true
	case ssaop.OpExtendToUint32Uint16x16:
		v.Op = ssaop.OpAMD64VPMOVZXWD512
		return true
	case ssaop.OpExtendToUint32Uint16x8:
		v.Op = ssaop.OpAMD64VPMOVZXWD256
		return true
	case ssaop.OpExtendToUint32Uint8x16:
		v.Op = ssaop.OpAMD64VPMOVZXBD512
		return true
	case ssaop.OpExtendToUint64Uint16x8:
		v.Op = ssaop.OpAMD64VPMOVZXWQ512
		return true
	case ssaop.OpExtendToUint64Uint32x4:
		v.Op = ssaop.OpAMD64VPMOVZXDQ256
		return true
	case ssaop.OpExtendToUint64Uint32x8:
		v.Op = ssaop.OpAMD64VPMOVZXDQ512
		return true
	case ssaop.OpFMA:
		return rewriteValue_OpFMA(v)
	case ssaop.OpFloor:
		return rewriteValue_OpFloor(v)
	case ssaop.OpFloorFloat32x4:
		return rewriteValue_OpFloorFloat32x4(v)
	case ssaop.OpFloorFloat32x8:
		return rewriteValue_OpFloorFloat32x8(v)
	case ssaop.OpFloorFloat64x2:
		return rewriteValue_OpFloorFloat64x2(v)
	case ssaop.OpFloorFloat64x4:
		return rewriteValue_OpFloorFloat64x4(v)
	case ssaop.OpFloorScaledFloat32x16:
		return rewriteValue_OpFloorScaledFloat32x16(v)
	case ssaop.OpFloorScaledFloat32x4:
		return rewriteValue_OpFloorScaledFloat32x4(v)
	case ssaop.OpFloorScaledFloat32x8:
		return rewriteValue_OpFloorScaledFloat32x8(v)
	case ssaop.OpFloorScaledFloat64x2:
		return rewriteValue_OpFloorScaledFloat64x2(v)
	case ssaop.OpFloorScaledFloat64x4:
		return rewriteValue_OpFloorScaledFloat64x4(v)
	case ssaop.OpFloorScaledFloat64x8:
		return rewriteValue_OpFloorScaledFloat64x8(v)
	case ssaop.OpFloorScaledResidueFloat32x16:
		return rewriteValue_OpFloorScaledResidueFloat32x16(v)
	case ssaop.OpFloorScaledResidueFloat32x4:
		return rewriteValue_OpFloorScaledResidueFloat32x4(v)
	case ssaop.OpFloorScaledResidueFloat32x8:
		return rewriteValue_OpFloorScaledResidueFloat32x8(v)
	case ssaop.OpFloorScaledResidueFloat64x2:
		return rewriteValue_OpFloorScaledResidueFloat64x2(v)
	case ssaop.OpFloorScaledResidueFloat64x4:
		return rewriteValue_OpFloorScaledResidueFloat64x4(v)
	case ssaop.OpFloorScaledResidueFloat64x8:
		return rewriteValue_OpFloorScaledResidueFloat64x8(v)
	case ssaop.OpGaloisFieldAffineTransformInverseUint8x16:
		v.Op = ssaop.OpAMD64VGF2P8AFFINEINVQB128
		return true
	case ssaop.OpGaloisFieldAffineTransformInverseUint8x32:
		v.Op = ssaop.OpAMD64VGF2P8AFFINEINVQB256
		return true
	case ssaop.OpGaloisFieldAffineTransformInverseUint8x64:
		v.Op = ssaop.OpAMD64VGF2P8AFFINEINVQB512
		return true
	case ssaop.OpGaloisFieldAffineTransformUint8x16:
		v.Op = ssaop.OpAMD64VGF2P8AFFINEQB128
		return true
	case ssaop.OpGaloisFieldAffineTransformUint8x32:
		v.Op = ssaop.OpAMD64VGF2P8AFFINEQB256
		return true
	case ssaop.OpGaloisFieldAffineTransformUint8x64:
		v.Op = ssaop.OpAMD64VGF2P8AFFINEQB512
		return true
	case ssaop.OpGaloisFieldMulUint8x16:
		v.Op = ssaop.OpAMD64VGF2P8MULB128
		return true
	case ssaop.OpGaloisFieldMulUint8x32:
		v.Op = ssaop.OpAMD64VGF2P8MULB256
		return true
	case ssaop.OpGaloisFieldMulUint8x64:
		v.Op = ssaop.OpAMD64VGF2P8MULB512
		return true
	case ssaop.OpGetCallerPC:
		v.Op = ssaop.OpAMD64LoweredGetCallerPC
		return true
	case ssaop.OpGetCallerSP:
		v.Op = ssaop.OpAMD64LoweredGetCallerSP
		return true
	case ssaop.OpGetClosurePtr:
		v.Op = ssaop.OpAMD64LoweredGetClosurePtr
		return true
	case ssaop.OpGetElemFloat32x4:
		v.Op = ssaop.OpAMD64VPEXTRD128
		return true
	case ssaop.OpGetElemFloat64x2:
		v.Op = ssaop.OpAMD64VPEXTRQ128
		return true
	case ssaop.OpGetElemInt16x8:
		v.Op = ssaop.OpAMD64VPEXTRW128
		return true
	case ssaop.OpGetElemInt32x4:
		v.Op = ssaop.OpAMD64VPEXTRD128
		return true
	case ssaop.OpGetElemInt64x2:
		v.Op = ssaop.OpAMD64VPEXTRQ128
		return true
	case ssaop.OpGetElemInt8x16:
		v.Op = ssaop.OpAMD64VPEXTRB128
		return true
	case ssaop.OpGetElemUint16x8:
		v.Op = ssaop.OpAMD64VPEXTRW128
		return true
	case ssaop.OpGetElemUint32x4:
		v.Op = ssaop.OpAMD64VPEXTRD128
		return true
	case ssaop.OpGetElemUint64x2:
		v.Op = ssaop.OpAMD64VPEXTRQ128
		return true
	case ssaop.OpGetElemUint8x16:
		v.Op = ssaop.OpAMD64VPEXTRB128
		return true
	case ssaop.OpGetG:
		return rewriteValue_OpGetG(v)
	case ssaop.OpGetHiFloat32x16:
		return rewriteValue_OpGetHiFloat32x16(v)
	case ssaop.OpGetHiFloat32x8:
		return rewriteValue_OpGetHiFloat32x8(v)
	case ssaop.OpGetHiFloat64x4:
		return rewriteValue_OpGetHiFloat64x4(v)
	case ssaop.OpGetHiFloat64x8:
		return rewriteValue_OpGetHiFloat64x8(v)
	case ssaop.OpGetHiInt16x16:
		return rewriteValue_OpGetHiInt16x16(v)
	case ssaop.OpGetHiInt16x32:
		return rewriteValue_OpGetHiInt16x32(v)
	case ssaop.OpGetHiInt32x16:
		return rewriteValue_OpGetHiInt32x16(v)
	case ssaop.OpGetHiInt32x8:
		return rewriteValue_OpGetHiInt32x8(v)
	case ssaop.OpGetHiInt64x4:
		return rewriteValue_OpGetHiInt64x4(v)
	case ssaop.OpGetHiInt64x8:
		return rewriteValue_OpGetHiInt64x8(v)
	case ssaop.OpGetHiInt8x32:
		return rewriteValue_OpGetHiInt8x32(v)
	case ssaop.OpGetHiInt8x64:
		return rewriteValue_OpGetHiInt8x64(v)
	case ssaop.OpGetHiUint16x16:
		return rewriteValue_OpGetHiUint16x16(v)
	case ssaop.OpGetHiUint16x32:
		return rewriteValue_OpGetHiUint16x32(v)
	case ssaop.OpGetHiUint32x16:
		return rewriteValue_OpGetHiUint32x16(v)
	case ssaop.OpGetHiUint32x8:
		return rewriteValue_OpGetHiUint32x8(v)
	case ssaop.OpGetHiUint64x4:
		return rewriteValue_OpGetHiUint64x4(v)
	case ssaop.OpGetHiUint64x8:
		return rewriteValue_OpGetHiUint64x8(v)
	case ssaop.OpGetHiUint8x32:
		return rewriteValue_OpGetHiUint8x32(v)
	case ssaop.OpGetHiUint8x64:
		return rewriteValue_OpGetHiUint8x64(v)
	case ssaop.OpGetLoFloat32x16:
		return rewriteValue_OpGetLoFloat32x16(v)
	case ssaop.OpGetLoFloat32x8:
		return rewriteValue_OpGetLoFloat32x8(v)
	case ssaop.OpGetLoFloat64x4:
		return rewriteValue_OpGetLoFloat64x4(v)
	case ssaop.OpGetLoFloat64x8:
		return rewriteValue_OpGetLoFloat64x8(v)
	case ssaop.OpGetLoInt16x16:
		return rewriteValue_OpGetLoInt16x16(v)
	case ssaop.OpGetLoInt16x32:
		return rewriteValue_OpGetLoInt16x32(v)
	case ssaop.OpGetLoInt32x16:
		return rewriteValue_OpGetLoInt32x16(v)
	case ssaop.OpGetLoInt32x8:
		return rewriteValue_OpGetLoInt32x8(v)
	case ssaop.OpGetLoInt64x4:
		return rewriteValue_OpGetLoInt64x4(v)
	case ssaop.OpGetLoInt64x8:
		return rewriteValue_OpGetLoInt64x8(v)
	case ssaop.OpGetLoInt8x32:
		return rewriteValue_OpGetLoInt8x32(v)
	case ssaop.OpGetLoInt8x64:
		return rewriteValue_OpGetLoInt8x64(v)
	case ssaop.OpGetLoUint16x16:
		return rewriteValue_OpGetLoUint16x16(v)
	case ssaop.OpGetLoUint16x32:
		return rewriteValue_OpGetLoUint16x32(v)
	case ssaop.OpGetLoUint32x16:
		return rewriteValue_OpGetLoUint32x16(v)
	case ssaop.OpGetLoUint32x8:
		return rewriteValue_OpGetLoUint32x8(v)
	case ssaop.OpGetLoUint64x4:
		return rewriteValue_OpGetLoUint64x4(v)
	case ssaop.OpGetLoUint64x8:
		return rewriteValue_OpGetLoUint64x8(v)
	case ssaop.OpGetLoUint8x32:
		return rewriteValue_OpGetLoUint8x32(v)
	case ssaop.OpGetLoUint8x64:
		return rewriteValue_OpGetLoUint8x64(v)
	case ssaop.OpGreaterEqualFloat32x16:
		return rewriteValue_OpGreaterEqualFloat32x16(v)
	case ssaop.OpGreaterEqualFloat32x4:
		return rewriteValue_OpGreaterEqualFloat32x4(v)
	case ssaop.OpGreaterEqualFloat32x8:
		return rewriteValue_OpGreaterEqualFloat32x8(v)
	case ssaop.OpGreaterEqualFloat64x2:
		return rewriteValue_OpGreaterEqualFloat64x2(v)
	case ssaop.OpGreaterEqualFloat64x4:
		return rewriteValue_OpGreaterEqualFloat64x4(v)
	case ssaop.OpGreaterEqualFloat64x8:
		return rewriteValue_OpGreaterEqualFloat64x8(v)
	case ssaop.OpGreaterEqualInt16x32:
		return rewriteValue_OpGreaterEqualInt16x32(v)
	case ssaop.OpGreaterEqualInt32x16:
		return rewriteValue_OpGreaterEqualInt32x16(v)
	case ssaop.OpGreaterEqualInt64x8:
		return rewriteValue_OpGreaterEqualInt64x8(v)
	case ssaop.OpGreaterEqualInt8x64:
		return rewriteValue_OpGreaterEqualInt8x64(v)
	case ssaop.OpGreaterEqualUint16x32:
		return rewriteValue_OpGreaterEqualUint16x32(v)
	case ssaop.OpGreaterEqualUint32x16:
		return rewriteValue_OpGreaterEqualUint32x16(v)
	case ssaop.OpGreaterEqualUint64x8:
		return rewriteValue_OpGreaterEqualUint64x8(v)
	case ssaop.OpGreaterEqualUint8x64:
		return rewriteValue_OpGreaterEqualUint8x64(v)
	case ssaop.OpGreaterFloat32x16:
		return rewriteValue_OpGreaterFloat32x16(v)
	case ssaop.OpGreaterFloat32x4:
		return rewriteValue_OpGreaterFloat32x4(v)
	case ssaop.OpGreaterFloat32x8:
		return rewriteValue_OpGreaterFloat32x8(v)
	case ssaop.OpGreaterFloat64x2:
		return rewriteValue_OpGreaterFloat64x2(v)
	case ssaop.OpGreaterFloat64x4:
		return rewriteValue_OpGreaterFloat64x4(v)
	case ssaop.OpGreaterFloat64x8:
		return rewriteValue_OpGreaterFloat64x8(v)
	case ssaop.OpGreaterInt16x16:
		v.Op = ssaop.OpAMD64VPCMPGTW256
		return true
	case ssaop.OpGreaterInt16x32:
		return rewriteValue_OpGreaterInt16x32(v)
	case ssaop.OpGreaterInt16x8:
		v.Op = ssaop.OpAMD64VPCMPGTW128
		return true
	case ssaop.OpGreaterInt32x16:
		return rewriteValue_OpGreaterInt32x16(v)
	case ssaop.OpGreaterInt32x4:
		v.Op = ssaop.OpAMD64VPCMPGTD128
		return true
	case ssaop.OpGreaterInt32x8:
		v.Op = ssaop.OpAMD64VPCMPGTD256
		return true
	case ssaop.OpGreaterInt64x2:
		v.Op = ssaop.OpAMD64VPCMPGTQ128
		return true
	case ssaop.OpGreaterInt64x4:
		v.Op = ssaop.OpAMD64VPCMPGTQ256
		return true
	case ssaop.OpGreaterInt64x8:
		return rewriteValue_OpGreaterInt64x8(v)
	case ssaop.OpGreaterInt8x16:
		v.Op = ssaop.OpAMD64VPCMPGTB128
		return true
	case ssaop.OpGreaterInt8x32:
		v.Op = ssaop.OpAMD64VPCMPGTB256
		return true
	case ssaop.OpGreaterInt8x64:
		return rewriteValue_OpGreaterInt8x64(v)
	case ssaop.OpGreaterUint16x32:
		return rewriteValue_OpGreaterUint16x32(v)
	case ssaop.OpGreaterUint32x16:
		return rewriteValue_OpGreaterUint32x16(v)
	case ssaop.OpGreaterUint64x8:
		return rewriteValue_OpGreaterUint64x8(v)
	case ssaop.OpGreaterUint8x64:
		return rewriteValue_OpGreaterUint8x64(v)
	case ssaop.OpHasCPUFeature:
		return rewriteValue_OpHasCPUFeature(v)
	case ssaop.OpHmul32:
		v.Op = ssaop.OpAMD64HMULL
		return true
	case ssaop.OpHmul32u:
		v.Op = ssaop.OpAMD64HMULLU
		return true
	case ssaop.OpHmul64:
		v.Op = ssaop.OpAMD64HMULQ
		return true
	case ssaop.OpHmul64u:
		v.Op = ssaop.OpAMD64HMULQU
		return true
	case ssaop.OpInterCall:
		v.Op = ssaop.OpAMD64CALLinter
		return true
	case ssaop.OpInterleaveHiGroupedInt16x16:
		v.Op = ssaop.OpAMD64VPUNPCKHWD256
		return true
	case ssaop.OpInterleaveHiGroupedInt16x32:
		v.Op = ssaop.OpAMD64VPUNPCKHWD512
		return true
	case ssaop.OpInterleaveHiGroupedInt32x16:
		v.Op = ssaop.OpAMD64VPUNPCKHDQ512
		return true
	case ssaop.OpInterleaveHiGroupedInt32x8:
		v.Op = ssaop.OpAMD64VPUNPCKHDQ256
		return true
	case ssaop.OpInterleaveHiGroupedInt64x4:
		v.Op = ssaop.OpAMD64VPUNPCKHQDQ256
		return true
	case ssaop.OpInterleaveHiGroupedInt64x8:
		v.Op = ssaop.OpAMD64VPUNPCKHQDQ512
		return true
	case ssaop.OpInterleaveHiGroupedInt8x32:
		v.Op = ssaop.OpAMD64VPUNPCKHBW256
		return true
	case ssaop.OpInterleaveHiGroupedInt8x64:
		v.Op = ssaop.OpAMD64VPUNPCKHBW512
		return true
	case ssaop.OpInterleaveHiGroupedUint16x16:
		v.Op = ssaop.OpAMD64VPUNPCKHWD256
		return true
	case ssaop.OpInterleaveHiGroupedUint16x32:
		v.Op = ssaop.OpAMD64VPUNPCKHWD512
		return true
	case ssaop.OpInterleaveHiGroupedUint32x16:
		v.Op = ssaop.OpAMD64VPUNPCKHDQ512
		return true
	case ssaop.OpInterleaveHiGroupedUint32x8:
		v.Op = ssaop.OpAMD64VPUNPCKHDQ256
		return true
	case ssaop.OpInterleaveHiGroupedUint64x4:
		v.Op = ssaop.OpAMD64VPUNPCKHQDQ256
		return true
	case ssaop.OpInterleaveHiGroupedUint64x8:
		v.Op = ssaop.OpAMD64VPUNPCKHQDQ512
		return true
	case ssaop.OpInterleaveHiGroupedUint8x32:
		v.Op = ssaop.OpAMD64VPUNPCKHBW256
		return true
	case ssaop.OpInterleaveHiGroupedUint8x64:
		v.Op = ssaop.OpAMD64VPUNPCKHBW512
		return true
	case ssaop.OpInterleaveHiInt16x8:
		v.Op = ssaop.OpAMD64VPUNPCKHWD128
		return true
	case ssaop.OpInterleaveHiInt32x4:
		v.Op = ssaop.OpAMD64VPUNPCKHDQ128
		return true
	case ssaop.OpInterleaveHiInt64x2:
		v.Op = ssaop.OpAMD64VPUNPCKHQDQ128
		return true
	case ssaop.OpInterleaveHiInt8x16:
		v.Op = ssaop.OpAMD64VPUNPCKHBW128
		return true
	case ssaop.OpInterleaveHiUint16x8:
		v.Op = ssaop.OpAMD64VPUNPCKHWD128
		return true
	case ssaop.OpInterleaveHiUint32x4:
		v.Op = ssaop.OpAMD64VPUNPCKHDQ128
		return true
	case ssaop.OpInterleaveHiUint64x2:
		v.Op = ssaop.OpAMD64VPUNPCKHQDQ128
		return true
	case ssaop.OpInterleaveHiUint8x16:
		v.Op = ssaop.OpAMD64VPUNPCKHBW128
		return true
	case ssaop.OpInterleaveLoGroupedInt16x16:
		v.Op = ssaop.OpAMD64VPUNPCKLWD256
		return true
	case ssaop.OpInterleaveLoGroupedInt16x32:
		v.Op = ssaop.OpAMD64VPUNPCKLWD512
		return true
	case ssaop.OpInterleaveLoGroupedInt32x16:
		v.Op = ssaop.OpAMD64VPUNPCKLDQ512
		return true
	case ssaop.OpInterleaveLoGroupedInt32x8:
		v.Op = ssaop.OpAMD64VPUNPCKLDQ256
		return true
	case ssaop.OpInterleaveLoGroupedInt64x4:
		v.Op = ssaop.OpAMD64VPUNPCKLQDQ256
		return true
	case ssaop.OpInterleaveLoGroupedInt64x8:
		v.Op = ssaop.OpAMD64VPUNPCKLQDQ512
		return true
	case ssaop.OpInterleaveLoGroupedInt8x32:
		v.Op = ssaop.OpAMD64VPUNPCKLBW256
		return true
	case ssaop.OpInterleaveLoGroupedInt8x64:
		v.Op = ssaop.OpAMD64VPUNPCKLBW512
		return true
	case ssaop.OpInterleaveLoGroupedUint16x16:
		v.Op = ssaop.OpAMD64VPUNPCKLWD256
		return true
	case ssaop.OpInterleaveLoGroupedUint16x32:
		v.Op = ssaop.OpAMD64VPUNPCKLWD512
		return true
	case ssaop.OpInterleaveLoGroupedUint32x16:
		v.Op = ssaop.OpAMD64VPUNPCKLDQ512
		return true
	case ssaop.OpInterleaveLoGroupedUint32x8:
		v.Op = ssaop.OpAMD64VPUNPCKLDQ256
		return true
	case ssaop.OpInterleaveLoGroupedUint64x4:
		v.Op = ssaop.OpAMD64VPUNPCKLQDQ256
		return true
	case ssaop.OpInterleaveLoGroupedUint64x8:
		v.Op = ssaop.OpAMD64VPUNPCKLQDQ512
		return true
	case ssaop.OpInterleaveLoGroupedUint8x32:
		v.Op = ssaop.OpAMD64VPUNPCKLBW256
		return true
	case ssaop.OpInterleaveLoGroupedUint8x64:
		v.Op = ssaop.OpAMD64VPUNPCKLBW512
		return true
	case ssaop.OpInterleaveLoInt16x8:
		v.Op = ssaop.OpAMD64VPUNPCKLWD128
		return true
	case ssaop.OpInterleaveLoInt32x4:
		v.Op = ssaop.OpAMD64VPUNPCKLDQ128
		return true
	case ssaop.OpInterleaveLoInt64x2:
		v.Op = ssaop.OpAMD64VPUNPCKLQDQ128
		return true
	case ssaop.OpInterleaveLoInt8x16:
		v.Op = ssaop.OpAMD64VPUNPCKLBW128
		return true
	case ssaop.OpInterleaveLoUint16x8:
		v.Op = ssaop.OpAMD64VPUNPCKLWD128
		return true
	case ssaop.OpInterleaveLoUint32x4:
		v.Op = ssaop.OpAMD64VPUNPCKLDQ128
		return true
	case ssaop.OpInterleaveLoUint64x2:
		v.Op = ssaop.OpAMD64VPUNPCKLQDQ128
		return true
	case ssaop.OpInterleaveLoUint8x16:
		v.Op = ssaop.OpAMD64VPUNPCKLBW128
		return true
	case ssaop.OpIsInBounds:
		return rewriteValue_OpIsInBounds(v)
	case ssaop.OpIsNaNFloat32x16:
		return rewriteValue_OpIsNaNFloat32x16(v)
	case ssaop.OpIsNaNFloat32x4:
		return rewriteValue_OpIsNaNFloat32x4(v)
	case ssaop.OpIsNaNFloat32x8:
		return rewriteValue_OpIsNaNFloat32x8(v)
	case ssaop.OpIsNaNFloat64x2:
		return rewriteValue_OpIsNaNFloat64x2(v)
	case ssaop.OpIsNaNFloat64x4:
		return rewriteValue_OpIsNaNFloat64x4(v)
	case ssaop.OpIsNaNFloat64x8:
		return rewriteValue_OpIsNaNFloat64x8(v)
	case ssaop.OpIsNonNil:
		return rewriteValue_OpIsNonNil(v)
	case ssaop.OpIsSliceInBounds:
		return rewriteValue_OpIsSliceInBounds(v)
	case ssaop.OpIsZeroVec:
		return rewriteValue_OpIsZeroVec(v)
	case ssaop.OpLeadingZerosInt32x16:
		v.Op = ssaop.OpAMD64VPLZCNTD512
		return true
	case ssaop.OpLeadingZerosInt32x4:
		v.Op = ssaop.OpAMD64VPLZCNTD128
		return true
	case ssaop.OpLeadingZerosInt32x8:
		v.Op = ssaop.OpAMD64VPLZCNTD256
		return true
	case ssaop.OpLeadingZerosInt64x2:
		v.Op = ssaop.OpAMD64VPLZCNTQ128
		return true
	case ssaop.OpLeadingZerosInt64x4:
		v.Op = ssaop.OpAMD64VPLZCNTQ256
		return true
	case ssaop.OpLeadingZerosInt64x8:
		v.Op = ssaop.OpAMD64VPLZCNTQ512
		return true
	case ssaop.OpLeadingZerosUint32x16:
		v.Op = ssaop.OpAMD64VPLZCNTD512
		return true
	case ssaop.OpLeadingZerosUint32x4:
		v.Op = ssaop.OpAMD64VPLZCNTD128
		return true
	case ssaop.OpLeadingZerosUint32x8:
		v.Op = ssaop.OpAMD64VPLZCNTD256
		return true
	case ssaop.OpLeadingZerosUint64x2:
		v.Op = ssaop.OpAMD64VPLZCNTQ128
		return true
	case ssaop.OpLeadingZerosUint64x4:
		v.Op = ssaop.OpAMD64VPLZCNTQ256
		return true
	case ssaop.OpLeadingZerosUint64x8:
		v.Op = ssaop.OpAMD64VPLZCNTQ512
		return true
	case ssaop.OpLeq16:
		return rewriteValue_OpLeq16(v)
	case ssaop.OpLeq16U:
		return rewriteValue_OpLeq16U(v)
	case ssaop.OpLeq32:
		return rewriteValue_OpLeq32(v)
	case ssaop.OpLeq32F:
		return rewriteValue_OpLeq32F(v)
	case ssaop.OpLeq32U:
		return rewriteValue_OpLeq32U(v)
	case ssaop.OpLeq64:
		return rewriteValue_OpLeq64(v)
	case ssaop.OpLeq64F:
		return rewriteValue_OpLeq64F(v)
	case ssaop.OpLeq64U:
		return rewriteValue_OpLeq64U(v)
	case ssaop.OpLeq8:
		return rewriteValue_OpLeq8(v)
	case ssaop.OpLeq8U:
		return rewriteValue_OpLeq8U(v)
	case ssaop.OpLess16:
		return rewriteValue_OpLess16(v)
	case ssaop.OpLess16U:
		return rewriteValue_OpLess16U(v)
	case ssaop.OpLess32:
		return rewriteValue_OpLess32(v)
	case ssaop.OpLess32F:
		return rewriteValue_OpLess32F(v)
	case ssaop.OpLess32U:
		return rewriteValue_OpLess32U(v)
	case ssaop.OpLess64:
		return rewriteValue_OpLess64(v)
	case ssaop.OpLess64F:
		return rewriteValue_OpLess64F(v)
	case ssaop.OpLess64U:
		return rewriteValue_OpLess64U(v)
	case ssaop.OpLess8:
		return rewriteValue_OpLess8(v)
	case ssaop.OpLess8U:
		return rewriteValue_OpLess8U(v)
	case ssaop.OpLessEqualFloat32x16:
		return rewriteValue_OpLessEqualFloat32x16(v)
	case ssaop.OpLessEqualFloat32x4:
		return rewriteValue_OpLessEqualFloat32x4(v)
	case ssaop.OpLessEqualFloat32x8:
		return rewriteValue_OpLessEqualFloat32x8(v)
	case ssaop.OpLessEqualFloat64x2:
		return rewriteValue_OpLessEqualFloat64x2(v)
	case ssaop.OpLessEqualFloat64x4:
		return rewriteValue_OpLessEqualFloat64x4(v)
	case ssaop.OpLessEqualFloat64x8:
		return rewriteValue_OpLessEqualFloat64x8(v)
	case ssaop.OpLessEqualInt16x32:
		return rewriteValue_OpLessEqualInt16x32(v)
	case ssaop.OpLessEqualInt32x16:
		return rewriteValue_OpLessEqualInt32x16(v)
	case ssaop.OpLessEqualInt64x8:
		return rewriteValue_OpLessEqualInt64x8(v)
	case ssaop.OpLessEqualInt8x64:
		return rewriteValue_OpLessEqualInt8x64(v)
	case ssaop.OpLessEqualUint16x32:
		return rewriteValue_OpLessEqualUint16x32(v)
	case ssaop.OpLessEqualUint32x16:
		return rewriteValue_OpLessEqualUint32x16(v)
	case ssaop.OpLessEqualUint64x8:
		return rewriteValue_OpLessEqualUint64x8(v)
	case ssaop.OpLessEqualUint8x64:
		return rewriteValue_OpLessEqualUint8x64(v)
	case ssaop.OpLessFloat32x16:
		return rewriteValue_OpLessFloat32x16(v)
	case ssaop.OpLessFloat32x4:
		return rewriteValue_OpLessFloat32x4(v)
	case ssaop.OpLessFloat32x8:
		return rewriteValue_OpLessFloat32x8(v)
	case ssaop.OpLessFloat64x2:
		return rewriteValue_OpLessFloat64x2(v)
	case ssaop.OpLessFloat64x4:
		return rewriteValue_OpLessFloat64x4(v)
	case ssaop.OpLessFloat64x8:
		return rewriteValue_OpLessFloat64x8(v)
	case ssaop.OpLessInt16x32:
		return rewriteValue_OpLessInt16x32(v)
	case ssaop.OpLessInt32x16:
		return rewriteValue_OpLessInt32x16(v)
	case ssaop.OpLessInt64x8:
		return rewriteValue_OpLessInt64x8(v)
	case ssaop.OpLessInt8x64:
		return rewriteValue_OpLessInt8x64(v)
	case ssaop.OpLessUint16x32:
		return rewriteValue_OpLessUint16x32(v)
	case ssaop.OpLessUint32x16:
		return rewriteValue_OpLessUint32x16(v)
	case ssaop.OpLessUint64x8:
		return rewriteValue_OpLessUint64x8(v)
	case ssaop.OpLessUint8x64:
		return rewriteValue_OpLessUint8x64(v)
	case ssaop.OpLoad:
		return rewriteValue_OpLoad(v)
	case ssaop.OpLoadMasked16:
		return rewriteValue_OpLoadMasked16(v)
	case ssaop.OpLoadMasked32:
		return rewriteValue_OpLoadMasked32(v)
	case ssaop.OpLoadMasked64:
		return rewriteValue_OpLoadMasked64(v)
	case ssaop.OpLoadMasked8:
		return rewriteValue_OpLoadMasked8(v)
	case ssaop.OpLocalAddr:
		return rewriteValue_OpLocalAddr(v)
	case ssaop.OpLsh16x16:
		return rewriteValue_OpLsh16x16(v)
	case ssaop.OpLsh16x32:
		return rewriteValue_OpLsh16x32(v)
	case ssaop.OpLsh16x64:
		return rewriteValue_OpLsh16x64(v)
	case ssaop.OpLsh16x8:
		return rewriteValue_OpLsh16x8(v)
	case ssaop.OpLsh32x16:
		return rewriteValue_OpLsh32x16(v)
	case ssaop.OpLsh32x32:
		return rewriteValue_OpLsh32x32(v)
	case ssaop.OpLsh32x64:
		return rewriteValue_OpLsh32x64(v)
	case ssaop.OpLsh32x8:
		return rewriteValue_OpLsh32x8(v)
	case ssaop.OpLsh64x16:
		return rewriteValue_OpLsh64x16(v)
	case ssaop.OpLsh64x32:
		return rewriteValue_OpLsh64x32(v)
	case ssaop.OpLsh64x64:
		return rewriteValue_OpLsh64x64(v)
	case ssaop.OpLsh64x8:
		return rewriteValue_OpLsh64x8(v)
	case ssaop.OpLsh8x16:
		return rewriteValue_OpLsh8x16(v)
	case ssaop.OpLsh8x32:
		return rewriteValue_OpLsh8x32(v)
	case ssaop.OpLsh8x64:
		return rewriteValue_OpLsh8x64(v)
	case ssaop.OpLsh8x8:
		return rewriteValue_OpLsh8x8(v)
	case ssaop.OpMax32F:
		return rewriteValue_OpMax32F(v)
	case ssaop.OpMax32FSel:
		v.Op = ssaop.OpAMD64MAXSS
		return true
	case ssaop.OpMax64F:
		return rewriteValue_OpMax64F(v)
	case ssaop.OpMax64FSel:
		v.Op = ssaop.OpAMD64MAXSD
		return true
	case ssaop.OpMaxFloat32x16:
		v.Op = ssaop.OpAMD64VMAXPS512
		return true
	case ssaop.OpMaxFloat32x4:
		v.Op = ssaop.OpAMD64VMAXPS128
		return true
	case ssaop.OpMaxFloat32x8:
		v.Op = ssaop.OpAMD64VMAXPS256
		return true
	case ssaop.OpMaxFloat64x2:
		v.Op = ssaop.OpAMD64VMAXPD128
		return true
	case ssaop.OpMaxFloat64x4:
		v.Op = ssaop.OpAMD64VMAXPD256
		return true
	case ssaop.OpMaxFloat64x8:
		v.Op = ssaop.OpAMD64VMAXPD512
		return true
	case ssaop.OpMaxInt16x16:
		v.Op = ssaop.OpAMD64VPMAXSW256
		return true
	case ssaop.OpMaxInt16x32:
		v.Op = ssaop.OpAMD64VPMAXSW512
		return true
	case ssaop.OpMaxInt16x8:
		v.Op = ssaop.OpAMD64VPMAXSW128
		return true
	case ssaop.OpMaxInt32x16:
		v.Op = ssaop.OpAMD64VPMAXSD512
		return true
	case ssaop.OpMaxInt32x4:
		v.Op = ssaop.OpAMD64VPMAXSD128
		return true
	case ssaop.OpMaxInt32x8:
		v.Op = ssaop.OpAMD64VPMAXSD256
		return true
	case ssaop.OpMaxInt64x2:
		v.Op = ssaop.OpAMD64VPMAXSQ128
		return true
	case ssaop.OpMaxInt64x4:
		v.Op = ssaop.OpAMD64VPMAXSQ256
		return true
	case ssaop.OpMaxInt64x8:
		v.Op = ssaop.OpAMD64VPMAXSQ512
		return true
	case ssaop.OpMaxInt8x16:
		v.Op = ssaop.OpAMD64VPMAXSB128
		return true
	case ssaop.OpMaxInt8x32:
		v.Op = ssaop.OpAMD64VPMAXSB256
		return true
	case ssaop.OpMaxInt8x64:
		v.Op = ssaop.OpAMD64VPMAXSB512
		return true
	case ssaop.OpMaxUint16x16:
		v.Op = ssaop.OpAMD64VPMAXUW256
		return true
	case ssaop.OpMaxUint16x32:
		v.Op = ssaop.OpAMD64VPMAXUW512
		return true
	case ssaop.OpMaxUint16x8:
		v.Op = ssaop.OpAMD64VPMAXUW128
		return true
	case ssaop.OpMaxUint32x16:
		v.Op = ssaop.OpAMD64VPMAXUD512
		return true
	case ssaop.OpMaxUint32x4:
		v.Op = ssaop.OpAMD64VPMAXUD128
		return true
	case ssaop.OpMaxUint32x8:
		v.Op = ssaop.OpAMD64VPMAXUD256
		return true
	case ssaop.OpMaxUint64x2:
		v.Op = ssaop.OpAMD64VPMAXUQ128
		return true
	case ssaop.OpMaxUint64x4:
		v.Op = ssaop.OpAMD64VPMAXUQ256
		return true
	case ssaop.OpMaxUint64x8:
		v.Op = ssaop.OpAMD64VPMAXUQ512
		return true
	case ssaop.OpMaxUint8x16:
		v.Op = ssaop.OpAMD64VPMAXUB128
		return true
	case ssaop.OpMaxUint8x32:
		v.Op = ssaop.OpAMD64VPMAXUB256
		return true
	case ssaop.OpMaxUint8x64:
		v.Op = ssaop.OpAMD64VPMAXUB512
		return true
	case ssaop.OpMin32F:
		return rewriteValue_OpMin32F(v)
	case ssaop.OpMin32FSel:
		v.Op = ssaop.OpAMD64MINSS
		return true
	case ssaop.OpMin64F:
		return rewriteValue_OpMin64F(v)
	case ssaop.OpMin64FSel:
		v.Op = ssaop.OpAMD64MINSD
		return true
	case ssaop.OpMinFloat32x16:
		v.Op = ssaop.OpAMD64VMINPS512
		return true
	case ssaop.OpMinFloat32x4:
		v.Op = ssaop.OpAMD64VMINPS128
		return true
	case ssaop.OpMinFloat32x8:
		v.Op = ssaop.OpAMD64VMINPS256
		return true
	case ssaop.OpMinFloat64x2:
		v.Op = ssaop.OpAMD64VMINPD128
		return true
	case ssaop.OpMinFloat64x4:
		v.Op = ssaop.OpAMD64VMINPD256
		return true
	case ssaop.OpMinFloat64x8:
		v.Op = ssaop.OpAMD64VMINPD512
		return true
	case ssaop.OpMinInt16x16:
		v.Op = ssaop.OpAMD64VPMINSW256
		return true
	case ssaop.OpMinInt16x32:
		v.Op = ssaop.OpAMD64VPMINSW512
		return true
	case ssaop.OpMinInt16x8:
		v.Op = ssaop.OpAMD64VPMINSW128
		return true
	case ssaop.OpMinInt32x16:
		v.Op = ssaop.OpAMD64VPMINSD512
		return true
	case ssaop.OpMinInt32x4:
		v.Op = ssaop.OpAMD64VPMINSD128
		return true
	case ssaop.OpMinInt32x8:
		v.Op = ssaop.OpAMD64VPMINSD256
		return true
	case ssaop.OpMinInt64x2:
		v.Op = ssaop.OpAMD64VPMINSQ128
		return true
	case ssaop.OpMinInt64x4:
		v.Op = ssaop.OpAMD64VPMINSQ256
		return true
	case ssaop.OpMinInt64x8:
		v.Op = ssaop.OpAMD64VPMINSQ512
		return true
	case ssaop.OpMinInt8x16:
		v.Op = ssaop.OpAMD64VPMINSB128
		return true
	case ssaop.OpMinInt8x32:
		v.Op = ssaop.OpAMD64VPMINSB256
		return true
	case ssaop.OpMinInt8x64:
		v.Op = ssaop.OpAMD64VPMINSB512
		return true
	case ssaop.OpMinUint16x16:
		v.Op = ssaop.OpAMD64VPMINUW256
		return true
	case ssaop.OpMinUint16x32:
		v.Op = ssaop.OpAMD64VPMINUW512
		return true
	case ssaop.OpMinUint16x8:
		v.Op = ssaop.OpAMD64VPMINUW128
		return true
	case ssaop.OpMinUint32x16:
		v.Op = ssaop.OpAMD64VPMINUD512
		return true
	case ssaop.OpMinUint32x4:
		v.Op = ssaop.OpAMD64VPMINUD128
		return true
	case ssaop.OpMinUint32x8:
		v.Op = ssaop.OpAMD64VPMINUD256
		return true
	case ssaop.OpMinUint64x2:
		v.Op = ssaop.OpAMD64VPMINUQ128
		return true
	case ssaop.OpMinUint64x4:
		v.Op = ssaop.OpAMD64VPMINUQ256
		return true
	case ssaop.OpMinUint64x8:
		v.Op = ssaop.OpAMD64VPMINUQ512
		return true
	case ssaop.OpMinUint8x16:
		v.Op = ssaop.OpAMD64VPMINUB128
		return true
	case ssaop.OpMinUint8x32:
		v.Op = ssaop.OpAMD64VPMINUB256
		return true
	case ssaop.OpMinUint8x64:
		v.Op = ssaop.OpAMD64VPMINUB512
		return true
	case ssaop.OpMod16:
		return rewriteValue_OpMod16(v)
	case ssaop.OpMod16u:
		return rewriteValue_OpMod16u(v)
	case ssaop.OpMod32:
		return rewriteValue_OpMod32(v)
	case ssaop.OpMod32u:
		return rewriteValue_OpMod32u(v)
	case ssaop.OpMod64:
		return rewriteValue_OpMod64(v)
	case ssaop.OpMod64u:
		return rewriteValue_OpMod64u(v)
	case ssaop.OpMod8:
		return rewriteValue_OpMod8(v)
	case ssaop.OpMod8u:
		return rewriteValue_OpMod8u(v)
	case ssaop.OpMove:
		return rewriteValue_OpMove(v)
	case ssaop.OpMul16:
		v.Op = ssaop.OpAMD64MULL
		return true
	case ssaop.OpMul32:
		v.Op = ssaop.OpAMD64MULL
		return true
	case ssaop.OpMul32F:
		v.Op = ssaop.OpAMD64MULSS
		return true
	case ssaop.OpMul64:
		v.Op = ssaop.OpAMD64MULQ
		return true
	case ssaop.OpMul64F:
		v.Op = ssaop.OpAMD64MULSD
		return true
	case ssaop.OpMul64uhilo:
		return rewriteValue_OpMul64uhilo(v)
	case ssaop.OpMul8:
		v.Op = ssaop.OpAMD64MULL
		return true
	case ssaop.OpMulAddEvenSubOddFloat32x16:
		v.Op = ssaop.OpAMD64VFMADDSUB213PS512
		return true
	case ssaop.OpMulAddEvenSubOddFloat32x4:
		v.Op = ssaop.OpAMD64VFMADDSUB213PS128
		return true
	case ssaop.OpMulAddEvenSubOddFloat32x8:
		v.Op = ssaop.OpAMD64VFMADDSUB213PS256
		return true
	case ssaop.OpMulAddEvenSubOddFloat64x2:
		v.Op = ssaop.OpAMD64VFMADDSUB213PD128
		return true
	case ssaop.OpMulAddEvenSubOddFloat64x4:
		v.Op = ssaop.OpAMD64VFMADDSUB213PD256
		return true
	case ssaop.OpMulAddEvenSubOddFloat64x8:
		v.Op = ssaop.OpAMD64VFMADDSUB213PD512
		return true
	case ssaop.OpMulAddFloat32x16:
		v.Op = ssaop.OpAMD64VFMADD213PS512
		return true
	case ssaop.OpMulAddFloat32x4:
		v.Op = ssaop.OpAMD64VFMADD213PS128
		return true
	case ssaop.OpMulAddFloat32x8:
		v.Op = ssaop.OpAMD64VFMADD213PS256
		return true
	case ssaop.OpMulAddFloat64x2:
		v.Op = ssaop.OpAMD64VFMADD213PD128
		return true
	case ssaop.OpMulAddFloat64x4:
		v.Op = ssaop.OpAMD64VFMADD213PD256
		return true
	case ssaop.OpMulAddFloat64x8:
		v.Op = ssaop.OpAMD64VFMADD213PD512
		return true
	case ssaop.OpMulAddOddSubEvenFloat32x16:
		v.Op = ssaop.OpAMD64VFMSUBADD213PS512
		return true
	case ssaop.OpMulAddOddSubEvenFloat32x4:
		v.Op = ssaop.OpAMD64VFMSUBADD213PS128
		return true
	case ssaop.OpMulAddOddSubEvenFloat32x8:
		v.Op = ssaop.OpAMD64VFMSUBADD213PS256
		return true
	case ssaop.OpMulAddOddSubEvenFloat64x2:
		v.Op = ssaop.OpAMD64VFMSUBADD213PD128
		return true
	case ssaop.OpMulAddOddSubEvenFloat64x4:
		v.Op = ssaop.OpAMD64VFMSUBADD213PD256
		return true
	case ssaop.OpMulAddOddSubEvenFloat64x8:
		v.Op = ssaop.OpAMD64VFMSUBADD213PD512
		return true
	case ssaop.OpMulFloat32x16:
		v.Op = ssaop.OpAMD64VMULPS512
		return true
	case ssaop.OpMulFloat32x4:
		v.Op = ssaop.OpAMD64VMULPS128
		return true
	case ssaop.OpMulFloat32x8:
		v.Op = ssaop.OpAMD64VMULPS256
		return true
	case ssaop.OpMulFloat64x2:
		v.Op = ssaop.OpAMD64VMULPD128
		return true
	case ssaop.OpMulFloat64x4:
		v.Op = ssaop.OpAMD64VMULPD256
		return true
	case ssaop.OpMulFloat64x8:
		v.Op = ssaop.OpAMD64VMULPD512
		return true
	case ssaop.OpMulHighInt16x16:
		v.Op = ssaop.OpAMD64VPMULHW256
		return true
	case ssaop.OpMulHighInt16x32:
		v.Op = ssaop.OpAMD64VPMULHW512
		return true
	case ssaop.OpMulHighInt16x8:
		v.Op = ssaop.OpAMD64VPMULHW128
		return true
	case ssaop.OpMulHighUint16x16:
		v.Op = ssaop.OpAMD64VPMULHUW256
		return true
	case ssaop.OpMulHighUint16x32:
		v.Op = ssaop.OpAMD64VPMULHUW512
		return true
	case ssaop.OpMulHighUint16x8:
		v.Op = ssaop.OpAMD64VPMULHUW128
		return true
	case ssaop.OpMulInt16x16:
		v.Op = ssaop.OpAMD64VPMULLW256
		return true
	case ssaop.OpMulInt16x32:
		v.Op = ssaop.OpAMD64VPMULLW512
		return true
	case ssaop.OpMulInt16x8:
		v.Op = ssaop.OpAMD64VPMULLW128
		return true
	case ssaop.OpMulInt32x16:
		v.Op = ssaop.OpAMD64VPMULLD512
		return true
	case ssaop.OpMulInt32x4:
		v.Op = ssaop.OpAMD64VPMULLD128
		return true
	case ssaop.OpMulInt32x8:
		v.Op = ssaop.OpAMD64VPMULLD256
		return true
	case ssaop.OpMulInt64x2:
		v.Op = ssaop.OpAMD64VPMULLQ128
		return true
	case ssaop.OpMulInt64x4:
		v.Op = ssaop.OpAMD64VPMULLQ256
		return true
	case ssaop.OpMulInt64x8:
		v.Op = ssaop.OpAMD64VPMULLQ512
		return true
	case ssaop.OpMulSignInt16x16:
		v.Op = ssaop.OpAMD64VPSIGNW256
		return true
	case ssaop.OpMulSignInt16x8:
		v.Op = ssaop.OpAMD64VPSIGNW128
		return true
	case ssaop.OpMulSignInt32x4:
		v.Op = ssaop.OpAMD64VPSIGND128
		return true
	case ssaop.OpMulSignInt32x8:
		v.Op = ssaop.OpAMD64VPSIGND256
		return true
	case ssaop.OpMulSignInt8x16:
		v.Op = ssaop.OpAMD64VPSIGNB128
		return true
	case ssaop.OpMulSignInt8x32:
		v.Op = ssaop.OpAMD64VPSIGNB256
		return true
	case ssaop.OpMulUint16x16:
		v.Op = ssaop.OpAMD64VPMULLW256
		return true
	case ssaop.OpMulUint16x32:
		v.Op = ssaop.OpAMD64VPMULLW512
		return true
	case ssaop.OpMulUint16x8:
		v.Op = ssaop.OpAMD64VPMULLW128
		return true
	case ssaop.OpMulUint32x16:
		v.Op = ssaop.OpAMD64VPMULLD512
		return true
	case ssaop.OpMulUint32x4:
		v.Op = ssaop.OpAMD64VPMULLD128
		return true
	case ssaop.OpMulUint32x8:
		v.Op = ssaop.OpAMD64VPMULLD256
		return true
	case ssaop.OpMulUint64x2:
		v.Op = ssaop.OpAMD64VPMULLQ128
		return true
	case ssaop.OpMulUint64x4:
		v.Op = ssaop.OpAMD64VPMULLQ256
		return true
	case ssaop.OpMulUint64x8:
		v.Op = ssaop.OpAMD64VPMULLQ512
		return true
	case ssaop.OpMulWidenEvenInt32x4:
		v.Op = ssaop.OpAMD64VPMULDQ128
		return true
	case ssaop.OpMulWidenEvenInt32x8:
		v.Op = ssaop.OpAMD64VPMULDQ256
		return true
	case ssaop.OpMulWidenEvenUint32x4:
		v.Op = ssaop.OpAMD64VPMULUDQ128
		return true
	case ssaop.OpMulWidenEvenUint32x8:
		v.Op = ssaop.OpAMD64VPMULUDQ256
		return true
	case ssaop.OpNeg16:
		v.Op = ssaop.OpAMD64NEGL
		return true
	case ssaop.OpNeg32:
		v.Op = ssaop.OpAMD64NEGL
		return true
	case ssaop.OpNeg32F:
		return rewriteValue_OpNeg32F(v)
	case ssaop.OpNeg64:
		v.Op = ssaop.OpAMD64NEGQ
		return true
	case ssaop.OpNeg64F:
		return rewriteValue_OpNeg64F(v)
	case ssaop.OpNeg8:
		v.Op = ssaop.OpAMD64NEGL
		return true
	case ssaop.OpNeq16:
		return rewriteValue_OpNeq16(v)
	case ssaop.OpNeq32:
		return rewriteValue_OpNeq32(v)
	case ssaop.OpNeq32F:
		return rewriteValue_OpNeq32F(v)
	case ssaop.OpNeq64:
		return rewriteValue_OpNeq64(v)
	case ssaop.OpNeq64F:
		return rewriteValue_OpNeq64F(v)
	case ssaop.OpNeq8:
		return rewriteValue_OpNeq8(v)
	case ssaop.OpNeqB:
		return rewriteValue_OpNeqB(v)
	case ssaop.OpNeqPtr:
		return rewriteValue_OpNeqPtr(v)
	case ssaop.OpNilCheck:
		v.Op = ssaop.OpAMD64LoweredNilCheck
		return true
	case ssaop.OpNot:
		return rewriteValue_OpNot(v)
	case ssaop.OpNotEqualFloat32x16:
		return rewriteValue_OpNotEqualFloat32x16(v)
	case ssaop.OpNotEqualFloat32x4:
		return rewriteValue_OpNotEqualFloat32x4(v)
	case ssaop.OpNotEqualFloat32x8:
		return rewriteValue_OpNotEqualFloat32x8(v)
	case ssaop.OpNotEqualFloat64x2:
		return rewriteValue_OpNotEqualFloat64x2(v)
	case ssaop.OpNotEqualFloat64x4:
		return rewriteValue_OpNotEqualFloat64x4(v)
	case ssaop.OpNotEqualFloat64x8:
		return rewriteValue_OpNotEqualFloat64x8(v)
	case ssaop.OpNotEqualInt16x32:
		return rewriteValue_OpNotEqualInt16x32(v)
	case ssaop.OpNotEqualInt32x16:
		return rewriteValue_OpNotEqualInt32x16(v)
	case ssaop.OpNotEqualInt64x8:
		return rewriteValue_OpNotEqualInt64x8(v)
	case ssaop.OpNotEqualInt8x64:
		return rewriteValue_OpNotEqualInt8x64(v)
	case ssaop.OpNotEqualUint16x32:
		return rewriteValue_OpNotEqualUint16x32(v)
	case ssaop.OpNotEqualUint32x16:
		return rewriteValue_OpNotEqualUint32x16(v)
	case ssaop.OpNotEqualUint64x8:
		return rewriteValue_OpNotEqualUint64x8(v)
	case ssaop.OpNotEqualUint8x64:
		return rewriteValue_OpNotEqualUint8x64(v)
	case ssaop.OpOffPtr:
		return rewriteValue_OpOffPtr(v)
	case ssaop.OpOnesCountInt16x16:
		v.Op = ssaop.OpAMD64VPOPCNTW256
		return true
	case ssaop.OpOnesCountInt16x32:
		v.Op = ssaop.OpAMD64VPOPCNTW512
		return true
	case ssaop.OpOnesCountInt16x8:
		v.Op = ssaop.OpAMD64VPOPCNTW128
		return true
	case ssaop.OpOnesCountInt32x16:
		v.Op = ssaop.OpAMD64VPOPCNTD512
		return true
	case ssaop.OpOnesCountInt32x4:
		v.Op = ssaop.OpAMD64VPOPCNTD128
		return true
	case ssaop.OpOnesCountInt32x8:
		v.Op = ssaop.OpAMD64VPOPCNTD256
		return true
	case ssaop.OpOnesCountInt64x2:
		v.Op = ssaop.OpAMD64VPOPCNTQ128
		return true
	case ssaop.OpOnesCountInt64x4:
		v.Op = ssaop.OpAMD64VPOPCNTQ256
		return true
	case ssaop.OpOnesCountInt64x8:
		v.Op = ssaop.OpAMD64VPOPCNTQ512
		return true
	case ssaop.OpOnesCountInt8x16:
		v.Op = ssaop.OpAMD64VPOPCNTB128
		return true
	case ssaop.OpOnesCountInt8x32:
		v.Op = ssaop.OpAMD64VPOPCNTB256
		return true
	case ssaop.OpOnesCountInt8x64:
		v.Op = ssaop.OpAMD64VPOPCNTB512
		return true
	case ssaop.OpOnesCountUint16x16:
		v.Op = ssaop.OpAMD64VPOPCNTW256
		return true
	case ssaop.OpOnesCountUint16x32:
		v.Op = ssaop.OpAMD64VPOPCNTW512
		return true
	case ssaop.OpOnesCountUint16x8:
		v.Op = ssaop.OpAMD64VPOPCNTW128
		return true
	case ssaop.OpOnesCountUint32x16:
		v.Op = ssaop.OpAMD64VPOPCNTD512
		return true
	case ssaop.OpOnesCountUint32x4:
		v.Op = ssaop.OpAMD64VPOPCNTD128
		return true
	case ssaop.OpOnesCountUint32x8:
		v.Op = ssaop.OpAMD64VPOPCNTD256
		return true
	case ssaop.OpOnesCountUint64x2:
		v.Op = ssaop.OpAMD64VPOPCNTQ128
		return true
	case ssaop.OpOnesCountUint64x4:
		v.Op = ssaop.OpAMD64VPOPCNTQ256
		return true
	case ssaop.OpOnesCountUint64x8:
		v.Op = ssaop.OpAMD64VPOPCNTQ512
		return true
	case ssaop.OpOnesCountUint8x16:
		v.Op = ssaop.OpAMD64VPOPCNTB128
		return true
	case ssaop.OpOnesCountUint8x32:
		v.Op = ssaop.OpAMD64VPOPCNTB256
		return true
	case ssaop.OpOnesCountUint8x64:
		v.Op = ssaop.OpAMD64VPOPCNTB512
		return true
	case ssaop.OpOr16:
		v.Op = ssaop.OpAMD64ORL
		return true
	case ssaop.OpOr32:
		v.Op = ssaop.OpAMD64ORL
		return true
	case ssaop.OpOr64:
		v.Op = ssaop.OpAMD64ORQ
		return true
	case ssaop.OpOr8:
		v.Op = ssaop.OpAMD64ORL
		return true
	case ssaop.OpOrB:
		v.Op = ssaop.OpAMD64ORL
		return true
	case ssaop.OpOrInt16x16:
		v.Op = ssaop.OpAMD64VPOR256
		return true
	case ssaop.OpOrInt16x32:
		v.Op = ssaop.OpAMD64VPORD512
		return true
	case ssaop.OpOrInt16x8:
		v.Op = ssaop.OpAMD64VPOR128
		return true
	case ssaop.OpOrInt32x16:
		v.Op = ssaop.OpAMD64VPORD512
		return true
	case ssaop.OpOrInt32x4:
		v.Op = ssaop.OpAMD64VPOR128
		return true
	case ssaop.OpOrInt32x8:
		v.Op = ssaop.OpAMD64VPOR256
		return true
	case ssaop.OpOrInt64x2:
		v.Op = ssaop.OpAMD64VPOR128
		return true
	case ssaop.OpOrInt64x4:
		v.Op = ssaop.OpAMD64VPOR256
		return true
	case ssaop.OpOrInt64x8:
		v.Op = ssaop.OpAMD64VPORQ512
		return true
	case ssaop.OpOrInt8x16:
		v.Op = ssaop.OpAMD64VPOR128
		return true
	case ssaop.OpOrInt8x32:
		v.Op = ssaop.OpAMD64VPOR256
		return true
	case ssaop.OpOrInt8x64:
		v.Op = ssaop.OpAMD64VPORD512
		return true
	case ssaop.OpOrUint16x16:
		v.Op = ssaop.OpAMD64VPOR256
		return true
	case ssaop.OpOrUint16x32:
		v.Op = ssaop.OpAMD64VPORD512
		return true
	case ssaop.OpOrUint16x8:
		v.Op = ssaop.OpAMD64VPOR128
		return true
	case ssaop.OpOrUint32x16:
		v.Op = ssaop.OpAMD64VPORD512
		return true
	case ssaop.OpOrUint32x4:
		v.Op = ssaop.OpAMD64VPOR128
		return true
	case ssaop.OpOrUint32x8:
		v.Op = ssaop.OpAMD64VPOR256
		return true
	case ssaop.OpOrUint64x2:
		v.Op = ssaop.OpAMD64VPOR128
		return true
	case ssaop.OpOrUint64x4:
		v.Op = ssaop.OpAMD64VPOR256
		return true
	case ssaop.OpOrUint64x8:
		v.Op = ssaop.OpAMD64VPORQ512
		return true
	case ssaop.OpOrUint8x16:
		v.Op = ssaop.OpAMD64VPOR128
		return true
	case ssaop.OpOrUint8x32:
		v.Op = ssaop.OpAMD64VPOR256
		return true
	case ssaop.OpOrUint8x64:
		v.Op = ssaop.OpAMD64VPORD512
		return true
	case ssaop.OpPanicBounds:
		v.Op = ssaop.OpAMD64LoweredPanicBoundsRR
		return true
	case ssaop.OpPermuteFloat32x16:
		v.Op = ssaop.OpAMD64VPERMPS512
		return true
	case ssaop.OpPermuteFloat32x8:
		v.Op = ssaop.OpAMD64VPERMPS256
		return true
	case ssaop.OpPermuteFloat64x4:
		v.Op = ssaop.OpAMD64VPERMPD256
		return true
	case ssaop.OpPermuteFloat64x8:
		v.Op = ssaop.OpAMD64VPERMPD512
		return true
	case ssaop.OpPermuteInt16x16:
		v.Op = ssaop.OpAMD64VPERMW256
		return true
	case ssaop.OpPermuteInt16x32:
		v.Op = ssaop.OpAMD64VPERMW512
		return true
	case ssaop.OpPermuteInt16x8:
		v.Op = ssaop.OpAMD64VPERMW128
		return true
	case ssaop.OpPermuteInt32x16:
		v.Op = ssaop.OpAMD64VPERMD512
		return true
	case ssaop.OpPermuteInt32x8:
		v.Op = ssaop.OpAMD64VPERMD256
		return true
	case ssaop.OpPermuteInt64x4:
		v.Op = ssaop.OpAMD64VPERMQ256
		return true
	case ssaop.OpPermuteInt64x8:
		v.Op = ssaop.OpAMD64VPERMQ512
		return true
	case ssaop.OpPermuteInt8x16:
		v.Op = ssaop.OpAMD64VPERMB128
		return true
	case ssaop.OpPermuteInt8x32:
		v.Op = ssaop.OpAMD64VPERMB256
		return true
	case ssaop.OpPermuteInt8x64:
		v.Op = ssaop.OpAMD64VPERMB512
		return true
	case ssaop.OpPermuteOrZeroGroupedInt8x32:
		v.Op = ssaop.OpAMD64VPSHUFB256
		return true
	case ssaop.OpPermuteOrZeroGroupedInt8x64:
		v.Op = ssaop.OpAMD64VPSHUFB512
		return true
	case ssaop.OpPermuteOrZeroGroupedUint8x32:
		v.Op = ssaop.OpAMD64VPSHUFB256
		return true
	case ssaop.OpPermuteOrZeroGroupedUint8x64:
		v.Op = ssaop.OpAMD64VPSHUFB512
		return true
	case ssaop.OpPermuteOrZeroInt8x16:
		v.Op = ssaop.OpAMD64VPSHUFB128
		return true
	case ssaop.OpPermuteOrZeroUint8x16:
		v.Op = ssaop.OpAMD64VPSHUFB128
		return true
	case ssaop.OpPermuteUint16x16:
		v.Op = ssaop.OpAMD64VPERMW256
		return true
	case ssaop.OpPermuteUint16x32:
		v.Op = ssaop.OpAMD64VPERMW512
		return true
	case ssaop.OpPermuteUint16x8:
		v.Op = ssaop.OpAMD64VPERMW128
		return true
	case ssaop.OpPermuteUint32x16:
		v.Op = ssaop.OpAMD64VPERMD512
		return true
	case ssaop.OpPermuteUint32x8:
		v.Op = ssaop.OpAMD64VPERMD256
		return true
	case ssaop.OpPermuteUint64x4:
		v.Op = ssaop.OpAMD64VPERMQ256
		return true
	case ssaop.OpPermuteUint64x8:
		v.Op = ssaop.OpAMD64VPERMQ512
		return true
	case ssaop.OpPermuteUint8x16:
		v.Op = ssaop.OpAMD64VPERMB128
		return true
	case ssaop.OpPermuteUint8x32:
		v.Op = ssaop.OpAMD64VPERMB256
		return true
	case ssaop.OpPermuteUint8x64:
		v.Op = ssaop.OpAMD64VPERMB512
		return true
	case ssaop.OpPopCount16:
		return rewriteValue_OpPopCount16(v)
	case ssaop.OpPopCount32:
		v.Op = ssaop.OpAMD64POPCNTL
		return true
	case ssaop.OpPopCount64:
		v.Op = ssaop.OpAMD64POPCNTQ
		return true
	case ssaop.OpPopCount8:
		return rewriteValue_OpPopCount8(v)
	case ssaop.OpPrefetchCache:
		v.Op = ssaop.OpAMD64PrefetchT0
		return true
	case ssaop.OpPrefetchCacheStreamed:
		v.Op = ssaop.OpAMD64PrefetchNTA
		return true
	case ssaop.OpReciprocalFloat32x16:
		v.Op = ssaop.OpAMD64VRCP14PS512
		return true
	case ssaop.OpReciprocalFloat32x4:
		v.Op = ssaop.OpAMD64VRCPPS128
		return true
	case ssaop.OpReciprocalFloat32x8:
		v.Op = ssaop.OpAMD64VRCPPS256
		return true
	case ssaop.OpReciprocalFloat64x2:
		v.Op = ssaop.OpAMD64VRCP14PD128
		return true
	case ssaop.OpReciprocalFloat64x4:
		v.Op = ssaop.OpAMD64VRCP14PD256
		return true
	case ssaop.OpReciprocalFloat64x8:
		v.Op = ssaop.OpAMD64VRCP14PD512
		return true
	case ssaop.OpReciprocalSqrtFloat32x16:
		v.Op = ssaop.OpAMD64VRSQRT14PS512
		return true
	case ssaop.OpReciprocalSqrtFloat32x4:
		v.Op = ssaop.OpAMD64VRSQRTPS128
		return true
	case ssaop.OpReciprocalSqrtFloat32x8:
		v.Op = ssaop.OpAMD64VRSQRTPS256
		return true
	case ssaop.OpReciprocalSqrtFloat64x2:
		v.Op = ssaop.OpAMD64VRSQRT14PD128
		return true
	case ssaop.OpReciprocalSqrtFloat64x4:
		v.Op = ssaop.OpAMD64VRSQRT14PD256
		return true
	case ssaop.OpReciprocalSqrtFloat64x8:
		v.Op = ssaop.OpAMD64VRSQRT14PD512
		return true
	case ssaop.OpRotateLeft16:
		v.Op = ssaop.OpAMD64ROLW
		return true
	case ssaop.OpRotateLeft32:
		v.Op = ssaop.OpAMD64ROLL
		return true
	case ssaop.OpRotateLeft64:
		v.Op = ssaop.OpAMD64ROLQ
		return true
	case ssaop.OpRotateLeft8:
		v.Op = ssaop.OpAMD64ROLB
		return true
	case ssaop.OpRotateLeftInt32x16:
		v.Op = ssaop.OpAMD64VPROLVD512
		return true
	case ssaop.OpRotateLeftInt32x4:
		v.Op = ssaop.OpAMD64VPROLVD128
		return true
	case ssaop.OpRotateLeftInt32x8:
		v.Op = ssaop.OpAMD64VPROLVD256
		return true
	case ssaop.OpRotateLeftInt64x2:
		v.Op = ssaop.OpAMD64VPROLVQ128
		return true
	case ssaop.OpRotateLeftInt64x4:
		v.Op = ssaop.OpAMD64VPROLVQ256
		return true
	case ssaop.OpRotateLeftInt64x8:
		v.Op = ssaop.OpAMD64VPROLVQ512
		return true
	case ssaop.OpRotateLeftUint32x16:
		v.Op = ssaop.OpAMD64VPROLVD512
		return true
	case ssaop.OpRotateLeftUint32x4:
		v.Op = ssaop.OpAMD64VPROLVD128
		return true
	case ssaop.OpRotateLeftUint32x8:
		v.Op = ssaop.OpAMD64VPROLVD256
		return true
	case ssaop.OpRotateLeftUint64x2:
		v.Op = ssaop.OpAMD64VPROLVQ128
		return true
	case ssaop.OpRotateLeftUint64x4:
		v.Op = ssaop.OpAMD64VPROLVQ256
		return true
	case ssaop.OpRotateLeftUint64x8:
		v.Op = ssaop.OpAMD64VPROLVQ512
		return true
	case ssaop.OpRotateRightInt32x16:
		v.Op = ssaop.OpAMD64VPRORVD512
		return true
	case ssaop.OpRotateRightInt32x4:
		v.Op = ssaop.OpAMD64VPRORVD128
		return true
	case ssaop.OpRotateRightInt32x8:
		v.Op = ssaop.OpAMD64VPRORVD256
		return true
	case ssaop.OpRotateRightInt64x2:
		v.Op = ssaop.OpAMD64VPRORVQ128
		return true
	case ssaop.OpRotateRightInt64x4:
		v.Op = ssaop.OpAMD64VPRORVQ256
		return true
	case ssaop.OpRotateRightInt64x8:
		v.Op = ssaop.OpAMD64VPRORVQ512
		return true
	case ssaop.OpRotateRightUint32x16:
		v.Op = ssaop.OpAMD64VPRORVD512
		return true
	case ssaop.OpRotateRightUint32x4:
		v.Op = ssaop.OpAMD64VPRORVD128
		return true
	case ssaop.OpRotateRightUint32x8:
		v.Op = ssaop.OpAMD64VPRORVD256
		return true
	case ssaop.OpRotateRightUint64x2:
		v.Op = ssaop.OpAMD64VPRORVQ128
		return true
	case ssaop.OpRotateRightUint64x4:
		v.Op = ssaop.OpAMD64VPRORVQ256
		return true
	case ssaop.OpRotateRightUint64x8:
		v.Op = ssaop.OpAMD64VPRORVQ512
		return true
	case ssaop.OpRound32F:
		v.Op = ssaop.OpAMD64LoweredRound32F
		return true
	case ssaop.OpRound64F:
		v.Op = ssaop.OpAMD64LoweredRound64F
		return true
	case ssaop.OpRoundFloat32x4:
		return rewriteValue_OpRoundFloat32x4(v)
	case ssaop.OpRoundFloat32x8:
		return rewriteValue_OpRoundFloat32x8(v)
	case ssaop.OpRoundFloat64x2:
		return rewriteValue_OpRoundFloat64x2(v)
	case ssaop.OpRoundFloat64x4:
		return rewriteValue_OpRoundFloat64x4(v)
	case ssaop.OpRoundScaledFloat32x16:
		return rewriteValue_OpRoundScaledFloat32x16(v)
	case ssaop.OpRoundScaledFloat32x4:
		return rewriteValue_OpRoundScaledFloat32x4(v)
	case ssaop.OpRoundScaledFloat32x8:
		return rewriteValue_OpRoundScaledFloat32x8(v)
	case ssaop.OpRoundScaledFloat64x2:
		return rewriteValue_OpRoundScaledFloat64x2(v)
	case ssaop.OpRoundScaledFloat64x4:
		return rewriteValue_OpRoundScaledFloat64x4(v)
	case ssaop.OpRoundScaledFloat64x8:
		return rewriteValue_OpRoundScaledFloat64x8(v)
	case ssaop.OpRoundScaledResidueFloat32x16:
		return rewriteValue_OpRoundScaledResidueFloat32x16(v)
	case ssaop.OpRoundScaledResidueFloat32x4:
		return rewriteValue_OpRoundScaledResidueFloat32x4(v)
	case ssaop.OpRoundScaledResidueFloat32x8:
		return rewriteValue_OpRoundScaledResidueFloat32x8(v)
	case ssaop.OpRoundScaledResidueFloat64x2:
		return rewriteValue_OpRoundScaledResidueFloat64x2(v)
	case ssaop.OpRoundScaledResidueFloat64x4:
		return rewriteValue_OpRoundScaledResidueFloat64x4(v)
	case ssaop.OpRoundScaledResidueFloat64x8:
		return rewriteValue_OpRoundScaledResidueFloat64x8(v)
	case ssaop.OpRoundToEven:
		return rewriteValue_OpRoundToEven(v)
	case ssaop.OpRsh16Ux16:
		return rewriteValue_OpRsh16Ux16(v)
	case ssaop.OpRsh16Ux32:
		return rewriteValue_OpRsh16Ux32(v)
	case ssaop.OpRsh16Ux64:
		return rewriteValue_OpRsh16Ux64(v)
	case ssaop.OpRsh16Ux8:
		return rewriteValue_OpRsh16Ux8(v)
	case ssaop.OpRsh16x16:
		return rewriteValue_OpRsh16x16(v)
	case ssaop.OpRsh16x32:
		return rewriteValue_OpRsh16x32(v)
	case ssaop.OpRsh16x64:
		return rewriteValue_OpRsh16x64(v)
	case ssaop.OpRsh16x8:
		return rewriteValue_OpRsh16x8(v)
	case ssaop.OpRsh32Ux16:
		return rewriteValue_OpRsh32Ux16(v)
	case ssaop.OpRsh32Ux32:
		return rewriteValue_OpRsh32Ux32(v)
	case ssaop.OpRsh32Ux64:
		return rewriteValue_OpRsh32Ux64(v)
	case ssaop.OpRsh32Ux8:
		return rewriteValue_OpRsh32Ux8(v)
	case ssaop.OpRsh32x16:
		return rewriteValue_OpRsh32x16(v)
	case ssaop.OpRsh32x32:
		return rewriteValue_OpRsh32x32(v)
	case ssaop.OpRsh32x64:
		return rewriteValue_OpRsh32x64(v)
	case ssaop.OpRsh32x8:
		return rewriteValue_OpRsh32x8(v)
	case ssaop.OpRsh64Ux16:
		return rewriteValue_OpRsh64Ux16(v)
	case ssaop.OpRsh64Ux32:
		return rewriteValue_OpRsh64Ux32(v)
	case ssaop.OpRsh64Ux64:
		return rewriteValue_OpRsh64Ux64(v)
	case ssaop.OpRsh64Ux8:
		return rewriteValue_OpRsh64Ux8(v)
	case ssaop.OpRsh64x16:
		return rewriteValue_OpRsh64x16(v)
	case ssaop.OpRsh64x32:
		return rewriteValue_OpRsh64x32(v)
	case ssaop.OpRsh64x64:
		return rewriteValue_OpRsh64x64(v)
	case ssaop.OpRsh64x8:
		return rewriteValue_OpRsh64x8(v)
	case ssaop.OpRsh8Ux16:
		return rewriteValue_OpRsh8Ux16(v)
	case ssaop.OpRsh8Ux32:
		return rewriteValue_OpRsh8Ux32(v)
	case ssaop.OpRsh8Ux64:
		return rewriteValue_OpRsh8Ux64(v)
	case ssaop.OpRsh8Ux8:
		return rewriteValue_OpRsh8Ux8(v)
	case ssaop.OpRsh8x16:
		return rewriteValue_OpRsh8x16(v)
	case ssaop.OpRsh8x32:
		return rewriteValue_OpRsh8x32(v)
	case ssaop.OpRsh8x64:
		return rewriteValue_OpRsh8x64(v)
	case ssaop.OpRsh8x8:
		return rewriteValue_OpRsh8x8(v)
	case ssaop.OpSHA1FourRoundsUint32x4:
		v.Op = ssaop.OpAMD64SHA1RNDS4128
		return true
	case ssaop.OpSHA1Message1Uint32x4:
		v.Op = ssaop.OpAMD64SHA1MSG1128
		return true
	case ssaop.OpSHA1Message2Uint32x4:
		v.Op = ssaop.OpAMD64SHA1MSG2128
		return true
	case ssaop.OpSHA1NextEUint32x4:
		v.Op = ssaop.OpAMD64SHA1NEXTE128
		return true
	case ssaop.OpSHA256Message1Uint32x4:
		v.Op = ssaop.OpAMD64SHA256MSG1128
		return true
	case ssaop.OpSHA256Message2Uint32x4:
		v.Op = ssaop.OpAMD64SHA256MSG2128
		return true
	case ssaop.OpSHA256TwoRoundsUint32x4:
		v.Op = ssaop.OpAMD64SHA256RNDS2128
		return true
	case ssaop.OpSaturateToInt16Int32x16:
		v.Op = ssaop.OpAMD64VPMOVSDW256
		return true
	case ssaop.OpSaturateToInt16Int32x4:
		v.Op = ssaop.OpAMD64VPMOVSDW128_128
		return true
	case ssaop.OpSaturateToInt16Int32x8:
		v.Op = ssaop.OpAMD64VPMOVSDW128_256
		return true
	case ssaop.OpSaturateToInt16Int64x2:
		v.Op = ssaop.OpAMD64VPMOVSQW128_128
		return true
	case ssaop.OpSaturateToInt16Int64x4:
		v.Op = ssaop.OpAMD64VPMOVSQW128_256
		return true
	case ssaop.OpSaturateToInt16Int64x8:
		v.Op = ssaop.OpAMD64VPMOVSQW128_512
		return true
	case ssaop.OpSaturateToInt32Int64x2:
		v.Op = ssaop.OpAMD64VPMOVSQD128_128
		return true
	case ssaop.OpSaturateToInt32Int64x4:
		v.Op = ssaop.OpAMD64VPMOVSQD128_256
		return true
	case ssaop.OpSaturateToInt32Int64x8:
		v.Op = ssaop.OpAMD64VPMOVSQD256
		return true
	case ssaop.OpSaturateToInt8Int16x16:
		v.Op = ssaop.OpAMD64VPMOVSWB128_256
		return true
	case ssaop.OpSaturateToInt8Int16x32:
		v.Op = ssaop.OpAMD64VPMOVSWB256
		return true
	case ssaop.OpSaturateToInt8Int16x8:
		v.Op = ssaop.OpAMD64VPMOVSWB128_128
		return true
	case ssaop.OpSaturateToInt8Int32x16:
		v.Op = ssaop.OpAMD64VPMOVSDB128_512
		return true
	case ssaop.OpSaturateToInt8Int32x4:
		v.Op = ssaop.OpAMD64VPMOVSDB128_128
		return true
	case ssaop.OpSaturateToInt8Int32x8:
		v.Op = ssaop.OpAMD64VPMOVSDB128_256
		return true
	case ssaop.OpSaturateToInt8Int64x2:
		v.Op = ssaop.OpAMD64VPMOVSQB128_128
		return true
	case ssaop.OpSaturateToInt8Int64x4:
		v.Op = ssaop.OpAMD64VPMOVSQB128_256
		return true
	case ssaop.OpSaturateToInt8Int64x8:
		v.Op = ssaop.OpAMD64VPMOVSQB128_512
		return true
	case ssaop.OpSaturateToUint16Uint32x16:
		v.Op = ssaop.OpAMD64VPMOVUSDW256
		return true
	case ssaop.OpSaturateToUint16Uint32x4:
		v.Op = ssaop.OpAMD64VPMOVUSDW128_128
		return true
	case ssaop.OpSaturateToUint16Uint32x8:
		v.Op = ssaop.OpAMD64VPMOVUSDW128_256
		return true
	case ssaop.OpSaturateToUint16Uint64x2:
		v.Op = ssaop.OpAMD64VPMOVUSQW128_128
		return true
	case ssaop.OpSaturateToUint16Uint64x4:
		v.Op = ssaop.OpAMD64VPMOVUSQW128_256
		return true
	case ssaop.OpSaturateToUint16Uint64x8:
		v.Op = ssaop.OpAMD64VPMOVUSQW128_512
		return true
	case ssaop.OpSaturateToUint32Uint64x2:
		v.Op = ssaop.OpAMD64VPMOVUSQD128_128
		return true
	case ssaop.OpSaturateToUint32Uint64x4:
		v.Op = ssaop.OpAMD64VPMOVUSQD128_256
		return true
	case ssaop.OpSaturateToUint32Uint64x8:
		v.Op = ssaop.OpAMD64VPMOVUSQD256
		return true
	case ssaop.OpSaturateToUint8Uint16x16:
		v.Op = ssaop.OpAMD64VPMOVUSWB128_256
		return true
	case ssaop.OpSaturateToUint8Uint16x32:
		v.Op = ssaop.OpAMD64VPMOVUSWB256
		return true
	case ssaop.OpSaturateToUint8Uint16x8:
		v.Op = ssaop.OpAMD64VPMOVUSWB128_128
		return true
	case ssaop.OpSaturateToUint8Uint32x16:
		v.Op = ssaop.OpAMD64VPMOVUSDB128_512
		return true
	case ssaop.OpSaturateToUint8Uint32x4:
		v.Op = ssaop.OpAMD64VPMOVUSDB128_128
		return true
	case ssaop.OpSaturateToUint8Uint32x8:
		v.Op = ssaop.OpAMD64VPMOVUSDB128_256
		return true
	case ssaop.OpSaturateToUint8Uint64x2:
		v.Op = ssaop.OpAMD64VPMOVUSQB128_128
		return true
	case ssaop.OpSaturateToUint8Uint64x4:
		v.Op = ssaop.OpAMD64VPMOVUSQB128_256
		return true
	case ssaop.OpSaturateToUint8Uint64x8:
		v.Op = ssaop.OpAMD64VPMOVUSQB128_512
		return true
	case ssaop.OpScaleFloat32x16:
		v.Op = ssaop.OpAMD64VSCALEFPS512
		return true
	case ssaop.OpScaleFloat32x4:
		v.Op = ssaop.OpAMD64VSCALEFPS128
		return true
	case ssaop.OpScaleFloat32x8:
		v.Op = ssaop.OpAMD64VSCALEFPS256
		return true
	case ssaop.OpScaleFloat64x2:
		v.Op = ssaop.OpAMD64VSCALEFPD128
		return true
	case ssaop.OpScaleFloat64x4:
		v.Op = ssaop.OpAMD64VSCALEFPD256
		return true
	case ssaop.OpScaleFloat64x8:
		v.Op = ssaop.OpAMD64VSCALEFPD512
		return true
	case ssaop.OpSelect0:
		return rewriteValue_OpSelect0(v)
	case ssaop.OpSelect1:
		return rewriteValue_OpSelect1(v)
	case ssaop.OpSelectN:
		return rewriteValue_OpSelectN(v)
	case ssaop.OpSetElemFloat32x4:
		v.Op = ssaop.OpAMD64VPINSRD128
		return true
	case ssaop.OpSetElemFloat64x2:
		v.Op = ssaop.OpAMD64VPINSRQ128
		return true
	case ssaop.OpSetElemInt16x8:
		v.Op = ssaop.OpAMD64VPINSRW128
		return true
	case ssaop.OpSetElemInt32x4:
		v.Op = ssaop.OpAMD64VPINSRD128
		return true
	case ssaop.OpSetElemInt64x2:
		v.Op = ssaop.OpAMD64VPINSRQ128
		return true
	case ssaop.OpSetElemInt8x16:
		v.Op = ssaop.OpAMD64VPINSRB128
		return true
	case ssaop.OpSetElemUint16x8:
		v.Op = ssaop.OpAMD64VPINSRW128
		return true
	case ssaop.OpSetElemUint32x4:
		v.Op = ssaop.OpAMD64VPINSRD128
		return true
	case ssaop.OpSetElemUint64x2:
		v.Op = ssaop.OpAMD64VPINSRQ128
		return true
	case ssaop.OpSetElemUint8x16:
		v.Op = ssaop.OpAMD64VPINSRB128
		return true
	case ssaop.OpSetHiFloat32x16:
		return rewriteValue_OpSetHiFloat32x16(v)
	case ssaop.OpSetHiFloat32x8:
		return rewriteValue_OpSetHiFloat32x8(v)
	case ssaop.OpSetHiFloat64x4:
		return rewriteValue_OpSetHiFloat64x4(v)
	case ssaop.OpSetHiFloat64x8:
		return rewriteValue_OpSetHiFloat64x8(v)
	case ssaop.OpSetHiInt16x16:
		return rewriteValue_OpSetHiInt16x16(v)
	case ssaop.OpSetHiInt16x32:
		return rewriteValue_OpSetHiInt16x32(v)
	case ssaop.OpSetHiInt32x16:
		return rewriteValue_OpSetHiInt32x16(v)
	case ssaop.OpSetHiInt32x8:
		return rewriteValue_OpSetHiInt32x8(v)
	case ssaop.OpSetHiInt64x4:
		return rewriteValue_OpSetHiInt64x4(v)
	case ssaop.OpSetHiInt64x8:
		return rewriteValue_OpSetHiInt64x8(v)
	case ssaop.OpSetHiInt8x32:
		return rewriteValue_OpSetHiInt8x32(v)
	case ssaop.OpSetHiInt8x64:
		return rewriteValue_OpSetHiInt8x64(v)
	case ssaop.OpSetHiUint16x16:
		return rewriteValue_OpSetHiUint16x16(v)
	case ssaop.OpSetHiUint16x32:
		return rewriteValue_OpSetHiUint16x32(v)
	case ssaop.OpSetHiUint32x16:
		return rewriteValue_OpSetHiUint32x16(v)
	case ssaop.OpSetHiUint32x8:
		return rewriteValue_OpSetHiUint32x8(v)
	case ssaop.OpSetHiUint64x4:
		return rewriteValue_OpSetHiUint64x4(v)
	case ssaop.OpSetHiUint64x8:
		return rewriteValue_OpSetHiUint64x8(v)
	case ssaop.OpSetHiUint8x32:
		return rewriteValue_OpSetHiUint8x32(v)
	case ssaop.OpSetHiUint8x64:
		return rewriteValue_OpSetHiUint8x64(v)
	case ssaop.OpSetLoFloat32x16:
		return rewriteValue_OpSetLoFloat32x16(v)
	case ssaop.OpSetLoFloat32x8:
		return rewriteValue_OpSetLoFloat32x8(v)
	case ssaop.OpSetLoFloat64x4:
		return rewriteValue_OpSetLoFloat64x4(v)
	case ssaop.OpSetLoFloat64x8:
		return rewriteValue_OpSetLoFloat64x8(v)
	case ssaop.OpSetLoInt16x16:
		return rewriteValue_OpSetLoInt16x16(v)
	case ssaop.OpSetLoInt16x32:
		return rewriteValue_OpSetLoInt16x32(v)
	case ssaop.OpSetLoInt32x16:
		return rewriteValue_OpSetLoInt32x16(v)
	case ssaop.OpSetLoInt32x8:
		return rewriteValue_OpSetLoInt32x8(v)
	case ssaop.OpSetLoInt64x4:
		return rewriteValue_OpSetLoInt64x4(v)
	case ssaop.OpSetLoInt64x8:
		return rewriteValue_OpSetLoInt64x8(v)
	case ssaop.OpSetLoInt8x32:
		return rewriteValue_OpSetLoInt8x32(v)
	case ssaop.OpSetLoInt8x64:
		return rewriteValue_OpSetLoInt8x64(v)
	case ssaop.OpSetLoUint16x16:
		return rewriteValue_OpSetLoUint16x16(v)
	case ssaop.OpSetLoUint16x32:
		return rewriteValue_OpSetLoUint16x32(v)
	case ssaop.OpSetLoUint32x16:
		return rewriteValue_OpSetLoUint32x16(v)
	case ssaop.OpSetLoUint32x8:
		return rewriteValue_OpSetLoUint32x8(v)
	case ssaop.OpSetLoUint64x4:
		return rewriteValue_OpSetLoUint64x4(v)
	case ssaop.OpSetLoUint64x8:
		return rewriteValue_OpSetLoUint64x8(v)
	case ssaop.OpSetLoUint8x32:
		return rewriteValue_OpSetLoUint8x32(v)
	case ssaop.OpSetLoUint8x64:
		return rewriteValue_OpSetLoUint8x64(v)
	case ssaop.OpShiftAllLeftConcatMod16Int16x16:
		v.Op = ssaop.OpAMD64VPSHLDW256
		return true
	case ssaop.OpShiftAllLeftConcatMod16Int16x32:
		v.Op = ssaop.OpAMD64VPSHLDW512
		return true
	case ssaop.OpShiftAllLeftConcatMod16Int16x8:
		v.Op = ssaop.OpAMD64VPSHLDW128
		return true
	case ssaop.OpShiftAllLeftConcatMod16Uint16x16:
		v.Op = ssaop.OpAMD64VPSHLDW256
		return true
	case ssaop.OpShiftAllLeftConcatMod16Uint16x32:
		v.Op = ssaop.OpAMD64VPSHLDW512
		return true
	case ssaop.OpShiftAllLeftConcatMod16Uint16x8:
		v.Op = ssaop.OpAMD64VPSHLDW128
		return true
	case ssaop.OpShiftAllLeftConcatMod32Int32x16:
		v.Op = ssaop.OpAMD64VPSHLDD512
		return true
	case ssaop.OpShiftAllLeftConcatMod32Int32x4:
		v.Op = ssaop.OpAMD64VPSHLDD128
		return true
	case ssaop.OpShiftAllLeftConcatMod32Int32x8:
		v.Op = ssaop.OpAMD64VPSHLDD256
		return true
	case ssaop.OpShiftAllLeftConcatMod32Uint32x16:
		v.Op = ssaop.OpAMD64VPSHLDD512
		return true
	case ssaop.OpShiftAllLeftConcatMod32Uint32x4:
		v.Op = ssaop.OpAMD64VPSHLDD128
		return true
	case ssaop.OpShiftAllLeftConcatMod32Uint32x8:
		v.Op = ssaop.OpAMD64VPSHLDD256
		return true
	case ssaop.OpShiftAllLeftConcatMod64Int64x2:
		v.Op = ssaop.OpAMD64VPSHLDQ128
		return true
	case ssaop.OpShiftAllLeftConcatMod64Int64x4:
		v.Op = ssaop.OpAMD64VPSHLDQ256
		return true
	case ssaop.OpShiftAllLeftConcatMod64Int64x8:
		v.Op = ssaop.OpAMD64VPSHLDQ512
		return true
	case ssaop.OpShiftAllLeftConcatMod64Uint64x2:
		v.Op = ssaop.OpAMD64VPSHLDQ128
		return true
	case ssaop.OpShiftAllLeftConcatMod64Uint64x4:
		v.Op = ssaop.OpAMD64VPSHLDQ256
		return true
	case ssaop.OpShiftAllLeftConcatMod64Uint64x8:
		v.Op = ssaop.OpAMD64VPSHLDQ512
		return true
	case ssaop.OpShiftAllLeftInt16x16:
		v.Op = ssaop.OpAMD64VPSLLW256
		return true
	case ssaop.OpShiftAllLeftInt16x32:
		v.Op = ssaop.OpAMD64VPSLLW512
		return true
	case ssaop.OpShiftAllLeftInt16x8:
		v.Op = ssaop.OpAMD64VPSLLW128
		return true
	case ssaop.OpShiftAllLeftInt32x16:
		v.Op = ssaop.OpAMD64VPSLLD512
		return true
	case ssaop.OpShiftAllLeftInt32x4:
		v.Op = ssaop.OpAMD64VPSLLD128
		return true
	case ssaop.OpShiftAllLeftInt32x8:
		v.Op = ssaop.OpAMD64VPSLLD256
		return true
	case ssaop.OpShiftAllLeftInt64x2:
		v.Op = ssaop.OpAMD64VPSLLQ128
		return true
	case ssaop.OpShiftAllLeftInt64x4:
		v.Op = ssaop.OpAMD64VPSLLQ256
		return true
	case ssaop.OpShiftAllLeftInt64x8:
		v.Op = ssaop.OpAMD64VPSLLQ512
		return true
	case ssaop.OpShiftAllLeftUint16x16:
		v.Op = ssaop.OpAMD64VPSLLW256
		return true
	case ssaop.OpShiftAllLeftUint16x32:
		v.Op = ssaop.OpAMD64VPSLLW512
		return true
	case ssaop.OpShiftAllLeftUint16x8:
		v.Op = ssaop.OpAMD64VPSLLW128
		return true
	case ssaop.OpShiftAllLeftUint32x16:
		v.Op = ssaop.OpAMD64VPSLLD512
		return true
	case ssaop.OpShiftAllLeftUint32x4:
		v.Op = ssaop.OpAMD64VPSLLD128
		return true
	case ssaop.OpShiftAllLeftUint32x8:
		v.Op = ssaop.OpAMD64VPSLLD256
		return true
	case ssaop.OpShiftAllLeftUint64x2:
		v.Op = ssaop.OpAMD64VPSLLQ128
		return true
	case ssaop.OpShiftAllLeftUint64x4:
		v.Op = ssaop.OpAMD64VPSLLQ256
		return true
	case ssaop.OpShiftAllLeftUint64x8:
		v.Op = ssaop.OpAMD64VPSLLQ512
		return true
	case ssaop.OpShiftAllRightConcatMod16Int16x16:
		v.Op = ssaop.OpAMD64VPSHRDW256
		return true
	case ssaop.OpShiftAllRightConcatMod16Int16x32:
		v.Op = ssaop.OpAMD64VPSHRDW512
		return true
	case ssaop.OpShiftAllRightConcatMod16Int16x8:
		v.Op = ssaop.OpAMD64VPSHRDW128
		return true
	case ssaop.OpShiftAllRightConcatMod16Uint16x16:
		v.Op = ssaop.OpAMD64VPSHRDW256
		return true
	case ssaop.OpShiftAllRightConcatMod16Uint16x32:
		v.Op = ssaop.OpAMD64VPSHRDW512
		return true
	case ssaop.OpShiftAllRightConcatMod16Uint16x8:
		v.Op = ssaop.OpAMD64VPSHRDW128
		return true
	case ssaop.OpShiftAllRightConcatMod32Int32x16:
		v.Op = ssaop.OpAMD64VPSHRDD512
		return true
	case ssaop.OpShiftAllRightConcatMod32Int32x4:
		v.Op = ssaop.OpAMD64VPSHRDD128
		return true
	case ssaop.OpShiftAllRightConcatMod32Int32x8:
		v.Op = ssaop.OpAMD64VPSHRDD256
		return true
	case ssaop.OpShiftAllRightConcatMod32Uint32x16:
		v.Op = ssaop.OpAMD64VPSHRDD512
		return true
	case ssaop.OpShiftAllRightConcatMod32Uint32x4:
		v.Op = ssaop.OpAMD64VPSHRDD128
		return true
	case ssaop.OpShiftAllRightConcatMod32Uint32x8:
		v.Op = ssaop.OpAMD64VPSHRDD256
		return true
	case ssaop.OpShiftAllRightConcatMod64Int64x2:
		v.Op = ssaop.OpAMD64VPSHRDQ128
		return true
	case ssaop.OpShiftAllRightConcatMod64Int64x4:
		v.Op = ssaop.OpAMD64VPSHRDQ256
		return true
	case ssaop.OpShiftAllRightConcatMod64Int64x8:
		v.Op = ssaop.OpAMD64VPSHRDQ512
		return true
	case ssaop.OpShiftAllRightConcatMod64Uint64x2:
		v.Op = ssaop.OpAMD64VPSHRDQ128
		return true
	case ssaop.OpShiftAllRightConcatMod64Uint64x4:
		v.Op = ssaop.OpAMD64VPSHRDQ256
		return true
	case ssaop.OpShiftAllRightConcatMod64Uint64x8:
		v.Op = ssaop.OpAMD64VPSHRDQ512
		return true
	case ssaop.OpShiftAllRightInt16x16:
		v.Op = ssaop.OpAMD64VPSRAW256
		return true
	case ssaop.OpShiftAllRightInt16x32:
		v.Op = ssaop.OpAMD64VPSRAW512
		return true
	case ssaop.OpShiftAllRightInt16x8:
		v.Op = ssaop.OpAMD64VPSRAW128
		return true
	case ssaop.OpShiftAllRightInt32x16:
		v.Op = ssaop.OpAMD64VPSRAD512
		return true
	case ssaop.OpShiftAllRightInt32x4:
		v.Op = ssaop.OpAMD64VPSRAD128
		return true
	case ssaop.OpShiftAllRightInt32x8:
		v.Op = ssaop.OpAMD64VPSRAD256
		return true
	case ssaop.OpShiftAllRightInt64x2:
		v.Op = ssaop.OpAMD64VPSRAQ128
		return true
	case ssaop.OpShiftAllRightInt64x4:
		v.Op = ssaop.OpAMD64VPSRAQ256
		return true
	case ssaop.OpShiftAllRightInt64x8:
		v.Op = ssaop.OpAMD64VPSRAQ512
		return true
	case ssaop.OpShiftAllRightUint16x16:
		v.Op = ssaop.OpAMD64VPSRLW256
		return true
	case ssaop.OpShiftAllRightUint16x32:
		v.Op = ssaop.OpAMD64VPSRLW512
		return true
	case ssaop.OpShiftAllRightUint16x8:
		v.Op = ssaop.OpAMD64VPSRLW128
		return true
	case ssaop.OpShiftAllRightUint32x16:
		v.Op = ssaop.OpAMD64VPSRLD512
		return true
	case ssaop.OpShiftAllRightUint32x4:
		v.Op = ssaop.OpAMD64VPSRLD128
		return true
	case ssaop.OpShiftAllRightUint32x8:
		v.Op = ssaop.OpAMD64VPSRLD256
		return true
	case ssaop.OpShiftAllRightUint64x2:
		v.Op = ssaop.OpAMD64VPSRLQ128
		return true
	case ssaop.OpShiftAllRightUint64x4:
		v.Op = ssaop.OpAMD64VPSRLQ256
		return true
	case ssaop.OpShiftAllRightUint64x8:
		v.Op = ssaop.OpAMD64VPSRLQ512
		return true
	case ssaop.OpShiftLeftConcatMod16Int16x16:
		v.Op = ssaop.OpAMD64VPSHLDVW256
		return true
	case ssaop.OpShiftLeftConcatMod16Int16x32:
		v.Op = ssaop.OpAMD64VPSHLDVW512
		return true
	case ssaop.OpShiftLeftConcatMod16Int16x8:
		v.Op = ssaop.OpAMD64VPSHLDVW128
		return true
	case ssaop.OpShiftLeftConcatMod16Uint16x16:
		v.Op = ssaop.OpAMD64VPSHLDVW256
		return true
	case ssaop.OpShiftLeftConcatMod16Uint16x32:
		v.Op = ssaop.OpAMD64VPSHLDVW512
		return true
	case ssaop.OpShiftLeftConcatMod16Uint16x8:
		v.Op = ssaop.OpAMD64VPSHLDVW128
		return true
	case ssaop.OpShiftLeftConcatMod32Int32x16:
		v.Op = ssaop.OpAMD64VPSHLDVD512
		return true
	case ssaop.OpShiftLeftConcatMod32Int32x4:
		v.Op = ssaop.OpAMD64VPSHLDVD128
		return true
	case ssaop.OpShiftLeftConcatMod32Int32x8:
		v.Op = ssaop.OpAMD64VPSHLDVD256
		return true
	case ssaop.OpShiftLeftConcatMod32Uint32x16:
		v.Op = ssaop.OpAMD64VPSHLDVD512
		return true
	case ssaop.OpShiftLeftConcatMod32Uint32x4:
		v.Op = ssaop.OpAMD64VPSHLDVD128
		return true
	case ssaop.OpShiftLeftConcatMod32Uint32x8:
		v.Op = ssaop.OpAMD64VPSHLDVD256
		return true
	case ssaop.OpShiftLeftConcatMod64Int64x2:
		v.Op = ssaop.OpAMD64VPSHLDVQ128
		return true
	case ssaop.OpShiftLeftConcatMod64Int64x4:
		v.Op = ssaop.OpAMD64VPSHLDVQ256
		return true
	case ssaop.OpShiftLeftConcatMod64Int64x8:
		v.Op = ssaop.OpAMD64VPSHLDVQ512
		return true
	case ssaop.OpShiftLeftConcatMod64Uint64x2:
		v.Op = ssaop.OpAMD64VPSHLDVQ128
		return true
	case ssaop.OpShiftLeftConcatMod64Uint64x4:
		v.Op = ssaop.OpAMD64VPSHLDVQ256
		return true
	case ssaop.OpShiftLeftConcatMod64Uint64x8:
		v.Op = ssaop.OpAMD64VPSHLDVQ512
		return true
	case ssaop.OpShiftLeftInt16x16:
		v.Op = ssaop.OpAMD64VPSLLVW256
		return true
	case ssaop.OpShiftLeftInt16x32:
		v.Op = ssaop.OpAMD64VPSLLVW512
		return true
	case ssaop.OpShiftLeftInt16x8:
		v.Op = ssaop.OpAMD64VPSLLVW128
		return true
	case ssaop.OpShiftLeftInt32x16:
		v.Op = ssaop.OpAMD64VPSLLVD512
		return true
	case ssaop.OpShiftLeftInt32x4:
		v.Op = ssaop.OpAMD64VPSLLVD128
		return true
	case ssaop.OpShiftLeftInt32x8:
		v.Op = ssaop.OpAMD64VPSLLVD256
		return true
	case ssaop.OpShiftLeftInt64x2:
		v.Op = ssaop.OpAMD64VPSLLVQ128
		return true
	case ssaop.OpShiftLeftInt64x4:
		v.Op = ssaop.OpAMD64VPSLLVQ256
		return true
	case ssaop.OpShiftLeftInt64x8:
		v.Op = ssaop.OpAMD64VPSLLVQ512
		return true
	case ssaop.OpShiftLeftUint16x16:
		v.Op = ssaop.OpAMD64VPSLLVW256
		return true
	case ssaop.OpShiftLeftUint16x32:
		v.Op = ssaop.OpAMD64VPSLLVW512
		return true
	case ssaop.OpShiftLeftUint16x8:
		v.Op = ssaop.OpAMD64VPSLLVW128
		return true
	case ssaop.OpShiftLeftUint32x16:
		v.Op = ssaop.OpAMD64VPSLLVD512
		return true
	case ssaop.OpShiftLeftUint32x4:
		v.Op = ssaop.OpAMD64VPSLLVD128
		return true
	case ssaop.OpShiftLeftUint32x8:
		v.Op = ssaop.OpAMD64VPSLLVD256
		return true
	case ssaop.OpShiftLeftUint64x2:
		v.Op = ssaop.OpAMD64VPSLLVQ128
		return true
	case ssaop.OpShiftLeftUint64x4:
		v.Op = ssaop.OpAMD64VPSLLVQ256
		return true
	case ssaop.OpShiftLeftUint64x8:
		v.Op = ssaop.OpAMD64VPSLLVQ512
		return true
	case ssaop.OpShiftRightConcatMod16Int16x16:
		v.Op = ssaop.OpAMD64VPSHRDVW256
		return true
	case ssaop.OpShiftRightConcatMod16Int16x32:
		v.Op = ssaop.OpAMD64VPSHRDVW512
		return true
	case ssaop.OpShiftRightConcatMod16Int16x8:
		v.Op = ssaop.OpAMD64VPSHRDVW128
		return true
	case ssaop.OpShiftRightConcatMod16Uint16x16:
		v.Op = ssaop.OpAMD64VPSHRDVW256
		return true
	case ssaop.OpShiftRightConcatMod16Uint16x32:
		v.Op = ssaop.OpAMD64VPSHRDVW512
		return true
	case ssaop.OpShiftRightConcatMod16Uint16x8:
		v.Op = ssaop.OpAMD64VPSHRDVW128
		return true
	case ssaop.OpShiftRightConcatMod32Int32x16:
		v.Op = ssaop.OpAMD64VPSHRDVD512
		return true
	case ssaop.OpShiftRightConcatMod32Int32x4:
		v.Op = ssaop.OpAMD64VPSHRDVD128
		return true
	case ssaop.OpShiftRightConcatMod32Int32x8:
		v.Op = ssaop.OpAMD64VPSHRDVD256
		return true
	case ssaop.OpShiftRightConcatMod32Uint32x16:
		v.Op = ssaop.OpAMD64VPSHRDVD512
		return true
	case ssaop.OpShiftRightConcatMod32Uint32x4:
		v.Op = ssaop.OpAMD64VPSHRDVD128
		return true
	case ssaop.OpShiftRightConcatMod32Uint32x8:
		v.Op = ssaop.OpAMD64VPSHRDVD256
		return true
	case ssaop.OpShiftRightConcatMod64Int64x2:
		v.Op = ssaop.OpAMD64VPSHRDVQ128
		return true
	case ssaop.OpShiftRightConcatMod64Int64x4:
		v.Op = ssaop.OpAMD64VPSHRDVQ256
		return true
	case ssaop.OpShiftRightConcatMod64Int64x8:
		v.Op = ssaop.OpAMD64VPSHRDVQ512
		return true
	case ssaop.OpShiftRightConcatMod64Uint64x2:
		v.Op = ssaop.OpAMD64VPSHRDVQ128
		return true
	case ssaop.OpShiftRightConcatMod64Uint64x4:
		v.Op = ssaop.OpAMD64VPSHRDVQ256
		return true
	case ssaop.OpShiftRightConcatMod64Uint64x8:
		v.Op = ssaop.OpAMD64VPSHRDVQ512
		return true
	case ssaop.OpShiftRightInt16x16:
		v.Op = ssaop.OpAMD64VPSRAVW256
		return true
	case ssaop.OpShiftRightInt16x32:
		v.Op = ssaop.OpAMD64VPSRAVW512
		return true
	case ssaop.OpShiftRightInt16x8:
		v.Op = ssaop.OpAMD64VPSRAVW128
		return true
	case ssaop.OpShiftRightInt32x16:
		v.Op = ssaop.OpAMD64VPSRAVD512
		return true
	case ssaop.OpShiftRightInt32x4:
		v.Op = ssaop.OpAMD64VPSRAVD128
		return true
	case ssaop.OpShiftRightInt32x8:
		v.Op = ssaop.OpAMD64VPSRAVD256
		return true
	case ssaop.OpShiftRightInt64x2:
		v.Op = ssaop.OpAMD64VPSRAVQ128
		return true
	case ssaop.OpShiftRightInt64x4:
		v.Op = ssaop.OpAMD64VPSRAVQ256
		return true
	case ssaop.OpShiftRightInt64x8:
		v.Op = ssaop.OpAMD64VPSRAVQ512
		return true
	case ssaop.OpShiftRightUint16x16:
		v.Op = ssaop.OpAMD64VPSRLVW256
		return true
	case ssaop.OpShiftRightUint16x32:
		v.Op = ssaop.OpAMD64VPSRLVW512
		return true
	case ssaop.OpShiftRightUint16x8:
		v.Op = ssaop.OpAMD64VPSRLVW128
		return true
	case ssaop.OpShiftRightUint32x16:
		v.Op = ssaop.OpAMD64VPSRLVD512
		return true
	case ssaop.OpShiftRightUint32x4:
		v.Op = ssaop.OpAMD64VPSRLVD128
		return true
	case ssaop.OpShiftRightUint32x8:
		v.Op = ssaop.OpAMD64VPSRLVD256
		return true
	case ssaop.OpShiftRightUint64x2:
		v.Op = ssaop.OpAMD64VPSRLVQ128
		return true
	case ssaop.OpShiftRightUint64x4:
		v.Op = ssaop.OpAMD64VPSRLVQ256
		return true
	case ssaop.OpShiftRightUint64x8:
		v.Op = ssaop.OpAMD64VPSRLVQ512
		return true
	case ssaop.OpSignExt16to32:
		v.Op = ssaop.OpAMD64MOVWQSX
		return true
	case ssaop.OpSignExt16to64:
		v.Op = ssaop.OpAMD64MOVWQSX
		return true
	case ssaop.OpSignExt32to64:
		v.Op = ssaop.OpAMD64MOVLQSX
		return true
	case ssaop.OpSignExt8to16:
		v.Op = ssaop.OpAMD64MOVBQSX
		return true
	case ssaop.OpSignExt8to32:
		v.Op = ssaop.OpAMD64MOVBQSX
		return true
	case ssaop.OpSignExt8to64:
		v.Op = ssaop.OpAMD64MOVBQSX
		return true
	case ssaop.OpSlicemask:
		return rewriteValue_OpSlicemask(v)
	case ssaop.OpSpectreIndex:
		return rewriteValue_OpSpectreIndex(v)
	case ssaop.OpSpectreSliceIndex:
		return rewriteValue_OpSpectreSliceIndex(v)
	case ssaop.OpSqrt:
		v.Op = ssaop.OpAMD64SQRTSD
		return true
	case ssaop.OpSqrt32:
		v.Op = ssaop.OpAMD64SQRTSS
		return true
	case ssaop.OpSqrtFloat32x16:
		v.Op = ssaop.OpAMD64VSQRTPS512
		return true
	case ssaop.OpSqrtFloat32x4:
		v.Op = ssaop.OpAMD64VSQRTPS128
		return true
	case ssaop.OpSqrtFloat32x8:
		v.Op = ssaop.OpAMD64VSQRTPS256
		return true
	case ssaop.OpSqrtFloat64x2:
		v.Op = ssaop.OpAMD64VSQRTPD128
		return true
	case ssaop.OpSqrtFloat64x4:
		v.Op = ssaop.OpAMD64VSQRTPD256
		return true
	case ssaop.OpSqrtFloat64x8:
		v.Op = ssaop.OpAMD64VSQRTPD512
		return true
	case ssaop.OpStaticCall:
		v.Op = ssaop.OpAMD64CALLstatic
		return true
	case ssaop.OpStore:
		return rewriteValue_OpStore(v)
	case ssaop.OpStoreMasked16:
		return rewriteValue_OpStoreMasked16(v)
	case ssaop.OpStoreMasked32:
		return rewriteValue_OpStoreMasked32(v)
	case ssaop.OpStoreMasked64:
		return rewriteValue_OpStoreMasked64(v)
	case ssaop.OpStoreMasked8:
		return rewriteValue_OpStoreMasked8(v)
	case ssaop.OpSub16:
		v.Op = ssaop.OpAMD64SUBL
		return true
	case ssaop.OpSub32:
		v.Op = ssaop.OpAMD64SUBL
		return true
	case ssaop.OpSub32F:
		v.Op = ssaop.OpAMD64SUBSS
		return true
	case ssaop.OpSub64:
		v.Op = ssaop.OpAMD64SUBQ
		return true
	case ssaop.OpSub64F:
		v.Op = ssaop.OpAMD64SUBSD
		return true
	case ssaop.OpSub8:
		v.Op = ssaop.OpAMD64SUBL
		return true
	case ssaop.OpSubFloat32x16:
		v.Op = ssaop.OpAMD64VSUBPS512
		return true
	case ssaop.OpSubFloat32x4:
		v.Op = ssaop.OpAMD64VSUBPS128
		return true
	case ssaop.OpSubFloat32x8:
		v.Op = ssaop.OpAMD64VSUBPS256
		return true
	case ssaop.OpSubFloat64x2:
		v.Op = ssaop.OpAMD64VSUBPD128
		return true
	case ssaop.OpSubFloat64x4:
		v.Op = ssaop.OpAMD64VSUBPD256
		return true
	case ssaop.OpSubFloat64x8:
		v.Op = ssaop.OpAMD64VSUBPD512
		return true
	case ssaop.OpSubInt16x16:
		v.Op = ssaop.OpAMD64VPSUBW256
		return true
	case ssaop.OpSubInt16x32:
		v.Op = ssaop.OpAMD64VPSUBW512
		return true
	case ssaop.OpSubInt16x8:
		v.Op = ssaop.OpAMD64VPSUBW128
		return true
	case ssaop.OpSubInt32x16:
		v.Op = ssaop.OpAMD64VPSUBD512
		return true
	case ssaop.OpSubInt32x4:
		v.Op = ssaop.OpAMD64VPSUBD128
		return true
	case ssaop.OpSubInt32x8:
		v.Op = ssaop.OpAMD64VPSUBD256
		return true
	case ssaop.OpSubInt64x2:
		v.Op = ssaop.OpAMD64VPSUBQ128
		return true
	case ssaop.OpSubInt64x4:
		v.Op = ssaop.OpAMD64VPSUBQ256
		return true
	case ssaop.OpSubInt64x8:
		v.Op = ssaop.OpAMD64VPSUBQ512
		return true
	case ssaop.OpSubInt8x16:
		v.Op = ssaop.OpAMD64VPSUBB128
		return true
	case ssaop.OpSubInt8x32:
		v.Op = ssaop.OpAMD64VPSUBB256
		return true
	case ssaop.OpSubInt8x64:
		v.Op = ssaop.OpAMD64VPSUBB512
		return true
	case ssaop.OpSubPtr:
		v.Op = ssaop.OpAMD64SUBQ
		return true
	case ssaop.OpSubSaturatedInt16x16:
		v.Op = ssaop.OpAMD64VPSUBSW256
		return true
	case ssaop.OpSubSaturatedInt16x32:
		v.Op = ssaop.OpAMD64VPSUBSW512
		return true
	case ssaop.OpSubSaturatedInt16x8:
		v.Op = ssaop.OpAMD64VPSUBSW128
		return true
	case ssaop.OpSubSaturatedInt8x16:
		v.Op = ssaop.OpAMD64VPSUBSB128
		return true
	case ssaop.OpSubSaturatedInt8x32:
		v.Op = ssaop.OpAMD64VPSUBSB256
		return true
	case ssaop.OpSubSaturatedInt8x64:
		v.Op = ssaop.OpAMD64VPSUBSB512
		return true
	case ssaop.OpSubSaturatedUint16x16:
		v.Op = ssaop.OpAMD64VPSUBUSW256
		return true
	case ssaop.OpSubSaturatedUint16x32:
		v.Op = ssaop.OpAMD64VPSUBUSW512
		return true
	case ssaop.OpSubSaturatedUint16x8:
		v.Op = ssaop.OpAMD64VPSUBUSW128
		return true
	case ssaop.OpSubSaturatedUint8x16:
		v.Op = ssaop.OpAMD64VPSUBUSB128
		return true
	case ssaop.OpSubSaturatedUint8x32:
		v.Op = ssaop.OpAMD64VPSUBUSB256
		return true
	case ssaop.OpSubSaturatedUint8x64:
		v.Op = ssaop.OpAMD64VPSUBUSB512
		return true
	case ssaop.OpSubUint16x16:
		v.Op = ssaop.OpAMD64VPSUBW256
		return true
	case ssaop.OpSubUint16x32:
		v.Op = ssaop.OpAMD64VPSUBW512
		return true
	case ssaop.OpSubUint16x8:
		v.Op = ssaop.OpAMD64VPSUBW128
		return true
	case ssaop.OpSubUint32x16:
		v.Op = ssaop.OpAMD64VPSUBD512
		return true
	case ssaop.OpSubUint32x4:
		v.Op = ssaop.OpAMD64VPSUBD128
		return true
	case ssaop.OpSubUint32x8:
		v.Op = ssaop.OpAMD64VPSUBD256
		return true
	case ssaop.OpSubUint64x2:
		v.Op = ssaop.OpAMD64VPSUBQ128
		return true
	case ssaop.OpSubUint64x4:
		v.Op = ssaop.OpAMD64VPSUBQ256
		return true
	case ssaop.OpSubUint64x8:
		v.Op = ssaop.OpAMD64VPSUBQ512
		return true
	case ssaop.OpSubUint8x16:
		v.Op = ssaop.OpAMD64VPSUBB128
		return true
	case ssaop.OpSubUint8x32:
		v.Op = ssaop.OpAMD64VPSUBB256
		return true
	case ssaop.OpSubUint8x64:
		v.Op = ssaop.OpAMD64VPSUBB512
		return true
	case ssaop.OpSumOf8AbsDiffUint8x16:
		v.Op = ssaop.OpAMD64VPSADBW128
		return true
	case ssaop.OpSumOf8AbsDiffUint8x32:
		v.Op = ssaop.OpAMD64VPSADBW256
		return true
	case ssaop.OpSumOf8AbsDiffUint8x64:
		v.Op = ssaop.OpAMD64VPSADBW512
		return true
	case ssaop.OpTailCall:
		v.Op = ssaop.OpAMD64CALLtail
		return true
	case ssaop.OpTailCallInter:
		v.Op = ssaop.OpAMD64CALLtailinter
		return true
	case ssaop.OpTrunc:
		return rewriteValue_OpTrunc(v)
	case ssaop.OpTrunc16to8:
		v.Op = ssaop.OpCopy
		return true
	case ssaop.OpTrunc32to16:
		v.Op = ssaop.OpCopy
		return true
	case ssaop.OpTrunc32to8:
		v.Op = ssaop.OpCopy
		return true
	case ssaop.OpTrunc64to16:
		v.Op = ssaop.OpCopy
		return true
	case ssaop.OpTrunc64to32:
		v.Op = ssaop.OpCopy
		return true
	case ssaop.OpTrunc64to8:
		v.Op = ssaop.OpCopy
		return true
	case ssaop.OpTruncFloat32x4:
		return rewriteValue_OpTruncFloat32x4(v)
	case ssaop.OpTruncFloat32x8:
		return rewriteValue_OpTruncFloat32x8(v)
	case ssaop.OpTruncFloat64x2:
		return rewriteValue_OpTruncFloat64x2(v)
	case ssaop.OpTruncFloat64x4:
		return rewriteValue_OpTruncFloat64x4(v)
	case ssaop.OpTruncScaledFloat32x16:
		return rewriteValue_OpTruncScaledFloat32x16(v)
	case ssaop.OpTruncScaledFloat32x4:
		return rewriteValue_OpTruncScaledFloat32x4(v)
	case ssaop.OpTruncScaledFloat32x8:
		return rewriteValue_OpTruncScaledFloat32x8(v)
	case ssaop.OpTruncScaledFloat64x2:
		return rewriteValue_OpTruncScaledFloat64x2(v)
	case ssaop.OpTruncScaledFloat64x4:
		return rewriteValue_OpTruncScaledFloat64x4(v)
	case ssaop.OpTruncScaledFloat64x8:
		return rewriteValue_OpTruncScaledFloat64x8(v)
	case ssaop.OpTruncScaledResidueFloat32x16:
		return rewriteValue_OpTruncScaledResidueFloat32x16(v)
	case ssaop.OpTruncScaledResidueFloat32x4:
		return rewriteValue_OpTruncScaledResidueFloat32x4(v)
	case ssaop.OpTruncScaledResidueFloat32x8:
		return rewriteValue_OpTruncScaledResidueFloat32x8(v)
	case ssaop.OpTruncScaledResidueFloat64x2:
		return rewriteValue_OpTruncScaledResidueFloat64x2(v)
	case ssaop.OpTruncScaledResidueFloat64x4:
		return rewriteValue_OpTruncScaledResidueFloat64x4(v)
	case ssaop.OpTruncScaledResidueFloat64x8:
		return rewriteValue_OpTruncScaledResidueFloat64x8(v)
	case ssaop.OpTruncToInt16Int32x16:
		v.Op = ssaop.OpAMD64VPMOVDW256
		return true
	case ssaop.OpTruncToInt16Int32x4:
		v.Op = ssaop.OpAMD64VPMOVDW128_128
		return true
	case ssaop.OpTruncToInt16Int32x8:
		v.Op = ssaop.OpAMD64VPMOVDW128_256
		return true
	case ssaop.OpTruncToInt16Int64x2:
		v.Op = ssaop.OpAMD64VPMOVQW128_128
		return true
	case ssaop.OpTruncToInt16Int64x4:
		v.Op = ssaop.OpAMD64VPMOVQW128_256
		return true
	case ssaop.OpTruncToInt16Int64x8:
		v.Op = ssaop.OpAMD64VPMOVQW128_512
		return true
	case ssaop.OpTruncToInt32Int64x2:
		v.Op = ssaop.OpAMD64VPMOVQD128_128
		return true
	case ssaop.OpTruncToInt32Int64x4:
		v.Op = ssaop.OpAMD64VPMOVQD128_256
		return true
	case ssaop.OpTruncToInt32Int64x8:
		v.Op = ssaop.OpAMD64VPMOVQD256
		return true
	case ssaop.OpTruncToInt8Int16x16:
		v.Op = ssaop.OpAMD64VPMOVWB128_256
		return true
	case ssaop.OpTruncToInt8Int16x32:
		v.Op = ssaop.OpAMD64VPMOVWB256
		return true
	case ssaop.OpTruncToInt8Int16x8:
		v.Op = ssaop.OpAMD64VPMOVWB128_128
		return true
	case ssaop.OpTruncToInt8Int32x16:
		v.Op = ssaop.OpAMD64VPMOVDB128_512
		return true
	case ssaop.OpTruncToInt8Int32x4:
		v.Op = ssaop.OpAMD64VPMOVDB128_128
		return true
	case ssaop.OpTruncToInt8Int32x8:
		v.Op = ssaop.OpAMD64VPMOVDB128_256
		return true
	case ssaop.OpTruncToInt8Int64x2:
		v.Op = ssaop.OpAMD64VPMOVQB128_128
		return true
	case ssaop.OpTruncToInt8Int64x4:
		v.Op = ssaop.OpAMD64VPMOVQB128_256
		return true
	case ssaop.OpTruncToInt8Int64x8:
		v.Op = ssaop.OpAMD64VPMOVQB128_512
		return true
	case ssaop.OpTruncToUint16Uint32x16:
		v.Op = ssaop.OpAMD64VPMOVDW256
		return true
	case ssaop.OpTruncToUint16Uint32x4:
		v.Op = ssaop.OpAMD64VPMOVDW128_128
		return true
	case ssaop.OpTruncToUint16Uint32x8:
		v.Op = ssaop.OpAMD64VPMOVDW128_256
		return true
	case ssaop.OpTruncToUint16Uint64x2:
		v.Op = ssaop.OpAMD64VPMOVQW128_128
		return true
	case ssaop.OpTruncToUint16Uint64x4:
		v.Op = ssaop.OpAMD64VPMOVQW128_256
		return true
	case ssaop.OpTruncToUint16Uint64x8:
		v.Op = ssaop.OpAMD64VPMOVQW128_512
		return true
	case ssaop.OpTruncToUint32Uint64x2:
		v.Op = ssaop.OpAMD64VPMOVQD128_128
		return true
	case ssaop.OpTruncToUint32Uint64x4:
		v.Op = ssaop.OpAMD64VPMOVQD128_256
		return true
	case ssaop.OpTruncToUint32Uint64x8:
		v.Op = ssaop.OpAMD64VPMOVQD256
		return true
	case ssaop.OpTruncToUint8Uint16x16:
		v.Op = ssaop.OpAMD64VPMOVWB128_256
		return true
	case ssaop.OpTruncToUint8Uint16x32:
		v.Op = ssaop.OpAMD64VPMOVWB256
		return true
	case ssaop.OpTruncToUint8Uint16x8:
		v.Op = ssaop.OpAMD64VPMOVWB128_128
		return true
	case ssaop.OpTruncToUint8Uint32x16:
		v.Op = ssaop.OpAMD64VPMOVDB128_512
		return true
	case ssaop.OpTruncToUint8Uint32x4:
		v.Op = ssaop.OpAMD64VPMOVDB128_128
		return true
	case ssaop.OpTruncToUint8Uint32x8:
		v.Op = ssaop.OpAMD64VPMOVDB128_256
		return true
	case ssaop.OpTruncToUint8Uint64x2:
		v.Op = ssaop.OpAMD64VPMOVQB128_128
		return true
	case ssaop.OpTruncToUint8Uint64x4:
		v.Op = ssaop.OpAMD64VPMOVQB128_256
		return true
	case ssaop.OpTruncToUint8Uint64x8:
		v.Op = ssaop.OpAMD64VPMOVQB128_512
		return true
	case ssaop.OpWB:
		v.Op = ssaop.OpAMD64LoweredWB
		return true
	case ssaop.OpXor16:
		v.Op = ssaop.OpAMD64XORL
		return true
	case ssaop.OpXor32:
		v.Op = ssaop.OpAMD64XORL
		return true
	case ssaop.OpXor64:
		v.Op = ssaop.OpAMD64XORQ
		return true
	case ssaop.OpXor8:
		v.Op = ssaop.OpAMD64XORL
		return true
	case ssaop.OpXorInt16x16:
		v.Op = ssaop.OpAMD64VPXOR256
		return true
	case ssaop.OpXorInt16x32:
		v.Op = ssaop.OpAMD64VPXORD512
		return true
	case ssaop.OpXorInt16x8:
		v.Op = ssaop.OpAMD64VPXOR128
		return true
	case ssaop.OpXorInt32x16:
		v.Op = ssaop.OpAMD64VPXORD512
		return true
	case ssaop.OpXorInt32x4:
		v.Op = ssaop.OpAMD64VPXOR128
		return true
	case ssaop.OpXorInt32x8:
		v.Op = ssaop.OpAMD64VPXOR256
		return true
	case ssaop.OpXorInt64x2:
		v.Op = ssaop.OpAMD64VPXOR128
		return true
	case ssaop.OpXorInt64x4:
		v.Op = ssaop.OpAMD64VPXOR256
		return true
	case ssaop.OpXorInt64x8:
		v.Op = ssaop.OpAMD64VPXORQ512
		return true
	case ssaop.OpXorInt8x16:
		v.Op = ssaop.OpAMD64VPXOR128
		return true
	case ssaop.OpXorInt8x32:
		v.Op = ssaop.OpAMD64VPXOR256
		return true
	case ssaop.OpXorInt8x64:
		v.Op = ssaop.OpAMD64VPXORD512
		return true
	case ssaop.OpXorUint16x16:
		v.Op = ssaop.OpAMD64VPXOR256
		return true
	case ssaop.OpXorUint16x32:
		v.Op = ssaop.OpAMD64VPXORD512
		return true
	case ssaop.OpXorUint16x8:
		v.Op = ssaop.OpAMD64VPXOR128
		return true
	case ssaop.OpXorUint32x16:
		v.Op = ssaop.OpAMD64VPXORD512
		return true
	case ssaop.OpXorUint32x4:
		v.Op = ssaop.OpAMD64VPXOR128
		return true
	case ssaop.OpXorUint32x8:
		v.Op = ssaop.OpAMD64VPXOR256
		return true
	case ssaop.OpXorUint64x2:
		v.Op = ssaop.OpAMD64VPXOR128
		return true
	case ssaop.OpXorUint64x4:
		v.Op = ssaop.OpAMD64VPXOR256
		return true
	case ssaop.OpXorUint64x8:
		v.Op = ssaop.OpAMD64VPXORQ512
		return true
	case ssaop.OpXorUint8x16:
		v.Op = ssaop.OpAMD64VPXOR128
		return true
	case ssaop.OpXorUint8x32:
		v.Op = ssaop.OpAMD64VPXOR256
		return true
	case ssaop.OpXorUint8x64:
		v.Op = ssaop.OpAMD64VPXORD512
		return true
	case ssaop.OpZero:
		return rewriteValue_OpZero(v)
	case ssaop.OpZeroExt16to32:
		v.Op = ssaop.OpAMD64MOVWQZX
		return true
	case ssaop.OpZeroExt16to64:
		v.Op = ssaop.OpAMD64MOVWQZX
		return true
	case ssaop.OpZeroExt32to64:
		v.Op = ssaop.OpAMD64MOVLQZX
		return true
	case ssaop.OpZeroExt8to16:
		v.Op = ssaop.OpAMD64MOVBQZX
		return true
	case ssaop.OpZeroExt8to32:
		v.Op = ssaop.OpAMD64MOVBQZX
		return true
	case ssaop.OpZeroExt8to64:
		v.Op = ssaop.OpAMD64MOVBQZX
		return true
	case ssaop.OpZeroSIMD:
		return rewriteValue_OpZeroSIMD(v)
	case ssaop.OpblendInt8x16:
		v.Op = ssaop.OpAMD64VPBLENDVB128
		return true
	case ssaop.OpblendInt8x32:
		v.Op = ssaop.OpAMD64VPBLENDVB256
		return true
	case ssaop.OpblendMaskedInt16x32:
		return rewriteValue_OpblendMaskedInt16x32(v)
	case ssaop.OpblendMaskedInt32x16:
		return rewriteValue_OpblendMaskedInt32x16(v)
	case ssaop.OpblendMaskedInt64x8:
		return rewriteValue_OpblendMaskedInt64x8(v)
	case ssaop.OpblendMaskedInt8x64:
		return rewriteValue_OpblendMaskedInt8x64(v)
	case ssaop.Opbroadcast1To16Float32x4:
		v.Op = ssaop.OpAMD64VBROADCASTSS512
		return true
	case ssaop.Opbroadcast1To16Int16x8:
		v.Op = ssaop.OpAMD64VPBROADCASTW256
		return true
	case ssaop.Opbroadcast1To16Int32x4:
		v.Op = ssaop.OpAMD64VPBROADCASTD512
		return true
	case ssaop.Opbroadcast1To16Int8x16:
		v.Op = ssaop.OpAMD64VPBROADCASTB128
		return true
	case ssaop.Opbroadcast1To16MaskedFloat32x4:
		return rewriteValue_Opbroadcast1To16MaskedFloat32x4(v)
	case ssaop.Opbroadcast1To16MaskedInt16x8:
		return rewriteValue_Opbroadcast1To16MaskedInt16x8(v)
	case ssaop.Opbroadcast1To16MaskedInt32x4:
		return rewriteValue_Opbroadcast1To16MaskedInt32x4(v)
	case ssaop.Opbroadcast1To16MaskedInt8x16:
		return rewriteValue_Opbroadcast1To16MaskedInt8x16(v)
	case ssaop.Opbroadcast1To16MaskedUint16x8:
		return rewriteValue_Opbroadcast1To16MaskedUint16x8(v)
	case ssaop.Opbroadcast1To16MaskedUint32x4:
		return rewriteValue_Opbroadcast1To16MaskedUint32x4(v)
	case ssaop.Opbroadcast1To16MaskedUint8x16:
		return rewriteValue_Opbroadcast1To16MaskedUint8x16(v)
	case ssaop.Opbroadcast1To16Uint16x8:
		v.Op = ssaop.OpAMD64VPBROADCASTW256
		return true
	case ssaop.Opbroadcast1To16Uint32x4:
		v.Op = ssaop.OpAMD64VPBROADCASTD512
		return true
	case ssaop.Opbroadcast1To16Uint8x16:
		v.Op = ssaop.OpAMD64VPBROADCASTB128
		return true
	case ssaop.Opbroadcast1To2Float64x2:
		v.Op = ssaop.OpAMD64VPBROADCASTQ128
		return true
	case ssaop.Opbroadcast1To2Int64x2:
		v.Op = ssaop.OpAMD64VPBROADCASTQ128
		return true
	case ssaop.Opbroadcast1To2MaskedFloat64x2:
		return rewriteValue_Opbroadcast1To2MaskedFloat64x2(v)
	case ssaop.Opbroadcast1To2MaskedInt64x2:
		return rewriteValue_Opbroadcast1To2MaskedInt64x2(v)
	case ssaop.Opbroadcast1To2MaskedUint64x2:
		return rewriteValue_Opbroadcast1To2MaskedUint64x2(v)
	case ssaop.Opbroadcast1To2Uint64x2:
		v.Op = ssaop.OpAMD64VPBROADCASTQ128
		return true
	case ssaop.Opbroadcast1To32Int16x8:
		v.Op = ssaop.OpAMD64VPBROADCASTW512
		return true
	case ssaop.Opbroadcast1To32Int8x16:
		v.Op = ssaop.OpAMD64VPBROADCASTB256
		return true
	case ssaop.Opbroadcast1To32MaskedInt16x8:
		return rewriteValue_Opbroadcast1To32MaskedInt16x8(v)
	case ssaop.Opbroadcast1To32MaskedInt8x16:
		return rewriteValue_Opbroadcast1To32MaskedInt8x16(v)
	case ssaop.Opbroadcast1To32MaskedUint16x8:
		return rewriteValue_Opbroadcast1To32MaskedUint16x8(v)
	case ssaop.Opbroadcast1To32MaskedUint8x16:
		return rewriteValue_Opbroadcast1To32MaskedUint8x16(v)
	case ssaop.Opbroadcast1To32Uint16x8:
		v.Op = ssaop.OpAMD64VPBROADCASTW512
		return true
	case ssaop.Opbroadcast1To32Uint8x16:
		v.Op = ssaop.OpAMD64VPBROADCASTB256
		return true
	case ssaop.Opbroadcast1To4Float32x4:
		v.Op = ssaop.OpAMD64VBROADCASTSS128
		return true
	case ssaop.Opbroadcast1To4Float64x2:
		v.Op = ssaop.OpAMD64VBROADCASTSD256
		return true
	case ssaop.Opbroadcast1To4Int32x4:
		v.Op = ssaop.OpAMD64VPBROADCASTD128
		return true
	case ssaop.Opbroadcast1To4Int64x2:
		v.Op = ssaop.OpAMD64VPBROADCASTQ256
		return true
	case ssaop.Opbroadcast1To4MaskedFloat32x4:
		return rewriteValue_Opbroadcast1To4MaskedFloat32x4(v)
	case ssaop.Opbroadcast1To4MaskedFloat64x2:
		return rewriteValue_Opbroadcast1To4MaskedFloat64x2(v)
	case ssaop.Opbroadcast1To4MaskedInt32x4:
		return rewriteValue_Opbroadcast1To4MaskedInt32x4(v)
	case ssaop.Opbroadcast1To4MaskedInt64x2:
		return rewriteValue_Opbroadcast1To4MaskedInt64x2(v)
	case ssaop.Opbroadcast1To4MaskedUint32x4:
		return rewriteValue_Opbroadcast1To4MaskedUint32x4(v)
	case ssaop.Opbroadcast1To4MaskedUint64x2:
		return rewriteValue_Opbroadcast1To4MaskedUint64x2(v)
	case ssaop.Opbroadcast1To4Uint32x4:
		v.Op = ssaop.OpAMD64VPBROADCASTD128
		return true
	case ssaop.Opbroadcast1To4Uint64x2:
		v.Op = ssaop.OpAMD64VPBROADCASTQ256
		return true
	case ssaop.Opbroadcast1To64Int8x16:
		v.Op = ssaop.OpAMD64VPBROADCASTB512
		return true
	case ssaop.Opbroadcast1To64MaskedInt8x16:
		return rewriteValue_Opbroadcast1To64MaskedInt8x16(v)
	case ssaop.Opbroadcast1To64MaskedUint8x16:
		return rewriteValue_Opbroadcast1To64MaskedUint8x16(v)
	case ssaop.Opbroadcast1To64Uint8x16:
		v.Op = ssaop.OpAMD64VPBROADCASTB512
		return true
	case ssaop.Opbroadcast1To8Float32x4:
		v.Op = ssaop.OpAMD64VBROADCASTSS256
		return true
	case ssaop.Opbroadcast1To8Float64x2:
		v.Op = ssaop.OpAMD64VBROADCASTSD512
		return true
	case ssaop.Opbroadcast1To8Int16x8:
		v.Op = ssaop.OpAMD64VPBROADCASTW128
		return true
	case ssaop.Opbroadcast1To8Int32x4:
		v.Op = ssaop.OpAMD64VPBROADCASTD256
		return true
	case ssaop.Opbroadcast1To8Int64x2:
		v.Op = ssaop.OpAMD64VPBROADCASTQ512
		return true
	case ssaop.Opbroadcast1To8MaskedFloat32x4:
		return rewriteValue_Opbroadcast1To8MaskedFloat32x4(v)
	case ssaop.Opbroadcast1To8MaskedFloat64x2:
		return rewriteValue_Opbroadcast1To8MaskedFloat64x2(v)
	case ssaop.Opbroadcast1To8MaskedInt16x8:
		return rewriteValue_Opbroadcast1To8MaskedInt16x8(v)
	case ssaop.Opbroadcast1To8MaskedInt32x4:
		return rewriteValue_Opbroadcast1To8MaskedInt32x4(v)
	case ssaop.Opbroadcast1To8MaskedInt64x2:
		return rewriteValue_Opbroadcast1To8MaskedInt64x2(v)
	case ssaop.Opbroadcast1To8MaskedUint16x8:
		return rewriteValue_Opbroadcast1To8MaskedUint16x8(v)
	case ssaop.Opbroadcast1To8MaskedUint32x4:
		return rewriteValue_Opbroadcast1To8MaskedUint32x4(v)
	case ssaop.Opbroadcast1To8MaskedUint64x2:
		return rewriteValue_Opbroadcast1To8MaskedUint64x2(v)
	case ssaop.Opbroadcast1To8Uint16x8:
		v.Op = ssaop.OpAMD64VPBROADCASTW128
		return true
	case ssaop.Opbroadcast1To8Uint32x4:
		v.Op = ssaop.OpAMD64VPBROADCASTD256
		return true
	case ssaop.Opbroadcast1To8Uint64x2:
		v.Op = ssaop.OpAMD64VPBROADCASTQ512
		return true
	case ssaop.OpcarrylessMultiplyUint64x2:
		v.Op = ssaop.OpAMD64VPCLMULQDQ128
		return true
	case ssaop.OpcarrylessMultiplyUint64x4:
		v.Op = ssaop.OpAMD64VPCLMULQDQ256
		return true
	case ssaop.OpcarrylessMultiplyUint64x8:
		v.Op = ssaop.OpAMD64VPCLMULQDQ512
		return true
	case ssaop.OpconcatSelectedConstantFloat32x4:
		v.Op = ssaop.OpAMD64VSHUFPS128
		return true
	case ssaop.OpconcatSelectedConstantFloat64x2:
		v.Op = ssaop.OpAMD64VSHUFPD128
		return true
	case ssaop.OpconcatSelectedConstantGroupedFloat32x16:
		v.Op = ssaop.OpAMD64VSHUFPS512
		return true
	case ssaop.OpconcatSelectedConstantGroupedFloat32x8:
		v.Op = ssaop.OpAMD64VSHUFPS256
		return true
	case ssaop.OpconcatSelectedConstantGroupedFloat64x4:
		v.Op = ssaop.OpAMD64VSHUFPD256
		return true
	case ssaop.OpconcatSelectedConstantGroupedFloat64x8:
		v.Op = ssaop.OpAMD64VSHUFPD512
		return true
	case ssaop.OpconcatSelectedConstantGroupedInt32x16:
		v.Op = ssaop.OpAMD64VSHUFPS512
		return true
	case ssaop.OpconcatSelectedConstantGroupedInt32x8:
		v.Op = ssaop.OpAMD64VSHUFPS256
		return true
	case ssaop.OpconcatSelectedConstantGroupedInt64x4:
		v.Op = ssaop.OpAMD64VSHUFPD256
		return true
	case ssaop.OpconcatSelectedConstantGroupedInt64x8:
		v.Op = ssaop.OpAMD64VSHUFPD512
		return true
	case ssaop.OpconcatSelectedConstantGroupedUint32x16:
		v.Op = ssaop.OpAMD64VSHUFPS512
		return true
	case ssaop.OpconcatSelectedConstantGroupedUint32x8:
		v.Op = ssaop.OpAMD64VSHUFPS256
		return true
	case ssaop.OpconcatSelectedConstantGroupedUint64x4:
		v.Op = ssaop.OpAMD64VSHUFPD256
		return true
	case ssaop.OpconcatSelectedConstantGroupedUint64x8:
		v.Op = ssaop.OpAMD64VSHUFPD512
		return true
	case ssaop.OpconcatSelectedConstantInt32x4:
		v.Op = ssaop.OpAMD64VSHUFPS128
		return true
	case ssaop.OpconcatSelectedConstantInt64x2:
		v.Op = ssaop.OpAMD64VSHUFPD128
		return true
	case ssaop.OpconcatSelectedConstantUint32x4:
		v.Op = ssaop.OpAMD64VSHUFPS128
		return true
	case ssaop.OpconcatSelectedConstantUint64x2:
		v.Op = ssaop.OpAMD64VSHUFPD128
		return true
	case ssaop.OppermuteScalarsGroupedInt32x16:
		v.Op = ssaop.OpAMD64VPSHUFD512
		return true
	case ssaop.OppermuteScalarsGroupedInt32x8:
		v.Op = ssaop.OpAMD64VPSHUFD256
		return true
	case ssaop.OppermuteScalarsGroupedUint32x16:
		v.Op = ssaop.OpAMD64VPSHUFD512
		return true
	case ssaop.OppermuteScalarsGroupedUint32x8:
		v.Op = ssaop.OpAMD64VPSHUFD256
		return true
	case ssaop.OppermuteScalarsHiGroupedInt16x16:
		v.Op = ssaop.OpAMD64VPSHUFHW256
		return true
	case ssaop.OppermuteScalarsHiGroupedInt16x32:
		v.Op = ssaop.OpAMD64VPSHUFHW512
		return true
	case ssaop.OppermuteScalarsHiGroupedUint16x16:
		v.Op = ssaop.OpAMD64VPSHUFHW256
		return true
	case ssaop.OppermuteScalarsHiGroupedUint16x32:
		v.Op = ssaop.OpAMD64VPSHUFHW512
		return true
	case ssaop.OppermuteScalarsHiInt16x8:
		v.Op = ssaop.OpAMD64VPSHUFHW128
		return true
	case ssaop.OppermuteScalarsHiUint16x8:
		v.Op = ssaop.OpAMD64VPSHUFHW128
		return true
	case ssaop.OppermuteScalarsInt32x4:
		v.Op = ssaop.OpAMD64VPSHUFD128
		return true
	case ssaop.OppermuteScalarsLoGroupedInt16x16:
		v.Op = ssaop.OpAMD64VPSHUFLW256
		return true
	case ssaop.OppermuteScalarsLoGroupedInt16x32:
		v.Op = ssaop.OpAMD64VPSHUFLW512
		return true
	case ssaop.OppermuteScalarsLoGroupedUint16x16:
		v.Op = ssaop.OpAMD64VPSHUFLW256
		return true
	case ssaop.OppermuteScalarsLoGroupedUint16x32:
		v.Op = ssaop.OpAMD64VPSHUFLW512
		return true
	case ssaop.OppermuteScalarsLoInt16x8:
		v.Op = ssaop.OpAMD64VPSHUFLW128
		return true
	case ssaop.OppermuteScalarsLoUint16x8:
		v.Op = ssaop.OpAMD64VPSHUFLW128
		return true
	case ssaop.OppermuteScalarsUint32x4:
		v.Op = ssaop.OpAMD64VPSHUFD128
		return true
	case ssaop.OpternInt32x16:
		v.Op = ssaop.OpAMD64VPTERNLOGD512
		return true
	case ssaop.OpternInt32x4:
		v.Op = ssaop.OpAMD64VPTERNLOGD128
		return true
	case ssaop.OpternInt32x8:
		v.Op = ssaop.OpAMD64VPTERNLOGD256
		return true
	case ssaop.OpternInt64x2:
		v.Op = ssaop.OpAMD64VPTERNLOGQ128
		return true
	case ssaop.OpternInt64x4:
		v.Op = ssaop.OpAMD64VPTERNLOGQ256
		return true
	case ssaop.OpternInt64x8:
		v.Op = ssaop.OpAMD64VPTERNLOGQ512
		return true
	case ssaop.OpternUint32x16:
		v.Op = ssaop.OpAMD64VPTERNLOGD512
		return true
	case ssaop.OpternUint32x4:
		v.Op = ssaop.OpAMD64VPTERNLOGD128
		return true
	case ssaop.OpternUint32x8:
		v.Op = ssaop.OpAMD64VPTERNLOGD256
		return true
	case ssaop.OpternUint64x2:
		v.Op = ssaop.OpAMD64VPTERNLOGQ128
		return true
	case ssaop.OpternUint64x4:
		v.Op = ssaop.OpAMD64VPTERNLOGQ256
		return true
	case ssaop.OpternUint64x8:
		v.Op = ssaop.OpAMD64VPTERNLOGQ512
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADCQ(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ADCQ x (MOVQconst [c]) carry)
	// cond: ssa.Is32Bit(c)
	// result: (ADCQconst x [int32(c)] carry)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1.AuxInt)
			carry := v_2
			if !(ssa.Is32Bit(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ADCQconst)
			v.AuxInt = ssa.Int32ToAuxInt(int32(c))
			v.AddArg2(x, carry)
			return true
		}
		break
	}
	// match: (ADCQ x y (FlagEQ))
	// result: (ADDQcarry x y)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQcarry)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADCQ x y (InvertFlags f))
	// result: (ADCQ x y (Select1 <types.TypeFlags> (NEGLflags (MOVBQZX <types.Types[types.TUINT32]> (SETA <types.Types[types.TUINT8]> f)))))
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		f := v_2.Args[0]
		v.Reset(ssaop.OpAMD64ADCQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGLflags, types.NewTuple(typ.UInt32, types.TypeFlags))
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBQZX, types.Types[types.TUINT32])
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64SETA, types.Types[types.TUINT8])
		v3.AddArg(f)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg(v1)
		v.AddArg3(x, y, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADCQconst(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ADCQconst x [c] (FlagEQ))
	// result: (ADDQconstcarry x [c])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		x := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconstcarry)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (ADCQconst x [c] (InvertFlags f))
	// result: (ADCQconst x [c] (Select1 <types.TypeFlags> (NEGLflags (MOVBQZX <types.Types[types.TUINT32]> (SETA <types.Types[types.TUINT8]> f)))))
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		x := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		f := v_1.Args[0]
		v.Reset(ssaop.OpAMD64ADCQconst)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGLflags, types.NewTuple(typ.UInt32, types.TypeFlags))
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBQZX, types.Types[types.TUINT32])
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64SETA, types.Types[types.TUINT8])
		v3.AddArg(f)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg(v1)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDBconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDBconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ADDBconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ADDBconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ADDBconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDL (SHRLconst [1] x) (SHRLconst [1] x))
	// result: (ANDLconst [-2] x)
	for {
		if v_0.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(v_0.AuxInt) != 1 {
			break
		}
		x := v_0.Args[0]
		if v_1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(v_1.AuxInt) != 1 || x != v_1.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(-2)
		v.AddArg(x)
		return true
	}
	// match: (ADDL x (MOVLconst [c]))
	// result: (ADDLconst [c] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1.AuxInt)
			v.Reset(ssaop.OpAMD64ADDLconst)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ADDL x (SHLLconst [3] y))
	// result: (LEAL8 x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(v_1.AuxInt) != 3 {
				continue
			}
			y := v_1.Args[0]
			v.Reset(ssaop.OpAMD64LEAL8)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDL x (SHLLconst [2] y))
	// result: (LEAL4 x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(v_1.AuxInt) != 2 {
				continue
			}
			y := v_1.Args[0]
			v.Reset(ssaop.OpAMD64LEAL4)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDL x (ADDL y y))
	// result: (LEAL2 x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64ADDL {
				continue
			}
			y := v_1.Args[1]
			if y != v_1.Args[0] {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAL2)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDL x (ADDL x y))
	// result: (LEAL2 y x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64ADDL {
				continue
			}
			_ = v_1.Args[1]
			v_1_0 := v_1.Args[0]
			v_1_1 := v_1.Args[1]
			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
				if x != v_1_0 {
					continue
				}
				y := v_1_1
				v.Reset(ssaop.OpAMD64LEAL2)
				v.AddArg2(y, x)
				return true
			}
		}
		break
	}
	// match: (ADDL (ADDLconst [c] x) y)
	// result: (LEAL1 [c] x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64ADDLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_0.Args[0]
			y := v_1
			v.Reset(ssaop.OpAMD64LEAL1)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDL x (LEAL [c] {s} y))
	// cond: x.Op != ssaop.OpSB && y.Op != ssaop.OpSB
	// result: (LEAL1 [c] {s} x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64LEAL {
				continue
			}
			c := ssa.AuxIntToInt32(v_1.AuxInt)
			s := ssa.AuxToSym(v_1.Aux)
			y := v_1.Args[0]
			if !(x.Op != ssaop.OpSB && y.Op != ssaop.OpSB) {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAL1)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDL x (NEGL y))
	// result: (SUBL x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64NEGL {
				continue
			}
			y := v_1.Args[0]
			v.Reset(ssaop.OpAMD64SUBL)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDL x l:(MOVLload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (ADDLload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVLload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ADDLload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64ADDLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (ADDLconst [c] (ADDL x y))
	// result: (LEAL1 [c] x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDL {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64LEAL1)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADDLconst [c] (ADDL x x))
	// result: (LEAL1 [c] x x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDL {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL1)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg2(x, x)
		return true
	}
	// match: (ADDLconst [c] (LEAL [d] {s} x))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAL [c+d] {s} x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64LEAL {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		s := ssa.AuxToSym(v_0.Aux)
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg(x)
		return true
	}
	// match: (ADDLconst [c] (LEAL1 [d] {s} x y))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAL1 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64LEAL1 {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		s := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL1)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADDLconst [c] (LEAL2 [d] {s} x y))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAL2 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64LEAL2 {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		s := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL2)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADDLconst [c] (LEAL4 [d] {s} x y))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAL4 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64LEAL4 {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		s := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL4)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADDLconst [c] (LEAL8 [d] {s} x y))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAL8 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64LEAL8 {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		s := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL8)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADDLconst [0] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (ADDLconst [c] (MOVLconst [d]))
	// result: (MOVLconst [c+d])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		return true
	}
	// match: (ADDLconst [c] (ADDLconst [d] x))
	// result: (ADDLconst [c+d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ADDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.AddArg(x)
		return true
	}
	// match: (ADDLconst [off] x:(SP))
	// result: (LEAL [off] x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		x := v_0
		if x.Op != ssaop.OpSP {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDLconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ADDLconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ADDLconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ADDLconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDLload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ADDLload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ADDLload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ADDLload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ADDLload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ADDLload x [off] {sym} ptr (MOVSSstore [off] {sym} ptr y _))
	// result: (ADDL x (MOVLf2i y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVSSstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ADDL)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVLf2i, typ.UInt32)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDLlock(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDLlock [off] {sym} ptr n:(NEGL val) mem)
	// cond: n.Uses == 1
	// result: (SUBLlock [off] {sym} ptr val mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		n := v_1
		if n.Op != ssaop.OpAMD64NEGL {
			break
		}
		val := n.Args[0]
		mem := v_2
		if !(n.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBLlock)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (ADDLlock [off] {sym} ptr (MOVLconst [1]) mem)
	// result: (INCLlock [off] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_1.AuxInt) != 1 {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64INCLlock)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (ADDLlock [off] {sym} ptr (MOVLconst [-1]) mem)
	// result: (DECLlock [off] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_1.AuxInt) != -1 {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64DECLlock)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDLmodify(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDLmodify [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ADDLmodify [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (ADDLmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ADDLmodify [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ADDQ x (MOVBQZX (SETB flags)))
	// result: (Select0 (ADCQconst [0] x flags))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := v_1_0.Args[0]
			v.Reset(ssaop.OpSelect0)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ADCQconst, types.NewTuple(typ.UInt64, types.TypeFlags))
			v0.AuxInt = ssa.Int32ToAuxInt(0)
			v0.AddArg2(x, flags)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (ADDQ (SHRQconst [1] x) (SHRQconst [1] x))
	// result: (ANDQconst [-2] x)
	for {
		if v_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(v_0.AuxInt) != 1 {
			break
		}
		x := v_0.Args[0]
		if v_1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(v_1.AuxInt) != 1 || x != v_1.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQconst)
		v.AuxInt = ssa.Int32ToAuxInt(-2)
		v.AddArg(x)
		return true
	}
	// match: (ADDQ x (MOVQconst <t> [c]))
	// cond: ssa.Is32Bit(c) && !t.IsPtr()
	// result: (ADDQconst [int32(c)] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			t := v_1.Type
			c := ssa.AuxIntToInt64(v_1.AuxInt)
			if !(ssa.Is32Bit(c) && !t.IsPtr()) {
				continue
			}
			v.Reset(ssaop.OpAMD64ADDQconst)
			v.AuxInt = ssa.Int32ToAuxInt(int32(c))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ADDQ x (MOVLconst [c]))
	// result: (ADDQconst [c] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1.AuxInt)
			v.Reset(ssaop.OpAMD64ADDQconst)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ADDQ x (SHLQconst [3] y))
	// result: (LEAQ8 x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(v_1.AuxInt) != 3 {
				continue
			}
			y := v_1.Args[0]
			v.Reset(ssaop.OpAMD64LEAQ8)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDQ x (SHLQconst [2] y))
	// result: (LEAQ4 x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(v_1.AuxInt) != 2 {
				continue
			}
			y := v_1.Args[0]
			v.Reset(ssaop.OpAMD64LEAQ4)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDQ x (ADDQ y y))
	// result: (LEAQ2 x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64ADDQ {
				continue
			}
			y := v_1.Args[1]
			if y != v_1.Args[0] {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAQ2)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDQ x (ADDQ x y))
	// result: (LEAQ2 y x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64ADDQ {
				continue
			}
			_ = v_1.Args[1]
			v_1_0 := v_1.Args[0]
			v_1_1 := v_1.Args[1]
			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
				if x != v_1_0 {
					continue
				}
				y := v_1_1
				v.Reset(ssaop.OpAMD64LEAQ2)
				v.AddArg2(y, x)
				return true
			}
		}
		break
	}
	// match: (ADDQ (ADDQconst [c] x) y)
	// result: (LEAQ1 [c] x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64ADDQconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_0.Args[0]
			y := v_1
			v.Reset(ssaop.OpAMD64LEAQ1)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDQ x (LEAQ [c] {s} y))
	// cond: x.Op != ssaop.OpSB && y.Op != ssaop.OpSB
	// result: (LEAQ1 [c] {s} x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64LEAQ {
				continue
			}
			c := ssa.AuxIntToInt32(v_1.AuxInt)
			s := ssa.AuxToSym(v_1.Aux)
			y := v_1.Args[0]
			if !(x.Op != ssaop.OpSB && y.Op != ssaop.OpSB) {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAQ1)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDQ x (NEGQ y))
	// result: (SUBQ x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64NEGQ {
				continue
			}
			y := v_1.Args[0]
			v.Reset(ssaop.OpAMD64SUBQ)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ADDQ x l:(MOVQload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (ADDQload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVQload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ADDQload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64ADDQcarry(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDQcarry x (MOVQconst [c]))
	// cond: ssa.Is32Bit(c)
	// result: (ADDQconstcarry x [int32(c)])
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1.AuxInt)
			if !(ssa.Is32Bit(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ADDQconstcarry)
			v.AuxInt = ssa.Int32ToAuxInt(int32(c))
			v.AddArg(x)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64ADDQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (ADDQconst [c] (ADDQ x y))
	// result: (LEAQ1 [c] x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDQ {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64LEAQ1)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADDQconst [c] (ADDQ x x))
	// result: (LEAQ1 [c] x x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDQ {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ1)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg2(x, x)
		return true
	}
	// match: (ADDQconst [c] (LEAQ [d] {s} x))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAQ [c+d] {s} x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		s := ssa.AuxToSym(v_0.Aux)
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg(x)
		return true
	}
	// match: (ADDQconst [c] (LEAQ1 [d] {s} x y))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAQ1 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64LEAQ1 {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		s := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ1)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADDQconst [c] (LEAQ2 [d] {s} x y))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAQ2 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64LEAQ2 {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		s := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ2)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADDQconst [c] (LEAQ4 [d] {s} x y))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAQ4 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64LEAQ4 {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		s := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ4)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADDQconst [c] (LEAQ8 [d] {s} x y))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAQ8 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64LEAQ8 {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		s := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ8)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (ADDQconst [0] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (ADDQconst [c] (MOVQconst [d]))
	// result: (MOVQconst [int64(c)+d])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(c) + d)
		return true
	}
	// match: (ADDQconst [c] (ADDQconst [d] x))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (ADDQconst [c+d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconst)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.AddArg(x)
		return true
	}
	// match: (ADDQconst [off] x:(SP))
	// result: (LEAQ [off] x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		x := v_0
		if x.Op != ssaop.OpSP {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDQconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ADDQconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ADDQconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ADDQconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDQload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ADDQload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ADDQload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ADDQload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ADDQload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ADDQload x [off] {sym} ptr (MOVSDstore [off] {sym} ptr y _))
	// result: (ADDQ x (MOVQf2i y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVSDstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQ)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVQf2i, typ.UInt64)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDQlock(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDQlock [off] {sym} ptr n:(NEGQ val) mem)
	// cond: n.Uses == 1
	// result: (SUBQlock [off] {sym} ptr val mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		n := v_1
		if n.Op != ssaop.OpAMD64NEGQ {
			break
		}
		val := n.Args[0]
		mem := v_2
		if !(n.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQlock)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (ADDQlock [off] {sym} ptr (MOVQconst [1]) mem)
	// result: (INCQlock [off] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_1.AuxInt) != 1 {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64INCQlock)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (ADDQlock [off] {sym} ptr (MOVQconst [-1]) mem)
	// result: (DECQlock [off] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_1.AuxInt) != -1 {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64DECQlock)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDQmodify(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDQmodify [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ADDQmodify [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (ADDQmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ADDQmodify [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDSD(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDSD x l:(MOVSDload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (ADDSDload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVSDload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ADDSDload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	// match: (ADDSD (MULSD x y) z)
	// cond: buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)
	// result: (VFMADD231SD z x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64MULSD {
				continue
			}
			y := v_0.Args[1]
			x := v_0.Args[0]
			z := v_1
			if !(buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VFMADD231SD)
			v.AddArg3(z, x, y)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64ADDSDload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ADDSDload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ADDSDload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ADDSDload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ADDSDload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ADDSDload x [off] {sym} ptr (MOVQstore [off] {sym} ptr y _))
	// result: (ADDSD x (MOVQi2f y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVQstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ADDSD)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVQi2f, typ.Float64)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDSS(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDSS x l:(MOVSSload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (ADDSSload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVSSload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ADDSSload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	// match: (ADDSS (MULSS x y) z)
	// cond: buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)
	// result: (VFMADD231SS z x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64MULSS {
				continue
			}
			y := v_0.Args[1]
			x := v_0.Args[0]
			z := v_1
			if !(buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VFMADD231SS)
			v.AddArg3(z, x, y)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64ADDSSload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ADDSSload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ADDSSload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ADDSSload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ADDSSload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ADDSSload x [off] {sym} ptr (MOVLstore [off] {sym} ptr y _))
	// result: (ADDSS x (MOVLi2f y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVLstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ADDSS)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVLi2f, typ.Float32)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ADDWconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ADDWconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ADDWconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ADDWconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ADDWconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDBconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ANDBconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ANDBconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ANDBconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ANDBconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ANDL (NOTL (SHLL (MOVLconst [1]) y)) x)
	// result: (BTRL x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64NOTL {
				continue
			}
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SHLL {
				continue
			}
			y := v_0_0.Args[1]
			v_0_0_0 := v_0_0.Args[0]
			if v_0_0_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_0_0_0.AuxInt) != 1 {
				continue
			}
			x := v_1
			v.Reset(ssaop.OpAMD64BTRL)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ANDL x (MOVLconst [c]))
	// result: (ANDLconst [c] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1.AuxInt)
			v.Reset(ssaop.OpAMD64ANDLconst)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ANDL x x)
	// result: x
	for {
		x := v_0
		if x != v_1 {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (ANDL x l:(MOVLload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (ANDLload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVLload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ANDLload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	// match: (ANDL x (NOTL y))
	// cond: buildcfg.GOAMD64 >= 3
	// result: (ANDNL x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64NOTL {
				continue
			}
			y := v_1.Args[0]
			if !(buildcfg.GOAMD64 >= 3) {
				continue
			}
			v.Reset(ssaop.OpAMD64ANDNL)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ANDL x (NEGL x))
	// cond: buildcfg.GOAMD64 >= 3
	// result: (BLSIL x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64NEGL || x != v_1.Args[0] || !(buildcfg.GOAMD64 >= 3) {
				continue
			}
			v.Reset(ssaop.OpAMD64BLSIL)
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ANDL <t> x (ADDLconst [-1] x))
	// cond: buildcfg.GOAMD64 >= 3
	// result: (Select0 <t> (BLSRL x))
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64ADDLconst || ssa.AuxIntToInt32(v_1.AuxInt) != -1 || x != v_1.Args[0] || !(buildcfg.GOAMD64 >= 3) {
				continue
			}
			v.Reset(ssaop.OpSelect0)
			v.Type = t
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BLSRL, types.NewTuple(typ.UInt32, types.TypeFlags))
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64ANDLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (ANDLconst [c] (ANDLconst [d] x))
	// result: (ANDLconst [c & d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c & d)
		v.AddArg(x)
		return true
	}
	// match: (ANDLconst [ 0xFF] x)
	// result: (MOVBQZX x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0xFF {
			break
		}
		x := v_0
		v.Reset(ssaop.OpAMD64MOVBQZX)
		v.AddArg(x)
		return true
	}
	// match: (ANDLconst [0xFFFF] x)
	// result: (MOVWQZX x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0xFFFF {
			break
		}
		x := v_0
		v.Reset(ssaop.OpAMD64MOVWQZX)
		v.AddArg(x)
		return true
	}
	// match: (ANDLconst [0] _)
	// result: (MOVLconst [0])
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (ANDLconst [-1] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != -1 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (ANDLconst [c] (MOVLconst [d]))
	// result: (MOVLconst [c&d])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c & d)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDLconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ANDLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ANDLconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ANDLconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ANDLconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDLload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ANDLload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ANDLload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ANDLload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ANDLload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ANDLload x [off] {sym} ptr (MOVSSstore [off] {sym} ptr y _))
	// result: (ANDL x (MOVLf2i y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVSSstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVLf2i, typ.UInt32)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDLmodify(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ANDLmodify [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ANDLmodify [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (ANDLmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ANDLmodify [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDNL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ANDNL x (SHLL (MOVLconst [1]) y))
	// result: (BTRL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64SHLL {
			break
		}
		y := v_1.Args[1]
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_1_0.AuxInt) != 1 {
			break
		}
		v.Reset(ssaop.OpAMD64BTRL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDNQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ANDNQ x (SHLQ (MOVQconst [1]) y))
	// result: (BTRQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64SHLQ {
			break
		}
		y := v_1.Args[1]
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_1_0.AuxInt) != 1 {
			break
		}
		v.Reset(ssaop.OpAMD64BTRQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ANDQ (NOTQ (SHLQ (MOVQconst [1]) y)) x)
	// result: (BTRQ x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64NOTQ {
				continue
			}
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SHLQ {
				continue
			}
			y := v_0_0.Args[1]
			v_0_0_0 := v_0_0.Args[0]
			if v_0_0_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_0_0_0.AuxInt) != 1 {
				continue
			}
			x := v_1
			v.Reset(ssaop.OpAMD64BTRQ)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ANDQ (MOVQconst [c]) x)
	// cond: ssa.IsPowerOfTwo(uint64(^c)) && uint64(^c) >= 1<<31
	// result: (BTRQconst [int8(ssa.Log64u(uint64(^c)))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_0.AuxInt)
			x := v_1
			if !(ssa.IsPowerOfTwo(uint64(^c)) && uint64(^c) >= 1<<31) {
				continue
			}
			v.Reset(ssaop.OpAMD64BTRQconst)
			v.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log64u(uint64(^c))))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ANDQ x (MOVQconst [c]))
	// cond: ssa.Is32Bit(c)
	// result: (ANDQconst [int32(c)] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1.AuxInt)
			if !(ssa.Is32Bit(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ANDQconst)
			v.AuxInt = ssa.Int32ToAuxInt(int32(c))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ANDQ x x)
	// result: x
	for {
		x := v_0
		if x != v_1 {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (ANDQ x l:(MOVQload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (ANDQload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVQload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ANDQload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	// match: (ANDQ x (NOTQ y))
	// cond: buildcfg.GOAMD64 >= 3
	// result: (ANDNQ x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64NOTQ {
				continue
			}
			y := v_1.Args[0]
			if !(buildcfg.GOAMD64 >= 3) {
				continue
			}
			v.Reset(ssaop.OpAMD64ANDNQ)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ANDQ x (NEGQ x))
	// cond: buildcfg.GOAMD64 >= 3
	// result: (BLSIQ x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64NEGQ || x != v_1.Args[0] || !(buildcfg.GOAMD64 >= 3) {
				continue
			}
			v.Reset(ssaop.OpAMD64BLSIQ)
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ANDQ <t> x (ADDQconst [-1] x))
	// cond: buildcfg.GOAMD64 >= 3
	// result: (Select0 <t> (BLSRQ x))
	for {
		t := v.Type
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64ADDQconst || ssa.AuxIntToInt32(v_1.AuxInt) != -1 || x != v_1.Args[0] || !(buildcfg.GOAMD64 >= 3) {
				continue
			}
			v.Reset(ssaop.OpSelect0)
			v.Type = t
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BLSRQ, types.NewTuple(typ.UInt64, types.TypeFlags))
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64ANDQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (ANDQconst [c] (ANDQconst [d] x))
	// result: (ANDQconst [c & d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ANDQconst)
		v.AuxInt = ssa.Int32ToAuxInt(c & d)
		v.AddArg(x)
		return true
	}
	// match: (ANDQconst [ 0xFF] x)
	// result: (MOVBQZX x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0xFF {
			break
		}
		x := v_0
		v.Reset(ssaop.OpAMD64MOVBQZX)
		v.AddArg(x)
		return true
	}
	// match: (ANDQconst [0xFFFF] x)
	// result: (MOVWQZX x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0xFFFF {
			break
		}
		x := v_0
		v.Reset(ssaop.OpAMD64MOVWQZX)
		v.AddArg(x)
		return true
	}
	// match: (ANDQconst [0] _)
	// result: (MOVLconst [0])
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (ANDQconst [-1] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != -1 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (ANDQconst [c] (MOVQconst [d]))
	// result: (MOVQconst [int64(c)&d])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(c) & d)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDQconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ANDQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ANDQconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ANDQconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ANDQconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDQload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ANDQload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ANDQload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ANDQload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ANDQload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ANDQload x [off] {sym} ptr (MOVSDstore [off] {sym} ptr y _))
	// result: (ANDQ x (MOVQf2i y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVSDstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQ)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVQf2i, typ.UInt64)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDQmodify(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ANDQmodify [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ANDQmodify [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (ANDQmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ANDQmodify [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ANDWconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ANDWconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ANDWconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ANDWconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ANDWconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64AddTupleFirst32(v *ssa.Value) bool {
	// match: (AddTupleFirst32 _ _)
	// cond: v.Uses == 0
	// result: (Invalid)
	for {
		if !(v.Uses == 0) {
			break
		}
		v.Reset(ssaop.OpInvalid)
		return true
	}
	return false
}
func rewriteValue_OpAMD64AddTupleFirst64(v *ssa.Value) bool {
	// match: (AddTupleFirst64 _ _)
	// cond: v.Uses == 0
	// result: (Invalid)
	for {
		if !(v.Uses == 0) {
			break
		}
		v.Reset(ssaop.OpInvalid)
		return true
	}
	return false
}
func rewriteValue_OpAMD64BSFQ(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (BSFQ (ORQconst <t> [1<<8] (MOVBQZX x)))
	// result: (BSFQ (ORQconst <t> [1<<8] x))
	for {
		if v_0.Op != ssaop.OpAMD64ORQconst {
			break
		}
		t := v_0.Type
		if ssa.AuxIntToInt32(v_0.AuxInt) != 1<<8 {
			break
		}
		v_0_0 := v_0.Args[0]
		if v_0_0.Op != ssaop.OpAMD64MOVBQZX {
			break
		}
		x := v_0_0.Args[0]
		v.Reset(ssaop.OpAMD64BSFQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORQconst, t)
		v0.AuxInt = ssa.Int32ToAuxInt(1 << 8)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (BSFQ (ORQconst <t> [1<<16] (MOVWQZX x)))
	// result: (BSFQ (ORQconst <t> [1<<16] x))
	for {
		if v_0.Op != ssaop.OpAMD64ORQconst {
			break
		}
		t := v_0.Type
		if ssa.AuxIntToInt32(v_0.AuxInt) != 1<<16 {
			break
		}
		v_0_0 := v_0.Args[0]
		if v_0_0.Op != ssaop.OpAMD64MOVWQZX {
			break
		}
		x := v_0_0.Args[0]
		v.Reset(ssaop.OpAMD64BSFQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORQconst, t)
		v0.AuxInt = ssa.Int32ToAuxInt(1 << 16)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64BSWAPL(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (BSWAPL (BSWAPL p))
	// result: p
	for {
		if v_0.Op != ssaop.OpAMD64BSWAPL {
			break
		}
		p := v_0.Args[0]
		v.CopyOf(p)
		return true
	}
	// match: (BSWAPL x:(MOVLload [i] {s} p mem))
	// cond: x.Uses == 1 && buildcfg.GOAMD64 >= 3
	// result: @x.Block (MOVBELload [i] {s} p mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVLload {
			break
		}
		i := ssa.AuxIntToInt32(x.AuxInt)
		s := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		p := x.Args[0]
		if !(x.Uses == 1 && buildcfg.GOAMD64 >= 3) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVBELload, typ.UInt32)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(i)
		v0.Aux = ssa.SymToAux(s)
		v0.AddArg2(p, mem)
		return true
	}
	// match: (BSWAPL x:(MOVBELload [i] {s} p mem))
	// cond: x.Uses == 1
	// result: @x.Block (MOVLload [i] {s} p mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVBELload {
			break
		}
		i := ssa.AuxIntToInt32(x.AuxInt)
		s := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		p := x.Args[0]
		if !(x.Uses == 1) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(i)
		v0.Aux = ssa.SymToAux(s)
		v0.AddArg2(p, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64BSWAPQ(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (BSWAPQ (BSWAPQ p))
	// result: p
	for {
		if v_0.Op != ssaop.OpAMD64BSWAPQ {
			break
		}
		p := v_0.Args[0]
		v.CopyOf(p)
		return true
	}
	// match: (BSWAPQ x:(MOVQload [i] {s} p mem))
	// cond: x.Uses == 1 && buildcfg.GOAMD64 >= 3
	// result: @x.Block (MOVBEQload [i] {s} p mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVQload {
			break
		}
		i := ssa.AuxIntToInt32(x.AuxInt)
		s := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		p := x.Args[0]
		if !(x.Uses == 1 && buildcfg.GOAMD64 >= 3) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVBEQload, typ.UInt64)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(i)
		v0.Aux = ssa.SymToAux(s)
		v0.AddArg2(p, mem)
		return true
	}
	// match: (BSWAPQ x:(MOVBEQload [i] {s} p mem))
	// cond: x.Uses == 1
	// result: @x.Block (MOVQload [i] {s} p mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVBEQload {
			break
		}
		i := ssa.AuxIntToInt32(x.AuxInt)
		s := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		p := x.Args[0]
		if !(x.Uses == 1) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(i)
		v0.Aux = ssa.SymToAux(s)
		v0.AddArg2(p, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64BTCQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (BTCQconst [c] (MOVQconst [d]))
	// result: (MOVQconst [d^(1<<uint32(c))])
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(d ^ (1 << uint32(c)))
		return true
	}
	return false
}
func rewriteValue_OpAMD64BTLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (BTLconst [c] (SHRQconst [d] x))
	// cond: (c+d)<64
	// result: (BTQconst [c+d] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64SHRQconst {
			break
		}
		d := ssa.AuxIntToInt8(v_0.AuxInt)
		x := v_0.Args[0]
		if !((c + d) < 64) {
			break
		}
		v.Reset(ssaop.OpAMD64BTQconst)
		v.AuxInt = ssa.Int8ToAuxInt(c + d)
		v.AddArg(x)
		return true
	}
	// match: (BTLconst [c] (ADDQ x x))
	// cond: c>1
	// result: (BTLconst [c-1] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDQ {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] || !(c > 1) {
			break
		}
		v.Reset(ssaop.OpAMD64BTLconst)
		v.AuxInt = ssa.Int8ToAuxInt(c - 1)
		v.AddArg(x)
		return true
	}
	// match: (BTLconst [c] (SHLQconst [d] x))
	// cond: c>d
	// result: (BTLconst [c-d] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64SHLQconst {
			break
		}
		d := ssa.AuxIntToInt8(v_0.AuxInt)
		x := v_0.Args[0]
		if !(c > d) {
			break
		}
		v.Reset(ssaop.OpAMD64BTLconst)
		v.AuxInt = ssa.Int8ToAuxInt(c - d)
		v.AddArg(x)
		return true
	}
	// match: (BTLconst [0] s:(SHRQ x y))
	// result: (BTQ y x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		s := v_0
		if s.Op != ssaop.OpAMD64SHRQ {
			break
		}
		y := s.Args[1]
		x := s.Args[0]
		v.Reset(ssaop.OpAMD64BTQ)
		v.AddArg2(y, x)
		return true
	}
	// match: (BTLconst [c] (SHRLconst [d] x))
	// cond: (c+d)<32
	// result: (BTLconst [c+d] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64SHRLconst {
			break
		}
		d := ssa.AuxIntToInt8(v_0.AuxInt)
		x := v_0.Args[0]
		if !((c + d) < 32) {
			break
		}
		v.Reset(ssaop.OpAMD64BTLconst)
		v.AuxInt = ssa.Int8ToAuxInt(c + d)
		v.AddArg(x)
		return true
	}
	// match: (BTLconst [c] (ADDL x x))
	// cond: c>1
	// result: (BTLconst [c-1] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDL {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] || !(c > 1) {
			break
		}
		v.Reset(ssaop.OpAMD64BTLconst)
		v.AuxInt = ssa.Int8ToAuxInt(c - 1)
		v.AddArg(x)
		return true
	}
	// match: (BTLconst [c] (SHLLconst [d] x))
	// cond: c>d
	// result: (BTLconst [c-d] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64SHLLconst {
			break
		}
		d := ssa.AuxIntToInt8(v_0.AuxInt)
		x := v_0.Args[0]
		if !(c > d) {
			break
		}
		v.Reset(ssaop.OpAMD64BTLconst)
		v.AuxInt = ssa.Int8ToAuxInt(c - d)
		v.AddArg(x)
		return true
	}
	// match: (BTLconst [0] s:(SHRL x y))
	// result: (BTL y x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		s := v_0
		if s.Op != ssaop.OpAMD64SHRL {
			break
		}
		y := s.Args[1]
		x := s.Args[0]
		v.Reset(ssaop.OpAMD64BTL)
		v.AddArg2(y, x)
		return true
	}
	// match: (BTLconst [0] s:(SHRXL x y))
	// result: (BTL y x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		s := v_0
		if s.Op != ssaop.OpAMD64SHRXL {
			break
		}
		y := s.Args[1]
		x := s.Args[0]
		v.Reset(ssaop.OpAMD64BTL)
		v.AddArg2(y, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64BTQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (BTQconst [c] (SHRQconst [d] x))
	// cond: (c+d)<64
	// result: (BTQconst [c+d] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64SHRQconst {
			break
		}
		d := ssa.AuxIntToInt8(v_0.AuxInt)
		x := v_0.Args[0]
		if !((c + d) < 64) {
			break
		}
		v.Reset(ssaop.OpAMD64BTQconst)
		v.AuxInt = ssa.Int8ToAuxInt(c + d)
		v.AddArg(x)
		return true
	}
	// match: (BTQconst [c] (ADDQ x x))
	// cond: c>1
	// result: (BTQconst [c-1] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDQ {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] || !(c > 1) {
			break
		}
		v.Reset(ssaop.OpAMD64BTQconst)
		v.AuxInt = ssa.Int8ToAuxInt(c - 1)
		v.AddArg(x)
		return true
	}
	// match: (BTQconst [c] (SHLQconst [d] x))
	// cond: c>d
	// result: (BTQconst [c-d] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64SHLQconst {
			break
		}
		d := ssa.AuxIntToInt8(v_0.AuxInt)
		x := v_0.Args[0]
		if !(c > d) {
			break
		}
		v.Reset(ssaop.OpAMD64BTQconst)
		v.AuxInt = ssa.Int8ToAuxInt(c - d)
		v.AddArg(x)
		return true
	}
	// match: (BTQconst [0] s:(SHRQ x y))
	// result: (BTQ y x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		s := v_0
		if s.Op != ssaop.OpAMD64SHRQ {
			break
		}
		y := s.Args[1]
		x := s.Args[0]
		v.Reset(ssaop.OpAMD64BTQ)
		v.AddArg2(y, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64BTRQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (BTRQconst [c] (BTSQconst [c] x))
	// result: (BTRQconst [c] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64BTSQconst || ssa.AuxIntToInt8(v_0.AuxInt) != c {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64BTRQconst)
		v.AuxInt = ssa.Int8ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (BTRQconst [c] (BTCQconst [c] x))
	// result: (BTRQconst [c] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64BTCQconst || ssa.AuxIntToInt8(v_0.AuxInt) != c {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64BTRQconst)
		v.AuxInt = ssa.Int8ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (BTRQconst [c] (MOVQconst [d]))
	// result: (MOVQconst [d&^(1<<uint32(c))])
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(d &^ (1 << uint32(c)))
		return true
	}
	return false
}
func rewriteValue_OpAMD64BTSQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (BTSQconst [c] (BTRQconst [c] x))
	// result: (BTSQconst [c] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64BTRQconst || ssa.AuxIntToInt8(v_0.AuxInt) != c {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64BTSQconst)
		v.AuxInt = ssa.Int8ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (BTSQconst [c] (BTCQconst [c] x))
	// result: (BTSQconst [c] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64BTCQconst || ssa.AuxIntToInt8(v_0.AuxInt) != c {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64BTSQconst)
		v.AuxInt = ssa.Int8ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (BTSQconst [c] (MOVQconst [d]))
	// result: (MOVQconst [d|(1<<uint32(c))])
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(d | (1 << uint32(c)))
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVLCC(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVLCC x y (InvertFlags cond))
	// result: (CMOVLLS x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVLLS)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVLCC _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLCC _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLCC y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLCC y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLCC _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVLCS(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVLCS x y (InvertFlags cond))
	// result: (CMOVLHI x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVLHI)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVLCS y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLCS y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLCS _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLCS _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLCS y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVLEQ(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMOVLEQ x y (InvertFlags cond))
	// result: (CMOVLEQ x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVLEQ)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVLEQ _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLEQ y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLEQ y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLEQ y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLEQ y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLEQ x y (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
	// result: (CMOVLEQ x y (Select1 <types.TypeFlags> blsr))
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_2.Args[1]
		v_2_0 := v_2.Args[0]
		v_2_1 := v_2.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
			s := v_2_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRQ || s != v_2_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQ)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg3(x, y, v0)
			return true
		}
		break
	}
	// match: (CMOVLEQ x y (TESTL s:(Select0 blsr:(BLSRL _)) s))
	// result: (CMOVLEQ x y (Select1 <types.TypeFlags> blsr))
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_2.Args[1]
		v_2_0 := v_2.Args[0]
		v_2_1 := v_2.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
			s := v_2_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRL || s != v_2_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQ)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg3(x, y, v0)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTQ x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTQ x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTQ x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTQ x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTQ x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTQ x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTQ x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTQ x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTQ x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTQ x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTL x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTL x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTL x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTL x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTL x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTL x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTL x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTL x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTL x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTL x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTW x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTW x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTW x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTW x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTW x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTW x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTW x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTW x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTW x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTW x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTB s:(SETEQ flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTB s:(SETNE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTB s:(SETL flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTB s:(SETG flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTB s:(SETLE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTB s:(SETGE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTB s:(SETA flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTB s:(SETB flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTB s:(SETAE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLEQ yes no t:(TESTB s:(SETBE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64CMOVLGE(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMOVLGE x y (InvertFlags cond))
	// result: (CMOVLLE x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVLLE)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVLGE _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLGE _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLGE _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLGE y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLGE y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLGE x y c:(CMPQconst [128] z))
	// cond: c.Uses == 1
	// result: (CMOVLGT x y (CMPQconst [127] z))
	for {
		x := v_0
		y := v_1
		c := v_2
		if c.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		z := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLGT)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(z)
		v.AddArg3(x, y, v0)
		return true
	}
	// match: (CMOVLGE x y c:(CMPLconst [128] z))
	// cond: c.Uses == 1
	// result: (CMOVLGT x y (CMPLconst [127] z))
	for {
		x := v_0
		y := v_1
		c := v_2
		if c.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		z := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLGT)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(z)
		v.AddArg3(x, y, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVLGT(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVLGT x y (InvertFlags cond))
	// result: (CMOVLLT x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVLLT)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVLGT y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLGT _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLGT _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLGT y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLGT y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVLHI(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVLHI x y (InvertFlags cond))
	// result: (CMOVLCS x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVLCS)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVLHI y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLHI _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLHI y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLHI y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLHI _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVLLE(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVLLE x y (InvertFlags cond))
	// result: (CMOVLGE x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVLGE)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVLLE _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLLE y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLLE y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLLE _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLLE _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVLLS(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVLLS x y (InvertFlags cond))
	// result: (CMOVLCC x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVLCC)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVLLS _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLLS y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLLS _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLLS _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLLS y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVLLT(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMOVLLT x y (InvertFlags cond))
	// result: (CMOVLGT x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVLGT)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVLLT y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLLT y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLLT y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLLT _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLLT _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLLT x y c:(CMPQconst [128] z))
	// cond: c.Uses == 1
	// result: (CMOVLLE x y (CMPQconst [127] z))
	for {
		x := v_0
		y := v_1
		c := v_2
		if c.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		z := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLLE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(z)
		v.AddArg3(x, y, v0)
		return true
	}
	// match: (CMOVLLT x y c:(CMPLconst [128] z))
	// cond: c.Uses == 1
	// result: (CMOVLLE x y (CMPLconst [127] z))
	for {
		x := v_0
		y := v_1
		c := v_2
		if c.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		z := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLLE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(z)
		v.AddArg3(x, y, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVLNE(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMOVLNE x y (InvertFlags cond))
	// result: (CMOVLNE x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVLNE)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVLNE y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVLNE _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLNE _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLNE _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLNE _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVLNE x y (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
	// result: (CMOVLNE x y (Select1 <types.TypeFlags> blsr))
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_2.Args[1]
		v_2_0 := v_2.Args[0]
		v_2_1 := v_2.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
			s := v_2_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRQ || s != v_2_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNE)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg3(x, y, v0)
			return true
		}
		break
	}
	// match: (CMOVLNE x y (TESTL s:(Select0 blsr:(BLSRL _)) s))
	// result: (CMOVLNE x y (Select1 <types.TypeFlags> blsr))
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_2.Args[1]
		v_2_0 := v_2.Args[0]
		v_2_1 := v_2.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
			s := v_2_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRL || s != v_2_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNE)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg3(x, y, v0)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTQ x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTL x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTW x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVLGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETEQ flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETNE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETL flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETG flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETLE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETGE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETA flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETB flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETAE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETBE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETEQF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETNEF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETGF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVLNE yes no t:(TESTB s:(SETGEF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVLGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVLGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64CMOVQCC(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVQCC x y (InvertFlags cond))
	// result: (CMOVQLS x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVQLS)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVQCC _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQCC _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQCC y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQCC y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQCC _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVQCS(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVQCS x y (InvertFlags cond))
	// result: (CMOVQHI x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVQHI)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVQCS y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQCS y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQCS _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQCS _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQCS y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVQEQ(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMOVQEQ x y (InvertFlags cond))
	// result: (CMOVQEQ x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVQEQ)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVQEQ _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQEQ y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQEQ y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQEQ y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQEQ y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQEQ x _ (Select1 (BSFQ (ORQconst [c] _))))
	// cond: c != 0
	// result: x
	for {
		x := v_0
		if v_2.Op != ssaop.OpSelect1 {
			break
		}
		v_2_0 := v_2.Args[0]
		if v_2_0.Op != ssaop.OpAMD64BSFQ {
			break
		}
		v_2_0_0 := v_2_0.Args[0]
		if v_2_0_0.Op != ssaop.OpAMD64ORQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_2_0_0.AuxInt)
		if !(c != 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQEQ x _ (Select1 (BSRQ (ORQconst [c] _))))
	// cond: c != 0
	// result: x
	for {
		x := v_0
		if v_2.Op != ssaop.OpSelect1 {
			break
		}
		v_2_0 := v_2.Args[0]
		if v_2_0.Op != ssaop.OpAMD64BSRQ {
			break
		}
		v_2_0_0 := v_2_0.Args[0]
		if v_2_0_0.Op != ssaop.OpAMD64ORQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_2_0_0.AuxInt)
		if !(c != 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQEQ x y (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
	// result: (CMOVQEQ x y (Select1 <types.TypeFlags> blsr))
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_2.Args[1]
		v_2_0 := v_2.Args[0]
		v_2_1 := v_2.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
			s := v_2_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRQ || s != v_2_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQ)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg3(x, y, v0)
			return true
		}
		break
	}
	// match: (CMOVQEQ x y (TESTL s:(Select0 blsr:(BLSRL _)) s))
	// result: (CMOVQEQ x y (Select1 <types.TypeFlags> blsr))
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_2.Args[1]
		v_2_0 := v_2.Args[0]
		v_2_1 := v_2.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
			s := v_2_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRL || s != v_2_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQ)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg3(x, y, v0)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTQ x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTQ x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTQ x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTQ x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTQ x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTQ x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTQ x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTQ x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTQ x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTQ x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTL x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTL x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTL x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTL x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTL x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTL x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTL x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTL x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTL x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTL x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTW x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTW x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTW x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTW x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTW x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTW x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTW x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTW x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTW x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTW x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTB s:(SETEQ flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTB s:(SETNE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTB s:(SETL flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTB s:(SETG flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTB s:(SETLE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTB s:(SETGE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTB s:(SETA flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTB s:(SETB flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTB s:(SETAE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQEQ yes no t:(TESTB s:(SETBE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64CMOVQGE(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMOVQGE x y (InvertFlags cond))
	// result: (CMOVQLE x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVQLE)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVQGE _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQGE _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQGE _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQGE y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQGE y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQGE x y c:(CMPQconst [128] z))
	// cond: c.Uses == 1
	// result: (CMOVQGT x y (CMPQconst [127] z))
	for {
		x := v_0
		y := v_1
		c := v_2
		if c.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		z := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQGT)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(z)
		v.AddArg3(x, y, v0)
		return true
	}
	// match: (CMOVQGE x y c:(CMPLconst [128] z))
	// cond: c.Uses == 1
	// result: (CMOVQGT x y (CMPLconst [127] z))
	for {
		x := v_0
		y := v_1
		c := v_2
		if c.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		z := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQGT)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(z)
		v.AddArg3(x, y, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVQGT(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVQGT x y (InvertFlags cond))
	// result: (CMOVQLT x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVQLT)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVQGT y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQGT _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQGT _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQGT y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQGT y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVQHI(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVQHI x y (InvertFlags cond))
	// result: (CMOVQCS x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVQCS)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVQHI y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQHI _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQHI y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQHI y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQHI _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVQLE(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVQLE x y (InvertFlags cond))
	// result: (CMOVQGE x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVQGE)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVQLE _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQLE y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQLE y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQLE _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQLE _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVQLS(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVQLS x y (InvertFlags cond))
	// result: (CMOVQCC x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVQCC)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVQLS _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQLS y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQLS _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQLS _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQLS y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVQLT(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMOVQLT x y (InvertFlags cond))
	// result: (CMOVQGT x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVQGT)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVQLT y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQLT y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQLT y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQLT _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQLT _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQLT x y c:(CMPQconst [128] z))
	// cond: c.Uses == 1
	// result: (CMOVQLE x y (CMPQconst [127] z))
	for {
		x := v_0
		y := v_1
		c := v_2
		if c.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		z := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQLE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(z)
		v.AddArg3(x, y, v0)
		return true
	}
	// match: (CMOVQLT x y c:(CMPLconst [128] z))
	// cond: c.Uses == 1
	// result: (CMOVQLE x y (CMPLconst [127] z))
	for {
		x := v_0
		y := v_1
		c := v_2
		if c.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		z := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQLE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(z)
		v.AddArg3(x, y, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVQNE(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMOVQNE x y (InvertFlags cond))
	// result: (CMOVQNE x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVQNE)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVQNE y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVQNE _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQNE _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQNE _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQNE _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVQNE x y (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
	// result: (CMOVQNE x y (Select1 <types.TypeFlags> blsr))
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_2.Args[1]
		v_2_0 := v_2.Args[0]
		v_2_1 := v_2.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
			s := v_2_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRQ || s != v_2_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNE)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg3(x, y, v0)
			return true
		}
		break
	}
	// match: (CMOVQNE x y (TESTL s:(Select0 blsr:(BLSRL _)) s))
	// result: (CMOVQNE x y (Select1 <types.TypeFlags> blsr))
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_2.Args[1]
		v_2_0 := v_2.Args[0]
		v_2_1 := v_2.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_2_0, v_2_1 = _i0+1, v_2_1, v_2_0 {
			s := v_2_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRL || s != v_2_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNE)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg3(x, y, v0)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTQ x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTL x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTW x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVQGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETEQ flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETNE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETL flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETG flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETLE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETGE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETA flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETB flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETAE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETBE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETEQF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETNEF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETGF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVQNE yes no t:(TESTB s:(SETGEF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVQGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVQGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64CMOVWCC(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVWCC x y (InvertFlags cond))
	// result: (CMOVWLS x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVWLS)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVWCC _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWCC _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWCC y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWCC y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWCC _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVWCS(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVWCS x y (InvertFlags cond))
	// result: (CMOVWHI x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVWHI)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVWCS y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWCS y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWCS _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWCS _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWCS y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVWEQ(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVWEQ x y (InvertFlags cond))
	// result: (CMOVWEQ x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVWEQ)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVWEQ _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWEQ y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWEQ y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWEQ y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWEQ y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWEQ yes no t:(TESTQ x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTQ x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTQ x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTQ x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTQ x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTQ x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTQ x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTQ x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTQ x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTQ x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTL x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTL x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTL x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTL x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTL x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTL x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTL x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTL x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTL x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTL x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTW x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTW x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTW x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTW x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTW x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTW x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTW x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTW x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTW x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTW x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTB s:(SETEQ flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTB s:(SETNE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTB s:(SETL flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTB s:(SETG flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTB s:(SETLE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTB s:(SETGE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTB s:(SETA flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTB s:(SETB flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTB s:(SETAE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWEQ yes no t:(TESTB s:(SETBE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64CMOVWGE(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVWGE x y (InvertFlags cond))
	// result: (CMOVWLE x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVWLE)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVWGE _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWGE _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWGE _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWGE y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWGE y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVWGT(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVWGT x y (InvertFlags cond))
	// result: (CMOVWLT x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVWLT)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVWGT y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWGT _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWGT _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWGT y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWGT y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVWHI(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVWHI x y (InvertFlags cond))
	// result: (CMOVWCS x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVWCS)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVWHI y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWHI _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWHI y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWHI y _ (FlagLT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWHI _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVWLE(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVWLE x y (InvertFlags cond))
	// result: (CMOVWGE x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVWGE)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVWLE _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWLE y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWLE y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWLE _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWLE _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVWLS(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVWLS x y (InvertFlags cond))
	// result: (CMOVWCC x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVWCC)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVWLS _ x (FlagEQ))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWLS y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWLS _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWLS _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWLS y _ (FlagLT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVWLT(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVWLT x y (InvertFlags cond))
	// result: (CMOVWGT x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVWGT)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVWLT y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWLT y _ (FlagGT_UGT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWLT y _ (FlagGT_ULT))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWLT _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWLT _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMOVWNE(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMOVWNE x y (InvertFlags cond))
	// result: (CMOVWNE x y cond)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		cond := v_2.Args[0]
		v.Reset(ssaop.OpAMD64CMOVWNE)
		v.AddArg3(x, y, cond)
		return true
	}
	// match: (CMOVWNE y _ (FlagEQ))
	// result: y
	for {
		y := v_0
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.CopyOf(y)
		return true
	}
	// match: (CMOVWNE _ x (FlagGT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWNE _ x (FlagGT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWNE _ x (FlagLT_ULT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWNE _ x (FlagLT_UGT))
	// result: x
	for {
		x := v_1
		if v_2.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTQ x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTL x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTW x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: (CMOVWGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETEQ flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWEQ yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQ)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETNE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWNE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETL flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWLT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETG flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWGT yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGT)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETLE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWLE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETGE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWGE yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGE)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETA flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWHI yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWHI)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETB flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWCS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETAE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWCC yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWCC)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETBE flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWLS yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWLS)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETEQF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWEQF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWEQF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETNEF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWNEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWNEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETGF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWGTF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGTF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	// match: (CMOVWNE yes no t:(TESTB s:(SETGEF flags) s))
	// cond: t.Block == s.Block
	// result: (CMOVWGEF yes no flags)
	for {
		yes := v_0
		no := v_1
		t := v_2
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64CMOVWGEF)
			v.AddArg3(yes, no, flags)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64CMPB(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMPB x (MOVLconst [c]))
	// result: (CMPBconst x [int8(c)])
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64CMPBconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c))
		v.AddArg(x)
		return true
	}
	// match: (CMPB (MOVLconst [c]) x)
	// result: (InvertFlags (CMPBconst x [int8(c)]))
	for {
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_1
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(int8(c))
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (CMPB x y)
	// cond: ssa.CanonLessThan(x,y)
	// result: (InvertFlags (CMPB y x))
	for {
		x := v_0
		y := v_1
		if !(ssa.CanonLessThan(x, y)) {
			break
		}
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPB, types.TypeFlags)
		v0.AddArg2(y, x)
		v.AddArg(v0)
		return true
	}
	// match: (CMPB l:(MOVBload {sym} [off] ptr mem) x)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (CMPBload {sym} [off] ptr x mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVBload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		x := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPBload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (CMPB x l:(MOVBload {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (InvertFlags (CMPBload {sym} [off] ptr x mem))
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64MOVBload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPBload, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg3(ptr, x, mem)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPBconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMPBconst (MOVLconst [x]) [y])
	// cond: int8(x)==y
	// result: (FlagEQ)
	for {
		y := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(int8(x) == y) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagEQ)
		return true
	}
	// match: (CMPBconst (MOVLconst [x]) [y])
	// cond: int8(x)<y && uint8(x)<uint8(y)
	// result: (FlagLT_ULT)
	for {
		y := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(int8(x) < y && uint8(x) < uint8(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPBconst (MOVLconst [x]) [y])
	// cond: int8(x)<y && uint8(x)>uint8(y)
	// result: (FlagLT_UGT)
	for {
		y := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(int8(x) < y && uint8(x) > uint8(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_UGT)
		return true
	}
	// match: (CMPBconst (MOVLconst [x]) [y])
	// cond: int8(x)>y && uint8(x)<uint8(y)
	// result: (FlagGT_ULT)
	for {
		y := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(int8(x) > y && uint8(x) < uint8(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_ULT)
		return true
	}
	// match: (CMPBconst (MOVLconst [x]) [y])
	// cond: int8(x)>y && uint8(x)>uint8(y)
	// result: (FlagGT_UGT)
	for {
		y := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(int8(x) > y && uint8(x) > uint8(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_UGT)
		return true
	}
	// match: (CMPBconst (ANDLconst _ [m]) [n])
	// cond: 0 <= int8(m) && int8(m) < n
	// result: (FlagLT_ULT)
	for {
		n := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		m := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(0 <= int8(m) && int8(m) < n) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPBconst a:(ANDL x y) [0])
	// cond: a.Uses == 1
	// result: (TESTB x y)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		a := v_0
		if a.Op != ssaop.OpAMD64ANDL {
			break
		}
		y := a.Args[1]
		x := a.Args[0]
		if !(a.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTB)
		v.AddArg2(x, y)
		return true
	}
	// match: (CMPBconst a:(ANDLconst [c] x) [0])
	// cond: a.Uses == 1
	// result: (TESTBconst [int8(c)] x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		a := v_0
		if a.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		x := a.Args[0]
		if !(a.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTBconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c))
		v.AddArg(x)
		return true
	}
	// match: (CMPBconst x [0])
	// result: (TESTB x x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.Reset(ssaop.OpAMD64TESTB)
		v.AddArg2(x, x)
		return true
	}
	// match: (CMPBconst l:(MOVBload {sym} [off] ptr mem) [c])
	// cond: l.Uses == 1 && ssa.Clobber(l)
	// result: @l.Block (CMPBconstload {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64MOVBload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(l.Uses == 1 && ssa.Clobber(l)) {
			break
		}
		b = l.Block
		v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPBconstload, types.TypeFlags)
		v.CopyOf(v0)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPBconstload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMPBconstload [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (CMPBconstload [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPBconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (CMPBconstload [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (CMPBconstload [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPBconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPBload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMPBload [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (CMPBload [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPBload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (CMPBload [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (CMPBload [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPBload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (CMPBload {sym} [off] ptr (MOVLconst [c]) mem)
	// result: (CMPBconstload {sym} [ssa.MakeValAndOff(int32(int8(c)),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64CMPBconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(int8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMPL x (MOVLconst [c]))
	// result: (CMPLconst x [c])
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64CMPLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (CMPL (MOVLconst [c]) x)
	// result: (InvertFlags (CMPLconst x [c]))
	for {
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_1
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(c)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (CMPL x y)
	// cond: ssa.CanonLessThan(x,y)
	// result: (InvertFlags (CMPL y x))
	for {
		x := v_0
		y := v_1
		if !(ssa.CanonLessThan(x, y)) {
			break
		}
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPL, types.TypeFlags)
		v0.AddArg2(y, x)
		v.AddArg(v0)
		return true
	}
	// match: (CMPL l:(MOVLload {sym} [off] ptr mem) x)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (CMPLload {sym} [off] ptr x mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		x := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPLload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (CMPL x l:(MOVLload {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (InvertFlags (CMPLload {sym} [off] ptr x mem))
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPLload, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg3(ptr, x, mem)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMPLconst (MOVLconst [x]) [y])
	// cond: x==y
	// result: (FlagEQ)
	for {
		y := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(x == y) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagEQ)
		return true
	}
	// match: (CMPLconst (MOVLconst [x]) [y])
	// cond: x<y && uint32(x)<uint32(y)
	// result: (FlagLT_ULT)
	for {
		y := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(x < y && uint32(x) < uint32(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPLconst (MOVLconst [x]) [y])
	// cond: x<y && uint32(x)>uint32(y)
	// result: (FlagLT_UGT)
	for {
		y := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(x < y && uint32(x) > uint32(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_UGT)
		return true
	}
	// match: (CMPLconst (MOVLconst [x]) [y])
	// cond: x>y && uint32(x)<uint32(y)
	// result: (FlagGT_ULT)
	for {
		y := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(x > y && uint32(x) < uint32(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_ULT)
		return true
	}
	// match: (CMPLconst (MOVLconst [x]) [y])
	// cond: x>y && uint32(x)>uint32(y)
	// result: (FlagGT_UGT)
	for {
		y := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(x > y && uint32(x) > uint32(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_UGT)
		return true
	}
	// match: (CMPLconst (SHRLconst _ [c]) [n])
	// cond: 0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)
	// result: (FlagLT_ULT)
	for {
		n := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64SHRLconst {
			break
		}
		c := ssa.AuxIntToInt8(v_0.AuxInt)
		if !(0 <= n && 0 < c && c <= 32 && (1<<uint64(32-c)) <= uint64(n)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPLconst (ANDLconst _ [m]) [n])
	// cond: 0 <= m && m < n
	// result: (FlagLT_ULT)
	for {
		n := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		m := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(0 <= m && m < n) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPLconst a:(ANDL x y) [0])
	// cond: a.Uses == 1
	// result: (TESTL x y)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		a := v_0
		if a.Op != ssaop.OpAMD64ANDL {
			break
		}
		y := a.Args[1]
		x := a.Args[0]
		if !(a.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTL)
		v.AddArg2(x, y)
		return true
	}
	// match: (CMPLconst a:(ANDLconst [c] x) [0])
	// cond: a.Uses == 1
	// result: (TESTLconst [c] x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		a := v_0
		if a.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		x := a.Args[0]
		if !(a.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (CMPLconst x [0])
	// result: (TESTL x x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.Reset(ssaop.OpAMD64TESTL)
		v.AddArg2(x, x)
		return true
	}
	// match: (CMPLconst l:(MOVLload {sym} [off] ptr mem) [c])
	// cond: l.Uses == 1 && ssa.Clobber(l)
	// result: @l.Block (CMPLconstload {sym} [ssa.MakeValAndOff(c,off)] ptr mem)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(l.Uses == 1 && ssa.Clobber(l)) {
			break
		}
		b = l.Block
		v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPLconstload, types.TypeFlags)
		v.CopyOf(v0)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(c, off))
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPLconstload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMPLconstload [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (CMPLconstload [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPLconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (CMPLconstload [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (CMPLconstload [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPLconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPLload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMPLload [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (CMPLload [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (CMPLload [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (CMPLload [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (CMPLload {sym} [off] ptr (MOVLconst [c]) mem)
	// result: (CMPLconstload {sym} [ssa.MakeValAndOff(c,off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64CMPLconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(c, off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMPQ x (MOVQconst [c]))
	// cond: ssa.Is32Bit(c)
	// result: (CMPQconst x [int32(c)])
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(ssa.Is32Bit(c)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPQconst)
		v.AuxInt = ssa.Int32ToAuxInt(int32(c))
		v.AddArg(x)
		return true
	}
	// match: (CMPQ (MOVQconst [c]) x)
	// cond: ssa.Is32Bit(c)
	// result: (InvertFlags (CMPQconst x [int32(c)]))
	for {
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_0.AuxInt)
		x := v_1
		if !(ssa.Is32Bit(c)) {
			break
		}
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(int32(c))
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (CMPQ x y)
	// cond: ssa.CanonLessThan(x,y)
	// result: (InvertFlags (CMPQ y x))
	for {
		x := v_0
		y := v_1
		if !(ssa.CanonLessThan(x, y)) {
			break
		}
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(y, x)
		v.AddArg(v0)
		return true
	}
	// match: (CMPQ (MOVQconst [x]) (MOVQconst [y]))
	// cond: x==y
	// result: (FlagEQ)
	for {
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		x := ssa.AuxIntToInt64(v_0.AuxInt)
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		y := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(x == y) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagEQ)
		return true
	}
	// match: (CMPQ (MOVQconst [x]) (MOVQconst [y]))
	// cond: x<y && uint64(x)<uint64(y)
	// result: (FlagLT_ULT)
	for {
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		x := ssa.AuxIntToInt64(v_0.AuxInt)
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		y := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(x < y && uint64(x) < uint64(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPQ (MOVQconst [x]) (MOVQconst [y]))
	// cond: x<y && uint64(x)>uint64(y)
	// result: (FlagLT_UGT)
	for {
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		x := ssa.AuxIntToInt64(v_0.AuxInt)
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		y := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(x < y && uint64(x) > uint64(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_UGT)
		return true
	}
	// match: (CMPQ (MOVQconst [x]) (MOVQconst [y]))
	// cond: x>y && uint64(x)<uint64(y)
	// result: (FlagGT_ULT)
	for {
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		x := ssa.AuxIntToInt64(v_0.AuxInt)
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		y := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(x > y && uint64(x) < uint64(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_ULT)
		return true
	}
	// match: (CMPQ (MOVQconst [x]) (MOVQconst [y]))
	// cond: x>y && uint64(x)>uint64(y)
	// result: (FlagGT_UGT)
	for {
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		x := ssa.AuxIntToInt64(v_0.AuxInt)
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		y := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(x > y && uint64(x) > uint64(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_UGT)
		return true
	}
	// match: (CMPQ l:(MOVQload {sym} [off] ptr mem) x)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (CMPQload {sym} [off] ptr x mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		x := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPQload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (CMPQ x l:(MOVQload {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (InvertFlags (CMPQload {sym} [off] ptr x mem))
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPQload, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg3(ptr, x, mem)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMPQconst (MOVQconst [x]) [y])
	// cond: x==int64(y)
	// result: (FlagEQ)
	for {
		y := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		x := ssa.AuxIntToInt64(v_0.AuxInt)
		if !(x == int64(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagEQ)
		return true
	}
	// match: (CMPQconst (MOVQconst [x]) [y])
	// cond: x<int64(y) && uint64(x)<uint64(int64(y))
	// result: (FlagLT_ULT)
	for {
		y := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		x := ssa.AuxIntToInt64(v_0.AuxInt)
		if !(x < int64(y) && uint64(x) < uint64(int64(y))) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPQconst (MOVQconst [x]) [y])
	// cond: x<int64(y) && uint64(x)>uint64(int64(y))
	// result: (FlagLT_UGT)
	for {
		y := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		x := ssa.AuxIntToInt64(v_0.AuxInt)
		if !(x < int64(y) && uint64(x) > uint64(int64(y))) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_UGT)
		return true
	}
	// match: (CMPQconst (MOVQconst [x]) [y])
	// cond: x>int64(y) && uint64(x)<uint64(int64(y))
	// result: (FlagGT_ULT)
	for {
		y := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		x := ssa.AuxIntToInt64(v_0.AuxInt)
		if !(x > int64(y) && uint64(x) < uint64(int64(y))) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_ULT)
		return true
	}
	// match: (CMPQconst (MOVQconst [x]) [y])
	// cond: x>int64(y) && uint64(x)>uint64(int64(y))
	// result: (FlagGT_UGT)
	for {
		y := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		x := ssa.AuxIntToInt64(v_0.AuxInt)
		if !(x > int64(y) && uint64(x) > uint64(int64(y))) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_UGT)
		return true
	}
	// match: (CMPQconst (MOVBQZX _) [c])
	// cond: 0xFF < c
	// result: (FlagLT_ULT)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVBQZX || !(0xFF < c) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPQconst (MOVWQZX _) [c])
	// cond: 0xFFFF < c
	// result: (FlagLT_ULT)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVWQZX || !(0xFFFF < c) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPQconst (SHRQconst _ [c]) [n])
	// cond: 0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)
	// result: (FlagLT_ULT)
	for {
		n := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64SHRQconst {
			break
		}
		c := ssa.AuxIntToInt8(v_0.AuxInt)
		if !(0 <= n && 0 < c && c <= 64 && (1<<uint64(64-c)) <= uint64(n)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPQconst (ANDQconst _ [m]) [n])
	// cond: 0 <= m && m < n
	// result: (FlagLT_ULT)
	for {
		n := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		m := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(0 <= m && m < n) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPQconst (ANDLconst _ [m]) [n])
	// cond: 0 <= m && m < n
	// result: (FlagLT_ULT)
	for {
		n := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		m := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(0 <= m && m < n) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPQconst a:(ANDQ x y) [0])
	// cond: a.Uses == 1
	// result: (TESTQ x y)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		a := v_0
		if a.Op != ssaop.OpAMD64ANDQ {
			break
		}
		y := a.Args[1]
		x := a.Args[0]
		if !(a.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (CMPQconst a:(ANDQconst [c] x) [0])
	// cond: a.Uses == 1
	// result: (TESTQconst [c] x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		a := v_0
		if a.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		x := a.Args[0]
		if !(a.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTQconst)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (CMPQconst x [0])
	// result: (TESTQ x x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.Reset(ssaop.OpAMD64TESTQ)
		v.AddArg2(x, x)
		return true
	}
	// match: (CMPQconst l:(MOVQload {sym} [off] ptr mem) [c])
	// cond: l.Uses == 1 && ssa.Clobber(l)
	// result: @l.Block (CMPQconstload {sym} [ssa.MakeValAndOff(c,off)] ptr mem)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(l.Uses == 1 && ssa.Clobber(l)) {
			break
		}
		b = l.Block
		v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPQconstload, types.TypeFlags)
		v.CopyOf(v0)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(c, off))
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPQconstload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMPQconstload [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (CMPQconstload [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPQconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (CMPQconstload [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (CMPQconstload [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPQconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPQload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMPQload [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (CMPQload [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (CMPQload [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (CMPQload [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (CMPQload {sym} [off] ptr (MOVQconst [c]) mem)
	// cond: validVal(c)
	// result: (CMPQconstload {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mem := v_2
		if !(validVal(c)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPQconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPW(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMPW x (MOVLconst [c]))
	// result: (CMPWconst x [int16(c)])
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64CMPWconst)
		v.AuxInt = ssa.Int16ToAuxInt(int16(c))
		v.AddArg(x)
		return true
	}
	// match: (CMPW (MOVLconst [c]) x)
	// result: (InvertFlags (CMPWconst x [int16(c)]))
	for {
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_1
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v0.AuxInt = ssa.Int16ToAuxInt(int16(c))
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (CMPW x y)
	// cond: ssa.CanonLessThan(x,y)
	// result: (InvertFlags (CMPW y x))
	for {
		x := v_0
		y := v_1
		if !(ssa.CanonLessThan(x, y)) {
			break
		}
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPW, types.TypeFlags)
		v0.AddArg2(y, x)
		v.AddArg(v0)
		return true
	}
	// match: (CMPW l:(MOVWload {sym} [off] ptr mem) x)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (CMPWload {sym} [off] ptr x mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVWload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		x := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPWload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (CMPW x l:(MOVWload {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (InvertFlags (CMPWload {sym} [off] ptr x mem))
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64MOVWload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64InvertFlags)
		v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPWload, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg3(ptr, x, mem)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPWconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (CMPWconst (MOVLconst [x]) [y])
	// cond: int16(x)==y
	// result: (FlagEQ)
	for {
		y := ssa.AuxIntToInt16(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(int16(x) == y) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagEQ)
		return true
	}
	// match: (CMPWconst (MOVLconst [x]) [y])
	// cond: int16(x)<y && uint16(x)<uint16(y)
	// result: (FlagLT_ULT)
	for {
		y := ssa.AuxIntToInt16(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(int16(x) < y && uint16(x) < uint16(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPWconst (MOVLconst [x]) [y])
	// cond: int16(x)<y && uint16(x)>uint16(y)
	// result: (FlagLT_UGT)
	for {
		y := ssa.AuxIntToInt16(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(int16(x) < y && uint16(x) > uint16(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_UGT)
		return true
	}
	// match: (CMPWconst (MOVLconst [x]) [y])
	// cond: int16(x)>y && uint16(x)<uint16(y)
	// result: (FlagGT_ULT)
	for {
		y := ssa.AuxIntToInt16(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(int16(x) > y && uint16(x) < uint16(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_ULT)
		return true
	}
	// match: (CMPWconst (MOVLconst [x]) [y])
	// cond: int16(x)>y && uint16(x)>uint16(y)
	// result: (FlagGT_UGT)
	for {
		y := ssa.AuxIntToInt16(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		x := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(int16(x) > y && uint16(x) > uint16(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_UGT)
		return true
	}
	// match: (CMPWconst (ANDLconst _ [m]) [n])
	// cond: 0 <= int16(m) && int16(m) < n
	// result: (FlagLT_ULT)
	for {
		n := ssa.AuxIntToInt16(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		m := ssa.AuxIntToInt32(v_0.AuxInt)
		if !(0 <= int16(m) && int16(m) < n) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_ULT)
		return true
	}
	// match: (CMPWconst a:(ANDL x y) [0])
	// cond: a.Uses == 1
	// result: (TESTW x y)
	for {
		if ssa.AuxIntToInt16(v.AuxInt) != 0 {
			break
		}
		a := v_0
		if a.Op != ssaop.OpAMD64ANDL {
			break
		}
		y := a.Args[1]
		x := a.Args[0]
		if !(a.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTW)
		v.AddArg2(x, y)
		return true
	}
	// match: (CMPWconst a:(ANDLconst [c] x) [0])
	// cond: a.Uses == 1
	// result: (TESTWconst [int16(c)] x)
	for {
		if ssa.AuxIntToInt16(v.AuxInt) != 0 {
			break
		}
		a := v_0
		if a.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		x := a.Args[0]
		if !(a.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTWconst)
		v.AuxInt = ssa.Int16ToAuxInt(int16(c))
		v.AddArg(x)
		return true
	}
	// match: (CMPWconst x [0])
	// result: (TESTW x x)
	for {
		if ssa.AuxIntToInt16(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.Reset(ssaop.OpAMD64TESTW)
		v.AddArg2(x, x)
		return true
	}
	// match: (CMPWconst l:(MOVWload {sym} [off] ptr mem) [c])
	// cond: l.Uses == 1 && ssa.Clobber(l)
	// result: @l.Block (CMPWconstload {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		c := ssa.AuxIntToInt16(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64MOVWload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(l.Uses == 1 && ssa.Clobber(l)) {
			break
		}
		b = l.Block
		v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPWconstload, types.TypeFlags)
		v.CopyOf(v0)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPWconstload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMPWconstload [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (CMPWconstload [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPWconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (CMPWconstload [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (CMPWconstload [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPWconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPWload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMPWload [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (CMPWload [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPWload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (CMPWload [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (CMPWload [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPWload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (CMPWload {sym} [off] ptr (MOVLconst [c]) mem)
	// result: (CMPWconstload {sym} [ssa.MakeValAndOff(int32(int16(c)),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64CMPWconstload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(int16(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPXCHGLlock(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMPXCHGLlock [off1] {sym} (ADDQconst [off2] ptr) old new_ mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (CMPXCHGLlock [off1+off2] {sym} ptr old new_ mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		old := v_1
		new_ := v_2
		mem := v_3
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPXCHGLlock)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(ptr, old, new_, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CMPXCHGQlock(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (CMPXCHGQlock [off1] {sym} (ADDQconst [off2] ptr) old new_ mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (CMPXCHGQlock [off1+off2] {sym} ptr old new_ mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		old := v_1
		new_ := v_2
		mem := v_3
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64CMPXCHGQlock)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(ptr, old, new_, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64CVTSD2SS(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CVTSD2SS (ROUNDSD [c] (CVTSS2SD x)))
	// result: (ROUNDSS [c] x)
	for {
		if v_0.Op != ssaop.OpAMD64ROUNDSD {
			break
		}
		c := ssa.AuxIntToInt8(v_0.AuxInt)
		v_0_0 := v_0.Args[0]
		if v_0_0.Op != ssaop.OpAMD64CVTSS2SD {
			break
		}
		x := v_0_0.Args[0]
		v.Reset(ssaop.OpAMD64ROUNDSS)
		v.AuxInt = ssa.Int8ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64DIVSD(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (DIVSD x l:(MOVSDload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (DIVSDload x [off] {sym} ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64MOVSDload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64DIVSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64DIVSDload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (DIVSDload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (DIVSDload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64DIVSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (DIVSDload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (DIVSDload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64DIVSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64DIVSS(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (DIVSS x l:(MOVSSload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (DIVSSload x [off] {sym} ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64MOVSSload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64DIVSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64DIVSSload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (DIVSSload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (DIVSSload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64DIVSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (DIVSSload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (DIVSSload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64DIVSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64HMULL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (HMULL x y)
	// cond: !x.Rematerializeable() && y.Rematerializeable()
	// result: (HMULL y x)
	for {
		x := v_0
		y := v_1
		if !(!x.Rematerializeable() && y.Rematerializeable()) {
			break
		}
		v.Reset(ssaop.OpAMD64HMULL)
		v.AddArg2(y, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64HMULLU(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (HMULLU x y)
	// cond: !x.Rematerializeable() && y.Rematerializeable()
	// result: (HMULLU y x)
	for {
		x := v_0
		y := v_1
		if !(!x.Rematerializeable() && y.Rematerializeable()) {
			break
		}
		v.Reset(ssaop.OpAMD64HMULLU)
		v.AddArg2(y, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64HMULQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (HMULQ x y)
	// cond: !x.Rematerializeable() && y.Rematerializeable()
	// result: (HMULQ y x)
	for {
		x := v_0
		y := v_1
		if !(!x.Rematerializeable() && y.Rematerializeable()) {
			break
		}
		v.Reset(ssaop.OpAMD64HMULQ)
		v.AddArg2(y, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64HMULQU(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (HMULQU x y)
	// cond: !x.Rematerializeable() && y.Rematerializeable()
	// result: (HMULQU y x)
	for {
		x := v_0
		y := v_1
		if !(!x.Rematerializeable() && y.Rematerializeable()) {
			break
		}
		v.Reset(ssaop.OpAMD64HMULQU)
		v.AddArg2(y, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64KANDB(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (KANDB (VCMPPD512 [3] x x) (VCMPPD512 [3] y y))
	// result: (VCMPPD512 [3] x x)
	for {
		if v_0.Op != ssaop.OpAMD64VCMPPD512 || ssa.AuxIntToUint8(v_0.AuxInt) != 3 {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] || v_1.Op != ssaop.OpAMD64VCMPPD512 || ssa.AuxIntToUint8(v_1.AuxInt) != 3 {
			break
		}
		y := v_1.Args[1]
		if y != v_1.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPD512)
		v.AuxInt = ssa.Uint8ToAuxInt(3)
		v.AddArg2(x, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64KANDW(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (KANDW (VCMPPS512 [3] x x) (VCMPPS512 [3] y y))
	// result: (VCMPPS512 [3] x y)
	for {
		if v_0.Op != ssaop.OpAMD64VCMPPS512 || ssa.AuxIntToUint8(v_0.AuxInt) != 3 {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] || v_1.Op != ssaop.OpAMD64VCMPPS512 || ssa.AuxIntToUint8(v_1.AuxInt) != 3 {
			break
		}
		y := v_1.Args[1]
		if y != v_1.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPS512)
		v.AuxInt = ssa.Uint8ToAuxInt(3)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64KMOVBk(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (KMOVBk l:(MOVBload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (KMOVBload [off] {sym} ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVBload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64KMOVBload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64KMOVDk(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (KMOVDk l:(MOVLload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (KMOVDload [off] {sym} ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64KMOVDload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64KMOVQk(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (KMOVQk l:(MOVQload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (KMOVQload [off] {sym} ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64KMOVQload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64KMOVWk(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (KMOVWk l:(MOVWload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (KMOVWload [off] {sym} ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVWload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64KMOVWload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LEAL(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (LEAL [c] {s} (ADDLconst [d] x))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAL [c+d] {s} x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg(x)
		return true
	}
	// match: (LEAL [c] {s} (ADDL x y))
	// cond: x.Op != ssaop.OpSB && y.Op != ssaop.OpSB
	// result: (LEAL1 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			x := v_0_0
			y := v_0_1
			if !(x.Op != ssaop.OpSB && y.Op != ssaop.OpSB) {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAL1)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64LEAL1(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LEAL1 [c] {s} (ADDLconst [d] x) y)
	// cond: ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB
	// result: (LEAL1 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64ADDLconst {
				continue
			}
			d := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_0.Args[0]
			y := v_1
			if !(ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB) {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAL1)
			v.AuxInt = ssa.Int32ToAuxInt(c + d)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (LEAL1 [c] {s} x z:(ADDL y y))
	// cond: x != z
	// result: (LEAL2 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			z := v_1
			if z.Op != ssaop.OpAMD64ADDL {
				continue
			}
			y := z.Args[1]
			if y != z.Args[0] || !(x != z) {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAL2)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (LEAL1 [c] {s} x (SHLLconst [2] y))
	// result: (LEAL4 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(v_1.AuxInt) != 2 {
				continue
			}
			y := v_1.Args[0]
			v.Reset(ssaop.OpAMD64LEAL4)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (LEAL1 [c] {s} x (SHLLconst [3] y))
	// result: (LEAL8 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(v_1.AuxInt) != 3 {
				continue
			}
			y := v_1.Args[0]
			v.Reset(ssaop.OpAMD64LEAL8)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64LEAL2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LEAL2 [c] {s} (ADDLconst [d] x) y)
	// cond: ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB
	// result: (LEAL2 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		y := v_1
		if !(ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL2)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAL2 [c] {s} x (ADDLconst [d] y))
	// cond: ssa.Is32Bit(int64(c)+2*int64(d)) && y.Op != ssaop.OpSB
	// result: (LEAL2 [c+2*d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(ssa.Is32Bit(int64(c)+2*int64(d)) && y.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL2)
		v.AuxInt = ssa.Int32ToAuxInt(c + 2*d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAL2 [c] {s} x z:(ADDL y y))
	// cond: x != z
	// result: (LEAL4 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		z := v_1
		if z.Op != ssaop.OpAMD64ADDL {
			break
		}
		y := z.Args[1]
		if y != z.Args[0] || !(x != z) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL4)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAL2 [c] {s} x (SHLLconst [2] y))
	// result: (LEAL8 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(v_1.AuxInt) != 2 {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64LEAL8)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAL2 [0] {s} (ADDL x x) x)
	// cond: s == nil
	// result: (SHLLconst [2] x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDL {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] || x != v_1 || !(s == nil) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLLconst)
		v.AuxInt = ssa.Int8ToAuxInt(2)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LEAL4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LEAL4 [c] {s} (ADDLconst [d] x) y)
	// cond: ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB
	// result: (LEAL4 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		y := v_1
		if !(ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL4)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAL4 [c] {s} x (ADDLconst [d] y))
	// cond: ssa.Is32Bit(int64(c)+4*int64(d)) && y.Op != ssaop.OpSB
	// result: (LEAL4 [c+4*d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(ssa.Is32Bit(int64(c)+4*int64(d)) && y.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL4)
		v.AuxInt = ssa.Int32ToAuxInt(c + 4*d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAL4 [c] {s} x z:(ADDL y y))
	// cond: x != z
	// result: (LEAL8 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		z := v_1
		if z.Op != ssaop.OpAMD64ADDL {
			break
		}
		y := z.Args[1]
		if y != z.Args[0] || !(x != z) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL8)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LEAL8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LEAL8 [c] {s} (ADDLconst [d] x) y)
	// cond: ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB
	// result: (LEAL8 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		y := v_1
		if !(ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL8)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAL8 [c] {s} x (ADDLconst [d] y))
	// cond: ssa.Is32Bit(int64(c)+8*int64(d)) && y.Op != ssaop.OpSB
	// result: (LEAL8 [c+8*d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(ssa.Is32Bit(int64(c)+8*int64(d)) && y.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAL8)
		v.AuxInt = ssa.Int32ToAuxInt(c + 8*d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LEAQ(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (LEAQ [c] {s} (ADDQconst [d] x))
	// cond: ssa.Is32Bit(int64(c)+int64(d))
	// result: (LEAQ [c+d] {s} x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) + int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg(x)
		return true
	}
	// match: (LEAQ [c] {s} (ADDQ x y))
	// cond: x.Op != ssaop.OpSB && y.Op != ssaop.OpSB
	// result: (LEAQ1 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			x := v_0_0
			y := v_0_1
			if !(x.Op != ssaop.OpSB && y.Op != ssaop.OpSB) {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAQ1)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (LEAQ [off1] {sym1} (LEAQ [off2] {sym2} x))
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (LEAQ [off1+off2] {ssa.MergeSym(sym1,sym2)} x)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg(x)
		return true
	}
	// match: (LEAQ [off1] {sym1} (LEAQ1 [off2] {sym2} x y))
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (LEAQ1 [off1+off2] {ssa.MergeSym(sym1,sym2)} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ1 {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ1)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ [off1] {sym1} (LEAQ2 [off2] {sym2} x y))
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (LEAQ2 [off1+off2] {ssa.MergeSym(sym1,sym2)} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ2 {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ2)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ [off1] {sym1} (LEAQ4 [off2] {sym2} x y))
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (LEAQ4 [off1+off2] {ssa.MergeSym(sym1,sym2)} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ4 {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ4)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ [off1] {sym1} (LEAQ8 [off2] {sym2} x y))
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (LEAQ8 [off1+off2] {ssa.MergeSym(sym1,sym2)} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ8 {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		y := v_0.Args[1]
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ8)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LEAQ1(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LEAQ1 [c] {s} (ADDQconst [d] x) y)
	// cond: ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB
	// result: (LEAQ1 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64ADDQconst {
				continue
			}
			d := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_0.Args[0]
			y := v_1
			if !(ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB) {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAQ1)
			v.AuxInt = ssa.Int32ToAuxInt(c + d)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (LEAQ1 [c] {s} x z:(ADDQ y y))
	// cond: x != z
	// result: (LEAQ2 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			z := v_1
			if z.Op != ssaop.OpAMD64ADDQ {
				continue
			}
			y := z.Args[1]
			if y != z.Args[0] || !(x != z) {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAQ2)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (LEAQ1 [c] {s} x (SHLQconst [2] y))
	// result: (LEAQ4 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(v_1.AuxInt) != 2 {
				continue
			}
			y := v_1.Args[0]
			v.Reset(ssaop.OpAMD64LEAQ4)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (LEAQ1 [c] {s} x (SHLQconst [3] y))
	// result: (LEAQ8 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(v_1.AuxInt) != 3 {
				continue
			}
			y := v_1.Args[0]
			v.Reset(ssaop.OpAMD64LEAQ8)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.Aux = ssa.SymToAux(s)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (LEAQ1 [off1] {sym1} (LEAQ [off2] {sym2} x) y)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && x.Op != ssaop.OpSB
	// result: (LEAQ1 [off1+off2] {ssa.MergeSym(sym1,sym2)} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64LEAQ {
				continue
			}
			off2 := ssa.AuxIntToInt32(v_0.AuxInt)
			sym2 := ssa.AuxToSym(v_0.Aux)
			x := v_0.Args[0]
			y := v_1
			if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && x.Op != ssaop.OpSB) {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAQ1)
			v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
			v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (LEAQ1 [off1] {sym1} x (LEAQ1 [off2] {sym2} y y))
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (LEAQ2 [off1+off2] {ssa.MergeSym(sym1, sym2)} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64LEAQ1 {
				continue
			}
			off2 := ssa.AuxIntToInt32(v_1.AuxInt)
			sym2 := ssa.AuxToSym(v_1.Aux)
			y := v_1.Args[1]
			if y != v_1.Args[0] || !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
				continue
			}
			v.Reset(ssaop.OpAMD64LEAQ2)
			v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
			v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (LEAQ1 [off1] {sym1} x (LEAQ1 [off2] {sym2} x y))
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (LEAQ2 [off1+off2] {ssa.MergeSym(sym1, sym2)} y x)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64LEAQ1 {
				continue
			}
			off2 := ssa.AuxIntToInt32(v_1.AuxInt)
			sym2 := ssa.AuxToSym(v_1.Aux)
			_ = v_1.Args[1]
			v_1_0 := v_1.Args[0]
			v_1_1 := v_1.Args[1]
			for _i1 := 0; _i1 <= 1; _i1, v_1_0, v_1_1 = _i1+1, v_1_1, v_1_0 {
				if x != v_1_0 {
					continue
				}
				y := v_1_1
				if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
					continue
				}
				v.Reset(ssaop.OpAMD64LEAQ2)
				v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
				v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
				v.AddArg2(y, x)
				return true
			}
		}
		break
	}
	// match: (LEAQ1 [0] x y)
	// cond: v.Aux == nil
	// result: (ADDQ x y)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		y := v_1
		if !(v.Aux == nil) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LEAQ2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LEAQ2 [c] {s} (ADDQconst [d] x) y)
	// cond: ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB
	// result: (LEAQ2 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		y := v_1
		if !(ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ2)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ2 [c] {s} x (ADDQconst [d] y))
	// cond: ssa.Is32Bit(int64(c)+2*int64(d)) && y.Op != ssaop.OpSB
	// result: (LEAQ2 [c+2*d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(ssa.Is32Bit(int64(c)+2*int64(d)) && y.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ2)
		v.AuxInt = ssa.Int32ToAuxInt(c + 2*d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ2 [c] {s} x z:(ADDQ y y))
	// cond: x != z
	// result: (LEAQ4 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		z := v_1
		if z.Op != ssaop.OpAMD64ADDQ {
			break
		}
		y := z.Args[1]
		if y != z.Args[0] || !(x != z) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ4)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ2 [c] {s} x (SHLQconst [2] y))
	// result: (LEAQ8 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(v_1.AuxInt) != 2 {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64LEAQ8)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ2 [0] {s} (ADDQ x x) x)
	// cond: s == nil
	// result: (SHLQconst [2] x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQ {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] || x != v_1 || !(s == nil) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQconst)
		v.AuxInt = ssa.Int8ToAuxInt(2)
		v.AddArg(x)
		return true
	}
	// match: (LEAQ2 [off1] {sym1} (LEAQ [off2] {sym2} x) y)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && x.Op != ssaop.OpSB
	// result: (LEAQ2 [off1+off2] {ssa.MergeSym(sym1,sym2)} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		x := v_0.Args[0]
		y := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && x.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ2)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ2 [off1] {sym1} x (LEAQ1 [off2] {sym2} y y))
	// cond: ssa.Is32Bit(int64(off1)+2*int64(off2)) && sym2 == nil
	// result: (LEAQ4 [off1+2*off2] {sym1} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ1 {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		y := v_1.Args[1]
		if y != v_1.Args[0] || !(ssa.Is32Bit(int64(off1)+2*int64(off2)) && sym2 == nil) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ4)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + 2*off2)
		v.Aux = ssa.SymToAux(sym1)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ2 [off] {sym} x (MOVQconst [scale]))
	// cond: ssa.Is32Bit(int64(off)+int64(scale)*2)
	// result: (LEAQ [off+int32(scale)*2] {sym} x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		scale := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(ssa.Is32Bit(int64(off) + int64(scale)*2)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.AuxInt = ssa.Int32ToAuxInt(off + int32(scale)*2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg(x)
		return true
	}
	// match: (LEAQ2 [off] {sym} x (MOVLconst [scale]))
	// cond: ssa.Is32Bit(int64(off)+int64(scale)*2)
	// result: (LEAQ [off+int32(scale)*2] {sym} x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		scale := ssa.AuxIntToInt32(v_1.AuxInt)
		if !(ssa.Is32Bit(int64(off) + int64(scale)*2)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.AuxInt = ssa.Int32ToAuxInt(off + int32(scale)*2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LEAQ4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LEAQ4 [c] {s} (ADDQconst [d] x) y)
	// cond: ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB
	// result: (LEAQ4 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		y := v_1
		if !(ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ4)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ4 [c] {s} x (ADDQconst [d] y))
	// cond: ssa.Is32Bit(int64(c)+4*int64(d)) && y.Op != ssaop.OpSB
	// result: (LEAQ4 [c+4*d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(ssa.Is32Bit(int64(c)+4*int64(d)) && y.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ4)
		v.AuxInt = ssa.Int32ToAuxInt(c + 4*d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ4 [c] {s} x z:(ADDQ y y))
	// cond: x != z
	// result: (LEAQ8 [c] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		z := v_1
		if z.Op != ssaop.OpAMD64ADDQ {
			break
		}
		y := z.Args[1]
		if y != z.Args[0] || !(x != z) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ8)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ4 [off1] {sym1} (LEAQ [off2] {sym2} x) y)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && x.Op != ssaop.OpSB
	// result: (LEAQ4 [off1+off2] {ssa.MergeSym(sym1,sym2)} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		x := v_0.Args[0]
		y := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && x.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ4)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ4 [off1] {sym1} x (LEAQ1 [off2] {sym2} y y))
	// cond: ssa.Is32Bit(int64(off1)+4*int64(off2)) && sym2 == nil
	// result: (LEAQ8 [off1+4*off2] {sym1} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ1 {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		y := v_1.Args[1]
		if y != v_1.Args[0] || !(ssa.Is32Bit(int64(off1)+4*int64(off2)) && sym2 == nil) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ8)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + 4*off2)
		v.Aux = ssa.SymToAux(sym1)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ4 [off] {sym} x (MOVQconst [scale]))
	// cond: ssa.Is32Bit(int64(off)+int64(scale)*4)
	// result: (LEAQ [off+int32(scale)*4] {sym} x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		scale := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(ssa.Is32Bit(int64(off) + int64(scale)*4)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.AuxInt = ssa.Int32ToAuxInt(off + int32(scale)*4)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg(x)
		return true
	}
	// match: (LEAQ4 [off] {sym} x (MOVLconst [scale]))
	// cond: ssa.Is32Bit(int64(off)+int64(scale)*4)
	// result: (LEAQ [off+int32(scale)*4] {sym} x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		scale := ssa.AuxIntToInt32(v_1.AuxInt)
		if !(ssa.Is32Bit(int64(off) + int64(scale)*4)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.AuxInt = ssa.Int32ToAuxInt(off + int32(scale)*4)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LEAQ8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LEAQ8 [c] {s} (ADDQconst [d] x) y)
	// cond: ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB
	// result: (LEAQ8 [c+d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		y := v_1
		if !(ssa.Is32Bit(int64(c)+int64(d)) && x.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ8)
		v.AuxInt = ssa.Int32ToAuxInt(c + d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ8 [c] {s} x (ADDQconst [d] y))
	// cond: ssa.Is32Bit(int64(c)+8*int64(d)) && y.Op != ssaop.OpSB
	// result: (LEAQ8 [c+8*d] {s} x y)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(ssa.Is32Bit(int64(c)+8*int64(d)) && y.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ8)
		v.AuxInt = ssa.Int32ToAuxInt(c + 8*d)
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ8 [off1] {sym1} (LEAQ [off2] {sym2} x) y)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && x.Op != ssaop.OpSB
	// result: (LEAQ8 [off1+off2] {ssa.MergeSym(sym1,sym2)} x y)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		x := v_0.Args[0]
		y := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && x.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ8)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(x, y)
		return true
	}
	// match: (LEAQ8 [off] {sym} x (MOVQconst [scale]))
	// cond: ssa.Is32Bit(int64(off)+int64(scale)*8)
	// result: (LEAQ [off+int32(scale)*8] {sym} x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		scale := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(ssa.Is32Bit(int64(off) + int64(scale)*8)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.AuxInt = ssa.Int32ToAuxInt(off + int32(scale)*8)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg(x)
		return true
	}
	// match: (LEAQ8 [off] {sym} x (MOVLconst [scale]))
	// cond: ssa.Is32Bit(int64(off)+int64(scale)*8)
	// result: (LEAQ [off+int32(scale)*8] {sym} x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		scale := ssa.AuxIntToInt32(v_1.AuxInt)
		if !(ssa.Is32Bit(int64(off) + int64(scale)*8)) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.AuxInt = ssa.Int32ToAuxInt(off + int32(scale)*8)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LoweredPanicBoundsCR(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LoweredPanicBoundsCR [kind] {p} (MOVQconst [c]) mem)
	// result: (LoweredPanicBoundsCC [kind] {ssa.PanicBoundsCC{Cx:p.C, Cy:c}} mem)
	for {
		kind := ssa.AuxIntToInt64(v.AuxInt)
		p := ssa.AuxToPanicBoundsC(v.Aux)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_0.AuxInt)
		mem := v_1
		v.Reset(ssaop.OpAMD64LoweredPanicBoundsCC)
		v.AuxInt = ssa.Int64ToAuxInt(kind)
		v.Aux = ssa.PanicBoundsCCToAux(ssa.PanicBoundsCC{Cx: p.C, Cy: c})
		v.AddArg(mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LoweredPanicBoundsRC(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LoweredPanicBoundsRC [kind] {p} (MOVQconst [c]) mem)
	// result: (LoweredPanicBoundsCC [kind] {ssa.PanicBoundsCC{Cx:c, Cy:p.C}} mem)
	for {
		kind := ssa.AuxIntToInt64(v.AuxInt)
		p := ssa.AuxToPanicBoundsC(v.Aux)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_0.AuxInt)
		mem := v_1
		v.Reset(ssaop.OpAMD64LoweredPanicBoundsCC)
		v.AuxInt = ssa.Int64ToAuxInt(kind)
		v.Aux = ssa.PanicBoundsCCToAux(ssa.PanicBoundsCC{Cx: c, Cy: p.C})
		v.AddArg(mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64LoweredPanicBoundsRR(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LoweredPanicBoundsRR [kind] x (MOVQconst [c]) mem)
	// result: (LoweredPanicBoundsRC [kind] x {ssa.PanicBoundsC{C:c}} mem)
	for {
		kind := ssa.AuxIntToInt64(v.AuxInt)
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64LoweredPanicBoundsRC)
		v.AuxInt = ssa.Int64ToAuxInt(kind)
		v.Aux = ssa.PanicBoundsCToAux(ssa.PanicBoundsC{C: c})
		v.AddArg2(x, mem)
		return true
	}
	// match: (LoweredPanicBoundsRR [kind] (MOVQconst [c]) y mem)
	// result: (LoweredPanicBoundsCR [kind] {ssa.PanicBoundsC{C:c}} y mem)
	for {
		kind := ssa.AuxIntToInt64(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_0.AuxInt)
		y := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64LoweredPanicBoundsCR)
		v.AuxInt = ssa.Int64ToAuxInt(kind)
		v.Aux = ssa.PanicBoundsCToAux(ssa.PanicBoundsC{C: c})
		v.AddArg2(y, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVBELstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVBELstore [i] {s} p x:(BSWAPL w) mem)
	// cond: x.Uses == 1
	// result: (MOVLstore [i] {s} p w mem)
	for {
		i := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		p := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64BSWAPL {
			break
		}
		w := x.Args[0]
		mem := v_2
		if !(x.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AuxInt = ssa.Int32ToAuxInt(i)
		v.Aux = ssa.SymToAux(s)
		v.AddArg3(p, w, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVBEQstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVBEQstore [i] {s} p x:(BSWAPQ w) mem)
	// cond: x.Uses == 1
	// result: (MOVQstore [i] {s} p w mem)
	for {
		i := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		p := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64BSWAPQ {
			break
		}
		w := x.Args[0]
		mem := v_2
		if !(x.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstore)
		v.AuxInt = ssa.Int32ToAuxInt(i)
		v.Aux = ssa.SymToAux(s)
		v.AddArg3(p, w, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVBEWstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVBEWstore [i] {s} p x:(ROLWconst [8] w) mem)
	// cond: x.Uses == 1
	// result: (MOVWstore [i] {s} p w mem)
	for {
		i := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		p := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64ROLWconst || ssa.AuxIntToInt8(x.AuxInt) != 8 {
			break
		}
		w := x.Args[0]
		mem := v_2
		if !(x.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWstore)
		v.AuxInt = ssa.Int32ToAuxInt(i)
		v.Aux = ssa.SymToAux(s)
		v.AddArg3(p, w, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVBQSX(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (MOVBQSX x:(MOVBload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVBQSXload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVBload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVBQSXload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBQSX x:(MOVWload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVBQSXload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVWload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVBQSXload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBQSX x:(MOVLload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVBQSXload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVBQSXload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBQSX x:(MOVQload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVBQSXload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVBQSXload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBQSX (ANDLconst [c] x))
	// cond: c & 0x80 == 0
	// result: (ANDLconst [c & 0x7f] x)
	for {
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(c&0x80 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c & 0x7f)
		v.AddArg(x)
		return true
	}
	// match: (MOVBQSX (MOVBQSX x))
	// result: (MOVBQSX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVBQSX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVBQSX)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVBQSXload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVBQSXload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _))
	// cond: sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)
	// result: (MOVBQSX x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVBstore {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		x := v_1.Args[1]
		ptr2 := v_1.Args[0]
		if !(sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBQSX)
		v.AddArg(x)
		return true
	}
	// match: (MOVBQSXload [off1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVBQSXload [off1+off2] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBQSXload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	// match: (MOVBQSXload [off] {sym} (SB) _)
	// cond: ssa.SymIsRO(sym)
	// result: (MOVQconst [int64(int8(ssa.Read8(sym, int64(off))))])
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpSB || !(ssa.SymIsRO(sym)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(int8(ssa.Read8(sym, int64(off)))))
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVBQZX(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (MOVBQZX x:(MOVBload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVBload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVBload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBQZX x:(MOVWload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVWload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVBload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBQZX x:(MOVLload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVBload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBQZX x:(MOVQload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVBload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVBload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBQZX (ANDLconst [c] x))
	// result: (ANDLconst [c & 0xff] x)
	for {
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c & 0xff)
		v.AddArg(x)
		return true
	}
	// match: (MOVBQZX (MOVBQZX x))
	// result: (MOVBQZX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVBQZX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVBQZX)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVBatomicload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVBatomicload [off1] {sym} (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVBatomicload [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBatomicload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBatomicload [off1] {sym1} (LEAQ [off2] {sym2} ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVBatomicload [off1+off2] {ssa.MergeSym(sym1, sym2)} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBatomicload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVBload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _))
	// cond: sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)
	// result: (MOVBQZX x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVBstore {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		x := v_1.Args[1]
		ptr2 := v_1.Args[0]
		if !(sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBQZX)
		v.AddArg(x)
		return true
	}
	// match: (MOVBload [off1] {sym} (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVBload [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBload [off1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVBload [off1+off2] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	// match: (MOVBload [off] {sym} (SB) _)
	// cond: ssa.SymIsRO(sym)
	// result: (MOVLconst [int32(ssa.Read8(sym, int64(off)))])
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpSB || !(ssa.SymIsRO(sym)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(int32(ssa.Read8(sym, int64(off))))
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVBstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVBstore [off] {sym} ptr y:(SETL x) mem)
	// cond: y.Uses == 1
	// result: (SETLstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SETL {
			break
		}
		x := y.Args[0]
		mem := v_2
		if !(y.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETLstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr y:(SETLE x) mem)
	// cond: y.Uses == 1
	// result: (SETLEstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SETLE {
			break
		}
		x := y.Args[0]
		mem := v_2
		if !(y.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETLEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr y:(SETG x) mem)
	// cond: y.Uses == 1
	// result: (SETGstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SETG {
			break
		}
		x := y.Args[0]
		mem := v_2
		if !(y.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETGstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr y:(SETGE x) mem)
	// cond: y.Uses == 1
	// result: (SETGEstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SETGE {
			break
		}
		x := y.Args[0]
		mem := v_2
		if !(y.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETGEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr y:(SETEQ x) mem)
	// cond: y.Uses == 1
	// result: (SETEQstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SETEQ {
			break
		}
		x := y.Args[0]
		mem := v_2
		if !(y.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETEQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr y:(SETNE x) mem)
	// cond: y.Uses == 1
	// result: (SETNEstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SETNE {
			break
		}
		x := y.Args[0]
		mem := v_2
		if !(y.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETNEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr y:(SETB x) mem)
	// cond: y.Uses == 1
	// result: (SETBstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SETB {
			break
		}
		x := y.Args[0]
		mem := v_2
		if !(y.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr y:(SETBE x) mem)
	// cond: y.Uses == 1
	// result: (SETBEstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SETBE {
			break
		}
		x := y.Args[0]
		mem := v_2
		if !(y.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETBEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr y:(SETA x) mem)
	// cond: y.Uses == 1
	// result: (SETAstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SETA {
			break
		}
		x := y.Args[0]
		mem := v_2
		if !(y.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETAstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr y:(SETAE x) mem)
	// cond: y.Uses == 1
	// result: (SETAEstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SETAE {
			break
		}
		x := y.Args[0]
		mem := v_2
		if !(y.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETAEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr (MOVBQSX x) mem)
	// result: (MOVBstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVBQSX {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr (MOVBQZX x) mem)
	// result: (MOVBstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVBQZX {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVBstore [off1] {sym} (ADDQconst [off2] ptr) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVBstore [off1+off2] {sym} ptr val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr (MOVLconst [c]) mem)
	// result: (MOVBstoreconst [ssa.MakeValAndOff(int32(int8(c)),off)] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(int8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr (MOVQconst [c]) mem)
	// result: (MOVBstoreconst [ssa.MakeValAndOff(int32(int8(c)),off)] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(int8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVBstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr a:(ADDLconst [c] l:(MOVBload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)
	// result: (ADDBconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVBload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr a:(ANDLconst [c] l:(MOVBload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)
	// result: (ANDBconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVBload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr a:(ORLconst [c] l:(MOVBload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)
	// result: (ORBconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ORLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVBload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr a:(XORLconst [c] l:(MOVBload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)
	// result: (XORBconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64XORLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVBload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBstore [off] {sym} ptr (KMOVBi mask) mem)
	// result: (KMOVBstore [off] {sym} ptr mask mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64KMOVBi {
			break
		}
		mask := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64KMOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVBstoreconst(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVBstoreconst [sc] {s} (ADDQconst [off] ptr) mem)
	// cond: ssa.ValAndOff(sc).CanAdd32(off)
	// result: (MOVBstoreconst [ssa.ValAndOff(sc).AddOffset32(off)] {s} ptr mem)
	for {
		sc := ssa.AuxIntToValAndOff(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(sc).CanAdd32(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(sc).AddOffset32(off))
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVBstoreconst [sc] {sym1} (LEAQ [off] {sym2} ptr) mem)
	// cond: ssa.CanMergeSym(sym1, sym2) && ssa.ValAndOff(sc).CanAdd32(off)
	// result: (MOVBstoreconst [ssa.ValAndOff(sc).AddOffset32(off)] {ssa.MergeSym(sym1, sym2)} ptr mem)
	for {
		sc := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.CanMergeSym(sym1, sym2) && ssa.ValAndOff(sc).CanAdd32(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(sc).AddOffset32(off))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVLQSX(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (MOVLQSX x:(MOVLload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVLQSXload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVLQSXload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLQSX x:(MOVQload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVLQSXload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVLQSXload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLQSX (ANDLconst [c] x))
	// cond: uint32(c) & 0x80000000 == 0
	// result: (ANDLconst [c & 0x7fffffff] x)
	for {
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(uint32(c)&0x80000000 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c & 0x7fffffff)
		v.AddArg(x)
		return true
	}
	// match: (MOVLQSX (MOVLQSX x))
	// result: (MOVLQSX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVLQSX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVLQSX)
		v.AddArg(x)
		return true
	}
	// match: (MOVLQSX (MOVWQSX x))
	// result: (MOVWQSX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVWQSX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVWQSX)
		v.AddArg(x)
		return true
	}
	// match: (MOVLQSX (MOVBQSX x))
	// result: (MOVBQSX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVBQSX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVBQSX)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVLQSXload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	config := b.Func.Config
	// match: (MOVLQSXload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _))
	// cond: sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)
	// result: (MOVLQSX x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLstore {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		x := v_1.Args[1]
		ptr2 := v_1.Args[0]
		if !(sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLQSX)
		v.AddArg(x)
		return true
	}
	// match: (MOVLQSXload [off1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVLQSXload [off1+off2] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLQSXload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	// match: (MOVLQSXload [off] {sym} (SB) _)
	// cond: ssa.SymIsRO(sym)
	// result: (MOVQconst [int64(int32(ssa.Read32(sym, int64(off), config.Ctxt.Arch.ByteOrder)))])
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpSB || !(ssa.SymIsRO(sym)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(int32(ssa.Read32(sym, int64(off), config.Ctxt.Arch.ByteOrder))))
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVLQZX(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (MOVLQZX x:(MOVLload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVLload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVLload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLQZX x:(MOVQload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVLload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVLload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLQZX (ANDLconst [c] x))
	// result: (ANDLconst [c] x)
	for {
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (MOVLQZX (MOVLQZX x))
	// result: (MOVLQZX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVLQZX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVLQZX)
		v.AddArg(x)
		return true
	}
	// match: (MOVLQZX (MOVWQZX x))
	// result: (MOVWQZX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVWQZX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVWQZX)
		v.AddArg(x)
		return true
	}
	// match: (MOVLQZX (MOVBQZX x))
	// result: (MOVBQZX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVBQZX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVBQZX)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVLatomicload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVLatomicload [off1] {sym} (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVLatomicload [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLatomicload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLatomicload [off1] {sym1} (LEAQ [off2] {sym2} ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVLatomicload [off1+off2] {ssa.MergeSym(sym1, sym2)} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLatomicload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVLf2i(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (MOVLf2i <t> (Arg <u> [off] {sym}))
	// cond: t.Size() == u.Size()
	// result: @b.Func.Entry (Arg <t> [off] {sym})
	for {
		t := v.Type
		if v_0.Op != ssaop.OpArg {
			break
		}
		u := v_0.Type
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		sym := ssa.AuxToSym(v_0.Aux)
		if !(t.Size() == u.Size()) {
			break
		}
		b = b.Func.Entry
		v0 := b.NewValue0(v.Pos, ssaop.OpArg, t)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVLi2f(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (MOVLi2f <t> (Arg <u> [off] {sym}))
	// cond: t.Size() == u.Size()
	// result: @b.Func.Entry (Arg <t> [off] {sym})
	for {
		t := v.Type
		if v_0.Op != ssaop.OpArg {
			break
		}
		u := v_0.Type
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		sym := ssa.AuxToSym(v_0.Aux)
		if !(t.Size() == u.Size()) {
			break
		}
		b = b.Func.Entry
		v0 := b.NewValue0(v.Pos, ssaop.OpArg, t)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVLload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	config := b.Func.Config
	// match: (MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _))
	// cond: sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)
	// result: (MOVLQZX x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLstore {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		x := v_1.Args[1]
		ptr2 := v_1.Args[0]
		if !(sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLQZX)
		v.AddArg(x)
		return true
	}
	// match: (MOVLload [off1] {sym} (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVLload [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLload [off1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVLload [off1+off2] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	// match: (MOVLload [off] {sym} ptr (MOVSSstore [off] {sym} ptr val _))
	// result: (MOVLf2i val)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVSSstore || ssa.AuxIntToInt32(v_1.AuxInt) != off || ssa.AuxToSym(v_1.Aux) != sym {
			break
		}
		val := v_1.Args[1]
		if ptr != v_1.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLf2i)
		v.AddArg(val)
		return true
	}
	// match: (MOVLload <t> [off] {sym} (SB) _)
	// cond: ssa.SymIsRO(sym) && ssa.Is32BitInt(t)
	// result: (MOVLconst [int32(ssa.Read32(sym, int64(off), config.Ctxt.Arch.ByteOrder))])
	for {
		t := v.Type
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpSB || !(ssa.SymIsRO(sym) && ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(int32(ssa.Read32(sym, int64(off), config.Ctxt.Arch.ByteOrder)))
		return true
	}
	// match: (MOVLload <t> [off] {sym} (SB) _)
	// cond: ssa.SymIsRO(sym) && ssa.Is64BitInt(t)
	// result: (MOVQconst [int64(ssa.Read32(sym, int64(off), config.Ctxt.Arch.ByteOrder))])
	for {
		t := v.Type
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpSB || !(ssa.SymIsRO(sym) && ssa.Is64BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(ssa.Read32(sym, int64(off), config.Ctxt.Arch.ByteOrder)))
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVLstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVLstore [off] {sym} ptr (MOVLQSX x) mem)
	// result: (MOVLstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLQSX {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVLstore [off] {sym} ptr (MOVLQZX x) mem)
	// result: (MOVLstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLQZX {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVLstore [off1] {sym} (ADDQconst [off2] ptr) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVLstore [off1+off2] {sym} ptr val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVLstore [off] {sym} ptr (MOVLconst [c]) mem)
	// result: (MOVLstoreconst [ssa.MakeValAndOff(int32(c),off)] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVLstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLstore [off] {sym} ptr (MOVQconst [c]) mem)
	// result: (MOVLstoreconst [ssa.MakeValAndOff(int32(c),off)] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVLstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVLstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (MOVLstore {sym} [off] ptr y:(ADDLload x [off] {sym} ptr mem) mem)
	// cond: y.Uses==1 && ssa.Clobber(y)
	// result: (ADDLmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ADDLload || ssa.AuxIntToInt32(y.AuxInt) != off || ssa.AuxToSym(y.Aux) != sym {
			break
		}
		mem := y.Args[2]
		x := y.Args[0]
		if ptr != y.Args[1] || mem != v_2 || !(y.Uses == 1 && ssa.Clobber(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVLstore {sym} [off] ptr y:(ANDLload x [off] {sym} ptr mem) mem)
	// cond: y.Uses==1 && ssa.Clobber(y)
	// result: (ANDLmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ANDLload || ssa.AuxIntToInt32(y.AuxInt) != off || ssa.AuxToSym(y.Aux) != sym {
			break
		}
		mem := y.Args[2]
		x := y.Args[0]
		if ptr != y.Args[1] || mem != v_2 || !(y.Uses == 1 && ssa.Clobber(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVLstore {sym} [off] ptr y:(ORLload x [off] {sym} ptr mem) mem)
	// cond: y.Uses==1 && ssa.Clobber(y)
	// result: (ORLmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ORLload || ssa.AuxIntToInt32(y.AuxInt) != off || ssa.AuxToSym(y.Aux) != sym {
			break
		}
		mem := y.Args[2]
		x := y.Args[0]
		if ptr != y.Args[1] || mem != v_2 || !(y.Uses == 1 && ssa.Clobber(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVLstore {sym} [off] ptr y:(XORLload x [off] {sym} ptr mem) mem)
	// cond: y.Uses==1 && ssa.Clobber(y)
	// result: (XORLmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64XORLload || ssa.AuxIntToInt32(y.AuxInt) != off || ssa.AuxToSym(y.Aux) != sym {
			break
		}
		mem := y.Args[2]
		x := y.Args[0]
		if ptr != y.Args[1] || mem != v_2 || !(y.Uses == 1 && ssa.Clobber(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVLstore {sym} [off] ptr y:(ADDL l:(MOVLload [off] {sym} ptr mem) x) mem)
	// cond: y.Uses==1 && l.Uses==1 && ssa.Clobber(y, l)
	// result: (ADDLmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ADDL {
			break
		}
		_ = y.Args[1]
		y_0 := y.Args[0]
		y_1 := y.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, y_0, y_1 = _i0+1, y_1, y_0 {
			l := y_0
			if l.Op != ssaop.OpAMD64MOVLload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
				continue
			}
			mem := l.Args[1]
			if ptr != l.Args[0] {
				continue
			}
			x := y_1
			if mem != v_2 || !(y.Uses == 1 && l.Uses == 1 && ssa.Clobber(y, l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ADDLmodify)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(ptr, x, mem)
			return true
		}
		break
	}
	// match: (MOVLstore {sym} [off] ptr y:(SUBL l:(MOVLload [off] {sym} ptr mem) x) mem)
	// cond: y.Uses==1 && l.Uses==1 && ssa.Clobber(y, l)
	// result: (SUBLmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SUBL {
			break
		}
		x := y.Args[1]
		l := y.Args[0]
		if l.Op != ssaop.OpAMD64MOVLload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		if ptr != l.Args[0] || mem != v_2 || !(y.Uses == 1 && l.Uses == 1 && ssa.Clobber(y, l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVLstore {sym} [off] ptr y:(ANDL l:(MOVLload [off] {sym} ptr mem) x) mem)
	// cond: y.Uses==1 && l.Uses==1 && ssa.Clobber(y, l)
	// result: (ANDLmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ANDL {
			break
		}
		_ = y.Args[1]
		y_0 := y.Args[0]
		y_1 := y.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, y_0, y_1 = _i0+1, y_1, y_0 {
			l := y_0
			if l.Op != ssaop.OpAMD64MOVLload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
				continue
			}
			mem := l.Args[1]
			if ptr != l.Args[0] {
				continue
			}
			x := y_1
			if mem != v_2 || !(y.Uses == 1 && l.Uses == 1 && ssa.Clobber(y, l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ANDLmodify)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(ptr, x, mem)
			return true
		}
		break
	}
	// match: (MOVLstore {sym} [off] ptr y:(ORL l:(MOVLload [off] {sym} ptr mem) x) mem)
	// cond: y.Uses==1 && l.Uses==1 && ssa.Clobber(y, l)
	// result: (ORLmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ORL {
			break
		}
		_ = y.Args[1]
		y_0 := y.Args[0]
		y_1 := y.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, y_0, y_1 = _i0+1, y_1, y_0 {
			l := y_0
			if l.Op != ssaop.OpAMD64MOVLload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
				continue
			}
			mem := l.Args[1]
			if ptr != l.Args[0] {
				continue
			}
			x := y_1
			if mem != v_2 || !(y.Uses == 1 && l.Uses == 1 && ssa.Clobber(y, l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ORLmodify)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(ptr, x, mem)
			return true
		}
		break
	}
	// match: (MOVLstore {sym} [off] ptr y:(XORL l:(MOVLload [off] {sym} ptr mem) x) mem)
	// cond: y.Uses==1 && l.Uses==1 && ssa.Clobber(y, l)
	// result: (XORLmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64XORL {
			break
		}
		_ = y.Args[1]
		y_0 := y.Args[0]
		y_1 := y.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, y_0, y_1 = _i0+1, y_1, y_0 {
			l := y_0
			if l.Op != ssaop.OpAMD64MOVLload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
				continue
			}
			mem := l.Args[1]
			if ptr != l.Args[0] {
				continue
			}
			x := y_1
			if mem != v_2 || !(y.Uses == 1 && l.Uses == 1 && ssa.Clobber(y, l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64XORLmodify)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(ptr, x, mem)
			return true
		}
		break
	}
	// match: (MOVLstore [off] {sym} ptr a:(ADDLconst [c] l:(MOVLload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)
	// result: (ADDLconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVLload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLstore [off] {sym} ptr a:(ANDLconst [c] l:(MOVLload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)
	// result: (ANDLconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVLload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLstore [off] {sym} ptr a:(ORLconst [c] l:(MOVLload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)
	// result: (ORLconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ORLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVLload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLstore [off] {sym} ptr a:(XORLconst [c] l:(MOVLload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)
	// result: (XORLconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64XORLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVLload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLstore [off] {sym} ptr (MOVLf2i val) mem)
	// result: (MOVSSstore [off] {sym} ptr val mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLf2i {
			break
		}
		val := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVSSstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVLstore [i] {s} p x:(BSWAPL w) mem)
	// cond: x.Uses == 1 && buildcfg.GOAMD64 >= 3
	// result: (MOVBELstore [i] {s} p w mem)
	for {
		i := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		p := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64BSWAPL {
			break
		}
		w := x.Args[0]
		mem := v_2
		if !(x.Uses == 1 && buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBELstore)
		v.AuxInt = ssa.Int32ToAuxInt(i)
		v.Aux = ssa.SymToAux(s)
		v.AddArg3(p, w, mem)
		return true
	}
	// match: (MOVLstore [off] {sym} ptr (KMOVDi mask) mem)
	// result: (KMOVDstore [off] {sym} ptr mask mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64KMOVDi {
			break
		}
		mask := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64KMOVDstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVLstoreconst(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVLstoreconst [sc] {s} (ADDQconst [off] ptr) mem)
	// cond: ssa.ValAndOff(sc).CanAdd32(off)
	// result: (MOVLstoreconst [ssa.ValAndOff(sc).AddOffset32(off)] {s} ptr mem)
	for {
		sc := ssa.AuxIntToValAndOff(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(sc).CanAdd32(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(sc).AddOffset32(off))
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVLstoreconst [sc] {sym1} (LEAQ [off] {sym2} ptr) mem)
	// cond: ssa.CanMergeSym(sym1, sym2) && ssa.ValAndOff(sc).CanAdd32(off)
	// result: (MOVLstoreconst [ssa.ValAndOff(sc).AddOffset32(off)] {ssa.MergeSym(sym1, sym2)} ptr mem)
	for {
		sc := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.CanMergeSym(sym1, sym2) && ssa.ValAndOff(sc).CanAdd32(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(sc).AddOffset32(off))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVOload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVOload [off1] {sym} (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVOload [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVOload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVOload [off1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVOload [off1+off2] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVOload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVOstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	config := b.Func.Config
	typ := &b.Func.Config.Types
	// match: (MOVOstore [off1] {sym} (ADDQconst [off2] ptr) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVOstore [off1+off2] {sym} ptr val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVOstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVOstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVOstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVOstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (MOVOstore [dstOff] {dstSym} ptr (MOVOload [srcOff] {srcSym} (SB) _) mem)
	// cond: ssa.SymIsRO(srcSym)
	// result: (MOVQstore [dstOff+8] {dstSym} ptr (MOVQconst [int64(ssa.Read64(srcSym, int64(srcOff)+8, config.Ctxt.Arch.ByteOrder))]) (MOVQstore [dstOff] {dstSym} ptr (MOVQconst [int64(ssa.Read64(srcSym, int64(srcOff), config.Ctxt.Arch.ByteOrder))]) mem))
	for {
		dstOff := ssa.AuxIntToInt32(v.AuxInt)
		dstSym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVOload {
			break
		}
		srcOff := ssa.AuxIntToInt32(v_1.AuxInt)
		srcSym := ssa.AuxToSym(v_1.Aux)
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpSB {
			break
		}
		mem := v_2
		if !(ssa.SymIsRO(srcSym)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstore)
		v.AuxInt = ssa.Int32ToAuxInt(dstOff + 8)
		v.Aux = ssa.SymToAux(dstSym)
		v0 := b.NewValue0(v_1.Pos, ssaop.OpAMD64MOVQconst, typ.UInt64)
		v0.AuxInt = ssa.Int64ToAuxInt(int64(ssa.Read64(srcSym, int64(srcOff)+8, config.Ctxt.Arch.ByteOrder)))
		v1 := b.NewValue0(v_1.Pos, ssaop.OpAMD64MOVQstore, types.TypeMem)
		v1.AuxInt = ssa.Int32ToAuxInt(dstOff)
		v1.Aux = ssa.SymToAux(dstSym)
		v2 := b.NewValue0(v_1.Pos, ssaop.OpAMD64MOVQconst, typ.UInt64)
		v2.AuxInt = ssa.Int64ToAuxInt(int64(ssa.Read64(srcSym, int64(srcOff), config.Ctxt.Arch.ByteOrder)))
		v1.AddArg3(ptr, v2, mem)
		v.AddArg3(ptr, v0, v1)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVOstoreconst(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVOstoreconst [sc] {s} (ADDQconst [off] ptr) mem)
	// cond: ssa.ValAndOff(sc).CanAdd32(off)
	// result: (MOVOstoreconst [ssa.ValAndOff(sc).AddOffset32(off)] {s} ptr mem)
	for {
		sc := ssa.AuxIntToValAndOff(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(sc).CanAdd32(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVOstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(sc).AddOffset32(off))
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVOstoreconst [sc] {sym1} (LEAQ [off] {sym2} ptr) mem)
	// cond: ssa.CanMergeSym(sym1, sym2) && ssa.ValAndOff(sc).CanAdd32(off)
	// result: (MOVOstoreconst [ssa.ValAndOff(sc).AddOffset32(off)] {ssa.MergeSym(sym1, sym2)} ptr mem)
	for {
		sc := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.CanMergeSym(sym1, sym2) && ssa.ValAndOff(sc).CanAdd32(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVOstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(sc).AddOffset32(off))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVQatomicload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVQatomicload [off1] {sym} (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVQatomicload [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQatomicload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQatomicload [off1] {sym1} (LEAQ [off2] {sym2} ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVQatomicload [off1+off2] {ssa.MergeSym(sym1, sym2)} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQatomicload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVQf2i(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (MOVQf2i <t> (Arg <u> [off] {sym}))
	// cond: t.Size() == u.Size()
	// result: @b.Func.Entry (Arg <t> [off] {sym})
	for {
		t := v.Type
		if v_0.Op != ssaop.OpArg {
			break
		}
		u := v_0.Type
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		sym := ssa.AuxToSym(v_0.Aux)
		if !(t.Size() == u.Size()) {
			break
		}
		b = b.Func.Entry
		v0 := b.NewValue0(v.Pos, ssaop.OpArg, t)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVQi2f(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (MOVQi2f <t> (Arg <u> [off] {sym}))
	// cond: t.Size() == u.Size()
	// result: @b.Func.Entry (Arg <t> [off] {sym})
	for {
		t := v.Type
		if v_0.Op != ssaop.OpArg {
			break
		}
		u := v_0.Type
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		sym := ssa.AuxToSym(v_0.Aux)
		if !(t.Size() == u.Size()) {
			break
		}
		b = b.Func.Entry
		v0 := b.NewValue0(v.Pos, ssaop.OpArg, t)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVQload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	config := b.Func.Config
	// match: (MOVQload [off] {sym} ptr (MOVQstore [off2] {sym2} ptr2 x _))
	// cond: sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)
	// result: x
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQstore {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		x := v_1.Args[1]
		ptr2 := v_1.Args[0]
		if !(sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (MOVQload [off1] {sym} (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVQload [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQload [off1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVQload [off1+off2] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	// match: (MOVQload [off] {sym} ptr (MOVSDstore [off] {sym} ptr val _))
	// result: (MOVQf2i val)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVSDstore || ssa.AuxIntToInt32(v_1.AuxInt) != off || ssa.AuxToSym(v_1.Aux) != sym {
			break
		}
		val := v_1.Args[1]
		if ptr != v_1.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQf2i)
		v.AddArg(val)
		return true
	}
	// match: (MOVQload [off] {sym} (SB) _)
	// cond: ssa.SymIsRO(sym)
	// result: (MOVQconst [int64(ssa.Read64(sym, int64(off), config.Ctxt.Arch.ByteOrder))])
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpSB || !(ssa.SymIsRO(sym)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(ssa.Read64(sym, int64(off), config.Ctxt.Arch.ByteOrder)))
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVQstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVQstore [off1] {sym} (ADDQconst [off2] ptr) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVQstore [off1+off2] {sym} ptr val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVQstore [off] {sym} ptr (MOVQconst [c]) mem)
	// cond: validVal(c)
	// result: (MOVQstoreconst [ssa.MakeValAndOff(int32(c),off)] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mem := v_2
		if !(validVal(c)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVQstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (MOVQstore {sym} [off] ptr y:(ADDQload x [off] {sym} ptr mem) mem)
	// cond: y.Uses==1 && ssa.Clobber(y)
	// result: (ADDQmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ADDQload || ssa.AuxIntToInt32(y.AuxInt) != off || ssa.AuxToSym(y.Aux) != sym {
			break
		}
		mem := y.Args[2]
		x := y.Args[0]
		if ptr != y.Args[1] || mem != v_2 || !(y.Uses == 1 && ssa.Clobber(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVQstore {sym} [off] ptr y:(ANDQload x [off] {sym} ptr mem) mem)
	// cond: y.Uses==1 && ssa.Clobber(y)
	// result: (ANDQmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ANDQload || ssa.AuxIntToInt32(y.AuxInt) != off || ssa.AuxToSym(y.Aux) != sym {
			break
		}
		mem := y.Args[2]
		x := y.Args[0]
		if ptr != y.Args[1] || mem != v_2 || !(y.Uses == 1 && ssa.Clobber(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVQstore {sym} [off] ptr y:(ORQload x [off] {sym} ptr mem) mem)
	// cond: y.Uses==1 && ssa.Clobber(y)
	// result: (ORQmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ORQload || ssa.AuxIntToInt32(y.AuxInt) != off || ssa.AuxToSym(y.Aux) != sym {
			break
		}
		mem := y.Args[2]
		x := y.Args[0]
		if ptr != y.Args[1] || mem != v_2 || !(y.Uses == 1 && ssa.Clobber(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVQstore {sym} [off] ptr y:(XORQload x [off] {sym} ptr mem) mem)
	// cond: y.Uses==1 && ssa.Clobber(y)
	// result: (XORQmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64XORQload || ssa.AuxIntToInt32(y.AuxInt) != off || ssa.AuxToSym(y.Aux) != sym {
			break
		}
		mem := y.Args[2]
		x := y.Args[0]
		if ptr != y.Args[1] || mem != v_2 || !(y.Uses == 1 && ssa.Clobber(y)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVQstore {sym} [off] ptr y:(ADDQ l:(MOVQload [off] {sym} ptr mem) x) mem)
	// cond: y.Uses==1 && l.Uses==1 && ssa.Clobber(y, l)
	// result: (ADDQmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ADDQ {
			break
		}
		_ = y.Args[1]
		y_0 := y.Args[0]
		y_1 := y.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, y_0, y_1 = _i0+1, y_1, y_0 {
			l := y_0
			if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
				continue
			}
			mem := l.Args[1]
			if ptr != l.Args[0] {
				continue
			}
			x := y_1
			if mem != v_2 || !(y.Uses == 1 && l.Uses == 1 && ssa.Clobber(y, l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ADDQmodify)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(ptr, x, mem)
			return true
		}
		break
	}
	// match: (MOVQstore {sym} [off] ptr y:(SUBQ l:(MOVQload [off] {sym} ptr mem) x) mem)
	// cond: y.Uses==1 && l.Uses==1 && ssa.Clobber(y, l)
	// result: (SUBQmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64SUBQ {
			break
		}
		x := y.Args[1]
		l := y.Args[0]
		if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		if ptr != l.Args[0] || mem != v_2 || !(y.Uses == 1 && l.Uses == 1 && ssa.Clobber(y, l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVQstore {sym} [off] ptr y:(ANDQ l:(MOVQload [off] {sym} ptr mem) x) mem)
	// cond: y.Uses==1 && l.Uses==1 && ssa.Clobber(y, l)
	// result: (ANDQmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ANDQ {
			break
		}
		_ = y.Args[1]
		y_0 := y.Args[0]
		y_1 := y.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, y_0, y_1 = _i0+1, y_1, y_0 {
			l := y_0
			if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
				continue
			}
			mem := l.Args[1]
			if ptr != l.Args[0] {
				continue
			}
			x := y_1
			if mem != v_2 || !(y.Uses == 1 && l.Uses == 1 && ssa.Clobber(y, l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ANDQmodify)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(ptr, x, mem)
			return true
		}
		break
	}
	// match: (MOVQstore {sym} [off] ptr y:(ORQ l:(MOVQload [off] {sym} ptr mem) x) mem)
	// cond: y.Uses==1 && l.Uses==1 && ssa.Clobber(y, l)
	// result: (ORQmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64ORQ {
			break
		}
		_ = y.Args[1]
		y_0 := y.Args[0]
		y_1 := y.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, y_0, y_1 = _i0+1, y_1, y_0 {
			l := y_0
			if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
				continue
			}
			mem := l.Args[1]
			if ptr != l.Args[0] {
				continue
			}
			x := y_1
			if mem != v_2 || !(y.Uses == 1 && l.Uses == 1 && ssa.Clobber(y, l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ORQmodify)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(ptr, x, mem)
			return true
		}
		break
	}
	// match: (MOVQstore {sym} [off] ptr y:(XORQ l:(MOVQload [off] {sym} ptr mem) x) mem)
	// cond: y.Uses==1 && l.Uses==1 && ssa.Clobber(y, l)
	// result: (XORQmodify [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		y := v_1
		if y.Op != ssaop.OpAMD64XORQ {
			break
		}
		_ = y.Args[1]
		y_0 := y.Args[0]
		y_1 := y.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, y_0, y_1 = _i0+1, y_1, y_0 {
			l := y_0
			if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
				continue
			}
			mem := l.Args[1]
			if ptr != l.Args[0] {
				continue
			}
			x := y_1
			if mem != v_2 || !(y.Uses == 1 && l.Uses == 1 && ssa.Clobber(y, l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64XORQmodify)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(ptr, x, mem)
			return true
		}
		break
	}
	// match: (MOVQstore {sym} [off] ptr x:(BTSQconst [c] l:(MOVQload {sym} [off] ptr mem)) mem)
	// cond: x.Uses == 1 && l.Uses == 1 && ssa.Clobber(x, l)
	// result: (BTSQconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64BTSQconst {
			break
		}
		c := ssa.AuxIntToInt8(x.AuxInt)
		l := x.Args[0]
		if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		if ptr != l.Args[0] || mem != v_2 || !(x.Uses == 1 && l.Uses == 1 && ssa.Clobber(x, l)) {
			break
		}
		v.Reset(ssaop.OpAMD64BTSQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQstore {sym} [off] ptr x:(BTRQconst [c] l:(MOVQload {sym} [off] ptr mem)) mem)
	// cond: x.Uses == 1 && l.Uses == 1 && ssa.Clobber(x, l)
	// result: (BTRQconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64BTRQconst {
			break
		}
		c := ssa.AuxIntToInt8(x.AuxInt)
		l := x.Args[0]
		if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		if ptr != l.Args[0] || mem != v_2 || !(x.Uses == 1 && l.Uses == 1 && ssa.Clobber(x, l)) {
			break
		}
		v.Reset(ssaop.OpAMD64BTRQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQstore {sym} [off] ptr x:(BTCQconst [c] l:(MOVQload {sym} [off] ptr mem)) mem)
	// cond: x.Uses == 1 && l.Uses == 1 && ssa.Clobber(x, l)
	// result: (BTCQconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64BTCQconst {
			break
		}
		c := ssa.AuxIntToInt8(x.AuxInt)
		l := x.Args[0]
		if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		if ptr != l.Args[0] || mem != v_2 || !(x.Uses == 1 && l.Uses == 1 && ssa.Clobber(x, l)) {
			break
		}
		v.Reset(ssaop.OpAMD64BTCQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQstore [off] {sym} ptr a:(ADDQconst [c] l:(MOVQload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)
	// result: (ADDQconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQstore [off] {sym} ptr a:(ANDQconst [c] l:(MOVQload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)
	// result: (ANDQconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQstore [off] {sym} ptr a:(ORQconst [c] l:(MOVQload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)
	// result: (ORQconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ORQconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQstore [off] {sym} ptr a:(XORQconst [c] l:(MOVQload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)
	// result: (XORQconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64XORQconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVQload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQstore [off] {sym} ptr (MOVQf2i val) mem)
	// result: (MOVSDstore [off] {sym} ptr val mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQf2i {
			break
		}
		val := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVSDstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVQstore [i] {s} p x:(BSWAPQ w) mem)
	// cond: x.Uses == 1 && buildcfg.GOAMD64 >= 3
	// result: (MOVBEQstore [i] {s} p w mem)
	for {
		i := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		p := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64BSWAPQ {
			break
		}
		w := x.Args[0]
		mem := v_2
		if !(x.Uses == 1 && buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBEQstore)
		v.AuxInt = ssa.Int32ToAuxInt(i)
		v.Aux = ssa.SymToAux(s)
		v.AddArg3(p, w, mem)
		return true
	}
	// match: (MOVQstore [off] {sym} ptr (KMOVQi mask) mem)
	// result: (KMOVQstore [off] {sym} ptr mask mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64KMOVQi {
			break
		}
		mask := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64KMOVQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVQstoreconst(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVQstoreconst [sc] {s} (ADDQconst [off] ptr) mem)
	// cond: ssa.ValAndOff(sc).CanAdd32(off)
	// result: (MOVQstoreconst [ssa.ValAndOff(sc).AddOffset32(off)] {s} ptr mem)
	for {
		sc := ssa.AuxIntToValAndOff(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(sc).CanAdd32(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(sc).AddOffset32(off))
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQstoreconst [sc] {sym1} (LEAQ [off] {sym2} ptr) mem)
	// cond: ssa.CanMergeSym(sym1, sym2) && ssa.ValAndOff(sc).CanAdd32(off)
	// result: (MOVQstoreconst [ssa.ValAndOff(sc).AddOffset32(off)] {ssa.MergeSym(sym1, sym2)} ptr mem)
	for {
		sc := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.CanMergeSym(sym1, sym2) && ssa.ValAndOff(sc).CanAdd32(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(sc).AddOffset32(off))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVQstoreconst [c] {s} p1 x:(MOVQstoreconst [a] {s} p0 mem))
	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+8-c.Off())) && a.Val() == 0 && c.Val() == 0 && ssa.SetPos(v, x.Pos) && ssa.Clobber(x)
	// result: (MOVOstoreconst [ssa.MakeValAndOff(0,a.Off())] {s} p0 mem)
	for {
		c := ssa.AuxIntToValAndOff(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		p1 := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64MOVQstoreconst {
			break
		}
		a := ssa.AuxIntToValAndOff(x.AuxInt)
		if ssa.AuxToSym(x.Aux) != s {
			break
		}
		mem := x.Args[1]
		p0 := x.Args[0]
		if !(x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+8-c.Off())) && a.Val() == 0 && c.Val() == 0 && ssa.SetPos(v, x.Pos) && ssa.Clobber(x)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVOstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, a.Off()))
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(p0, mem)
		return true
	}
	// match: (MOVQstoreconst [a] {s} p0 x:(MOVQstoreconst [c] {s} p1 mem))
	// cond: x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+8-c.Off())) && a.Val() == 0 && c.Val() == 0 && ssa.SetPos(v, x.Pos) && ssa.Clobber(x)
	// result: (MOVOstoreconst [ssa.MakeValAndOff(0,a.Off())] {s} p0 mem)
	for {
		a := ssa.AuxIntToValAndOff(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		p0 := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64MOVQstoreconst {
			break
		}
		c := ssa.AuxIntToValAndOff(x.AuxInt)
		if ssa.AuxToSym(x.Aux) != s {
			break
		}
		mem := x.Args[1]
		p1 := x.Args[0]
		if !(x.Uses == 1 && sequentialAddresses(p0, p1, int64(a.Off()+8-c.Off())) && a.Val() == 0 && c.Val() == 0 && ssa.SetPos(v, x.Pos) && ssa.Clobber(x)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVOstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, a.Off()))
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(p0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVSDload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVSDload [off1] {sym} (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVSDload [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVSDload [off1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVSDload [off1+off2] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	// match: (MOVSDload [off] {sym} ptr (MOVQstore [off] {sym} ptr val _))
	// result: (MOVQi2f val)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQstore || ssa.AuxIntToInt32(v_1.AuxInt) != off || ssa.AuxToSym(v_1.Aux) != sym {
			break
		}
		val := v_1.Args[1]
		if ptr != v_1.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQi2f)
		v.AddArg(val)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVSDstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (MOVSDstore [off1] {sym} (ADDQconst [off2] ptr) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVSDstore [off1+off2] {sym} ptr val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSDstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVSDstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVSDstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSDstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (MOVSDstore [off] {sym} ptr (MOVQi2f val) mem)
	// result: (MOVQstore [off] {sym} ptr val mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQi2f {
			break
		}
		val := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVSDstore [off] {sym} ptr (MOVSDconst [f]) mem)
	// cond: f == f
	// result: (MOVQstore [off] {sym} ptr (MOVQconst [int64(math.Float64bits(f))]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVSDconst {
			break
		}
		f := ssa.AuxIntToFloat64(v_1.AuxInt)
		mem := v_2
		if !(f == f) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQconst, typ.UInt64)
		v0.AuxInt = ssa.Int64ToAuxInt(int64(math.Float64bits(f)))
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVSSload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVSSload [off1] {sym} (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVSSload [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVSSload [off1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVSSload [off1+off2] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	// match: (MOVSSload [off] {sym} ptr (MOVLstore [off] {sym} ptr val _))
	// result: (MOVLi2f val)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLstore || ssa.AuxIntToInt32(v_1.AuxInt) != off || ssa.AuxToSym(v_1.Aux) != sym {
			break
		}
		val := v_1.Args[1]
		if ptr != v_1.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLi2f)
		v.AddArg(val)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVSSstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (MOVSSstore [off1] {sym} (ADDQconst [off2] ptr) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVSSstore [off1+off2] {sym} ptr val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSSstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVSSstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVSSstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSSstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (MOVSSstore [off] {sym} ptr (MOVLi2f val) mem)
	// result: (MOVLstore [off] {sym} ptr val mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLi2f {
			break
		}
		val := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVSSstore [off] {sym} ptr (MOVSSconst [f]) mem)
	// cond: f == f
	// result: (MOVLstore [off] {sym} ptr (MOVLconst [int32(math.Float32bits(f))]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVSSconst {
			break
		}
		f := ssa.AuxIntToFloat32(v_1.AuxInt)
		mem := v_2
		if !(f == f) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(int32(math.Float32bits(f)))
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVWQSX(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (MOVWQSX x:(MOVWload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVWQSXload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVWload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVWQSXload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWQSX x:(MOVLload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVWQSXload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVWQSXload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWQSX x:(MOVQload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVWQSXload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVWQSXload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWQSX (ANDLconst [c] x))
	// cond: c & 0x8000 == 0
	// result: (ANDLconst [c & 0x7fff] x)
	for {
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(c&0x8000 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c & 0x7fff)
		v.AddArg(x)
		return true
	}
	// match: (MOVWQSX (MOVWQSX x))
	// result: (MOVWQSX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVWQSX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVWQSX)
		v.AddArg(x)
		return true
	}
	// match: (MOVWQSX (MOVBQSX x))
	// result: (MOVBQSX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVBQSX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVBQSX)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVWQSXload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	config := b.Func.Config
	// match: (MOVWQSXload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _))
	// cond: sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)
	// result: (MOVWQSX x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVWstore {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		x := v_1.Args[1]
		ptr2 := v_1.Args[0]
		if !(sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWQSX)
		v.AddArg(x)
		return true
	}
	// match: (MOVWQSXload [off1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVWQSXload [off1+off2] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWQSXload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	// match: (MOVWQSXload [off] {sym} (SB) _)
	// cond: ssa.SymIsRO(sym)
	// result: (MOVQconst [int64(int16(ssa.Read16(sym, int64(off), config.Ctxt.Arch.ByteOrder)))])
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpSB || !(ssa.SymIsRO(sym)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(int16(ssa.Read16(sym, int64(off), config.Ctxt.Arch.ByteOrder))))
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVWQZX(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (MOVWQZX x:(MOVWload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVWload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVWload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWQZX x:(MOVLload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVWload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWQZX x:(MOVQload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (MOVWload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64MOVWload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWQZX (ANDLconst [c] x))
	// result: (ANDLconst [c & 0xffff] x)
	for {
		if v_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c & 0xffff)
		v.AddArg(x)
		return true
	}
	// match: (MOVWQZX (MOVWQZX x))
	// result: (MOVWQZX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVWQZX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVWQZX)
		v.AddArg(x)
		return true
	}
	// match: (MOVWQZX (MOVBQZX x))
	// result: (MOVBQZX x)
	for {
		if v_0.Op != ssaop.OpAMD64MOVBQZX {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MOVBQZX)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVWload(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	config := b.Func.Config
	// match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _))
	// cond: sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)
	// result: (MOVWQZX x)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVWstore {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		x := v_1.Args[1]
		ptr2 := v_1.Args[0]
		if !(sym == sym2 && off == off2 && ssa.IsSamePtr(ptr, ptr2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWQZX)
		v.AddArg(x)
		return true
	}
	// match: (MOVWload [off1] {sym} (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVWload [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWload [off1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVWload [off1+off2] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	// match: (MOVWload [off] {sym} (SB) _)
	// cond: ssa.SymIsRO(sym)
	// result: (MOVLconst [int32(ssa.Read16(sym, int64(off), config.Ctxt.Arch.ByteOrder))])
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpSB || !(ssa.SymIsRO(sym)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(int32(ssa.Read16(sym, int64(off), config.Ctxt.Arch.ByteOrder)))
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVWstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVWstore [off] {sym} ptr (MOVWQSX x) mem)
	// result: (MOVWstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVWQSX {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVWstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVWstore [off] {sym} ptr (MOVWQZX x) mem)
	// result: (MOVWstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVWQZX {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVWstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (MOVWstore [off1] {sym} (ADDQconst [off2] ptr) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MOVWstore [off1+off2] {sym} ptr val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (MOVWstore [off] {sym} ptr (MOVLconst [c]) mem)
	// result: (MOVWstoreconst [ssa.MakeValAndOff(int32(int16(c)),off)] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVWstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(int16(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWstore [off] {sym} ptr (MOVQconst [c]) mem)
	// result: (MOVWstoreconst [ssa.MakeValAndOff(int32(int16(c)),off)] {sym} ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVWstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(int16(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MOVWstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (MOVWstore [off] {sym} ptr a:(ADDLconst [c] l:(MOVWload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)
	// result: (ADDWconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVWload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWstore [off] {sym} ptr a:(ANDLconst [c] l:(MOVWload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)
	// result: (ANDWconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVWload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWstore [off] {sym} ptr a:(ORLconst [c] l:(MOVWload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)
	// result: (ORWconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64ORLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVWload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWstore [off] {sym} ptr a:(XORLconst [c] l:(MOVWload [off] {sym} ptr2 mem)) mem)
	// cond: ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)
	// result: (XORWconstmodify {sym} [ssa.MakeValAndOff(int32(c),off)] ptr mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		a := v_1
		if a.Op != ssaop.OpAMD64XORLconst {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		l := a.Args[0]
		if l.Op != ssaop.OpAMD64MOVWload || ssa.AuxIntToInt32(l.AuxInt) != off || ssa.AuxToSym(l.Aux) != sym {
			break
		}
		mem := l.Args[1]
		ptr2 := l.Args[0]
		if mem != v_2 || !(ssa.IsSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && c == int32(int8(c)) && ssa.Clobber(l, a)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(c), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWstore [i] {s} p x:(ROLWconst [8] w) mem)
	// cond: x.Uses == 1 && buildcfg.GOAMD64 >= 3
	// result: (MOVBEWstore [i] {s} p w mem)
	for {
		i := ssa.AuxIntToInt32(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		p := v_0
		x := v_1
		if x.Op != ssaop.OpAMD64ROLWconst || ssa.AuxIntToInt8(x.AuxInt) != 8 {
			break
		}
		w := x.Args[0]
		mem := v_2
		if !(x.Uses == 1 && buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBEWstore)
		v.AuxInt = ssa.Int32ToAuxInt(i)
		v.Aux = ssa.SymToAux(s)
		v.AddArg3(p, w, mem)
		return true
	}
	// match: (MOVWstore [off] {sym} ptr (KMOVWi mask) mem)
	// result: (KMOVWstore [off] {sym} ptr mask mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64KMOVWi {
			break
		}
		mask := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64KMOVWstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MOVWstoreconst(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MOVWstoreconst [sc] {s} (ADDQconst [off] ptr) mem)
	// cond: ssa.ValAndOff(sc).CanAdd32(off)
	// result: (MOVWstoreconst [ssa.ValAndOff(sc).AddOffset32(off)] {s} ptr mem)
	for {
		sc := ssa.AuxIntToValAndOff(v.AuxInt)
		s := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(sc).CanAdd32(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(sc).AddOffset32(off))
		v.Aux = ssa.SymToAux(s)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (MOVWstoreconst [sc] {sym1} (LEAQ [off] {sym2} ptr) mem)
	// cond: ssa.CanMergeSym(sym1, sym2) && ssa.ValAndOff(sc).CanAdd32(off)
	// result: (MOVWstoreconst [ssa.ValAndOff(sc).AddOffset32(off)] {ssa.MergeSym(sym1, sym2)} ptr mem)
	for {
		sc := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		ptr := v_0.Args[0]
		mem := v_1
		if !(ssa.CanMergeSym(sym1, sym2) && ssa.ValAndOff(sc).CanAdd32(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(sc).AddOffset32(off))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MULL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MULL x (MOVLconst [c]))
	// result: (MULLconst [c] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1.AuxInt)
			v.Reset(ssaop.OpAMD64MULLconst)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.AddArg(x)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64MULLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	config := b.Func.Config
	// match: (MULLconst [c] (MULLconst [d] x))
	// result: (MULLconst [c * d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MULLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64MULLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c * d)
		v.AddArg(x)
		return true
	}
	// match: (MULLconst [ 0] _)
	// result: (MOVLconst [0])
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (MULLconst [ 1] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (MULLconst [c] x)
	// cond: v.Type.Size() <= 4 && ssa.CanMulStrengthReduce32(config, c)
	// result: {ssa.MulStrengthReduce32(v, x, c)}
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		x := v_0
		if !(v.Type.Size() <= 4 && ssa.CanMulStrengthReduce32(config, c)) {
			break
		}
		v.CopyOf(ssa.MulStrengthReduce32(v, x, c))
		return true
	}
	// match: (MULLconst [c] (MOVLconst [d]))
	// result: (MOVLconst [c*d])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c * d)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MULQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MULQ x (MOVQconst [c]))
	// cond: ssa.Is32Bit(c)
	// result: (MULQconst [int32(c)] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1.AuxInt)
			if !(ssa.Is32Bit(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64MULQconst)
			v.AuxInt = ssa.Int32ToAuxInt(int32(c))
			v.AddArg(x)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64MULQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	config := b.Func.Config
	// match: (MULQconst [c] (MULQconst [d] x))
	// cond: ssa.Is32Bit(int64(c)*int64(d))
	// result: (MULQconst [c * d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MULQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(c) * int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64MULQconst)
		v.AuxInt = ssa.Int32ToAuxInt(c * d)
		v.AddArg(x)
		return true
	}
	// match: (MULQconst [ 0] _)
	// result: (MOVQconst [0])
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(0)
		return true
	}
	// match: (MULQconst [ 1] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (MULQconst [c] x)
	// cond: ssa.CanMulStrengthReduce(config, int64(c))
	// result: {ssa.MulStrengthReduce(v, x, int64(c))}
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		x := v_0
		if !(ssa.CanMulStrengthReduce(config, int64(c))) {
			break
		}
		v.CopyOf(ssa.MulStrengthReduce(v, x, int64(c)))
		return true
	}
	// match: (MULQconst [c] (MOVQconst [d]))
	// result: (MOVQconst [int64(c)*d])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(c) * d)
		return true
	}
	// match: (MULQconst [c] (NEGQ x))
	// cond: c != -(1<<31)
	// result: (MULQconst [-c] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64NEGQ {
			break
		}
		x := v_0.Args[0]
		if !(c != -(1 << 31)) {
			break
		}
		v.Reset(ssaop.OpAMD64MULQconst)
		v.AuxInt = ssa.Int32ToAuxInt(-c)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MULSD(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MULSD x l:(MOVSDload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (MULSDload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVSDload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64MULSDload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64MULSDload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (MULSDload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MULSDload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MULSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (MULSDload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MULSDload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MULSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (MULSDload x [off] {sym} ptr (MOVQstore [off] {sym} ptr y _))
	// result: (MULSD x (MOVQi2f y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVQstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64MULSD)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVQi2f, typ.Float64)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64MULSS(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (MULSS x l:(MOVSSload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (MULSSload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVSSload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64MULSSload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64MULSSload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (MULSSload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (MULSSload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64MULSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (MULSSload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (MULSSload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64MULSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (MULSSload x [off] {sym} ptr (MOVLstore [off] {sym} ptr y _))
	// result: (MULSS x (MOVLi2f y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVLstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64MULSS)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVLi2f, typ.Float32)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64NEGL(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (NEGL (NEGL x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64NEGL {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	// match: (NEGL s:(SUBL x y))
	// cond: s.Uses == 1
	// result: (SUBL y x)
	for {
		s := v_0
		if s.Op != ssaop.OpAMD64SUBL {
			break
		}
		y := s.Args[1]
		x := s.Args[0]
		if !(s.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBL)
		v.AddArg2(y, x)
		return true
	}
	// match: (NEGL (MOVLconst [c]))
	// result: (MOVLconst [-c])
	for {
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(-c)
		return true
	}
	return false
}
func rewriteValue_OpAMD64NEGQ(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (NEGQ (NEGQ x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64NEGQ {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	// match: (NEGQ s:(SUBQ x y))
	// cond: s.Uses == 1
	// result: (SUBQ y x)
	for {
		s := v_0
		if s.Op != ssaop.OpAMD64SUBQ {
			break
		}
		y := s.Args[1]
		x := s.Args[0]
		if !(s.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQ)
		v.AddArg2(y, x)
		return true
	}
	// match: (NEGQ (MOVQconst [c]))
	// result: (MOVQconst [-c])
	for {
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(-c)
		return true
	}
	// match: (NEGQ (ADDQconst [c] (NEGQ x)))
	// cond: c != -(1<<31)
	// result: (ADDQconst [-c] x)
	for {
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		v_0_0 := v_0.Args[0]
		if v_0_0.Op != ssaop.OpAMD64NEGQ {
			break
		}
		x := v_0_0.Args[0]
		if !(c != -(1 << 31)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconst)
		v.AuxInt = ssa.Int32ToAuxInt(-c)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64NOTL(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (NOTL (MOVLconst [c]))
	// result: (MOVLconst [^c])
	for {
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(^c)
		return true
	}
	return false
}
func rewriteValue_OpAMD64NOTQ(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (NOTQ (MOVQconst [c]))
	// result: (MOVQconst [^c])
	for {
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(^c)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ORBconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ORBconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ORBconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ORBconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ORBconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ORL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ORL (SHLL (MOVLconst [1]) y) x)
	// result: (BTSL x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64SHLL {
				continue
			}
			y := v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_0_0.AuxInt) != 1 {
				continue
			}
			x := v_1
			v.Reset(ssaop.OpAMD64BTSL)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ORL x (MOVLconst [c]))
	// result: (ORLconst [c] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1.AuxInt)
			v.Reset(ssaop.OpAMD64ORLconst)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ORL x x)
	// result: x
	for {
		x := v_0
		if x != v_1 {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (ORL x l:(MOVLload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (ORLload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVLload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ORLload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64ORLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (ORLconst [c] (ORLconst [d] x))
	// result: (ORLconst [c | d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ORLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ORLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c | d)
		v.AddArg(x)
		return true
	}
	// match: (ORLconst [0] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (ORLconst [-1] _)
	// result: (MOVLconst [-1])
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != -1 {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(-1)
		return true
	}
	// match: (ORLconst [c] (MOVLconst [d]))
	// result: (MOVLconst [c|d])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c | d)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ORLconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ORLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ORLconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ORLconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ORLconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ORLload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ORLload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ORLload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ORLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ORLload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ORLload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: ( ORLload x [off] {sym} ptr (MOVSSstore [off] {sym} ptr y _))
	// result: ( ORL x (MOVLf2i y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVSSstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ORL)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVLf2i, typ.UInt32)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ORLmodify(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ORLmodify [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ORLmodify [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ORLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (ORLmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ORLmodify [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ORQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ORQ (SHLQ (MOVQconst [1]) y) x)
	// result: (BTSQ x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64SHLQ {
				continue
			}
			y := v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_0_0.AuxInt) != 1 {
				continue
			}
			x := v_1
			v.Reset(ssaop.OpAMD64BTSQ)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (ORQ (MOVQconst [c]) x)
	// cond: ssa.IsPowerOfTwo(uint64(c)) && uint64(c) >= 1<<31
	// result: (BTSQconst [int8(ssa.Log64u(uint64(c)))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_0.AuxInt)
			x := v_1
			if !(ssa.IsPowerOfTwo(uint64(c)) && uint64(c) >= 1<<31) {
				continue
			}
			v.Reset(ssaop.OpAMD64BTSQconst)
			v.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log64u(uint64(c))))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ORQ x (MOVQconst [c]))
	// cond: ssa.Is32Bit(c)
	// result: (ORQconst [int32(c)] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1.AuxInt)
			if !(ssa.Is32Bit(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ORQconst)
			v.AuxInt = ssa.Int32ToAuxInt(int32(c))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ORQ x (MOVLconst [c]))
	// result: (ORQconst [c] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1.AuxInt)
			v.Reset(ssaop.OpAMD64ORQconst)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (ORQ (MOVQconst [c]) (MOVQconst [d]))
	// result: (MOVQconst [c|d])
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_0.AuxInt)
			if v_1.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			d := ssa.AuxIntToInt64(v_1.AuxInt)
			v.Reset(ssaop.OpAMD64MOVQconst)
			v.AuxInt = ssa.Int64ToAuxInt(c | d)
			return true
		}
		break
	}
	// match: (ORQ x x)
	// result: x
	for {
		x := v_0
		if x != v_1 {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (ORQ x l:(MOVQload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (ORQload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVQload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64ORQload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64ORQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (ORQconst [c] (ORQconst [d] x))
	// result: (ORQconst [c | d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ORQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ORQconst)
		v.AuxInt = ssa.Int32ToAuxInt(c | d)
		v.AddArg(x)
		return true
	}
	// match: (ORQconst [0] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (ORQconst [-1] _)
	// result: (MOVQconst [-1])
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != -1 {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(-1)
		return true
	}
	// match: (ORQconst [c] (MOVQconst [d]))
	// result: (MOVQconst [int64(c)|d])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(c) | d)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ORQconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ORQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ORQconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ORQconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ORQconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ORQload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (ORQload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ORQload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ORQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (ORQload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ORQload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: ( ORQload x [off] {sym} ptr (MOVSDstore [off] {sym} ptr y _))
	// result: ( ORQ x (MOVQf2i y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVSDstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ORQ)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVQf2i, typ.UInt64)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ORQmodify(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ORQmodify [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (ORQmodify [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64ORQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (ORQmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (ORQmodify [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ORWconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ORWconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (ORWconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (ORWconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (ORWconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ROLB(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ROLB x (NEGQ y))
	// result: (RORB x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64RORB)
		v.AddArg2(x, y)
		return true
	}
	// match: (ROLB x (NEGL y))
	// result: (RORB x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64RORB)
		v.AddArg2(x, y)
		return true
	}
	// match: (ROLB x (MOVQconst [c]))
	// result: (ROLBconst [int8(c&7) ] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLBconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 7))
		v.AddArg(x)
		return true
	}
	// match: (ROLB x (MOVLconst [c]))
	// result: (ROLBconst [int8(c&7) ] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLBconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 7))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ROLBconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (ROLBconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ROLL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ROLL x (NEGQ y))
	// result: (RORL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64RORL)
		v.AddArg2(x, y)
		return true
	}
	// match: (ROLL x (NEGL y))
	// result: (RORL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64RORL)
		v.AddArg2(x, y)
		return true
	}
	// match: (ROLL x (MOVQconst [c]))
	// result: (ROLLconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (ROLL x (MOVLconst [c]))
	// result: (ROLLconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ROLLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (ROLLconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ROLQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ROLQ x (NEGQ y))
	// result: (RORQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64RORQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (ROLQ x (NEGL y))
	// result: (RORQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64RORQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (ROLQ x (MOVQconst [c]))
	// result: (ROLQconst [int8(c&63)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v.AddArg(x)
		return true
	}
	// match: (ROLQ x (MOVLconst [c]))
	// result: (ROLQconst [int8(c&63)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ROLQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (ROLQconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ROLW(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (ROLW x (NEGQ y))
	// result: (RORW x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64RORW)
		v.AddArg2(x, y)
		return true
	}
	// match: (ROLW x (NEGL y))
	// result: (RORW x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64RORW)
		v.AddArg2(x, y)
		return true
	}
	// match: (ROLW x (MOVQconst [c]))
	// result: (ROLWconst [int8(c&15)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLWconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 15))
		v.AddArg(x)
		return true
	}
	// match: (ROLW x (MOVLconst [c]))
	// result: (ROLWconst [int8(c&15)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLWconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 15))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64ROLWconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (ROLWconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64RORB(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (RORB x (NEGQ y))
	// result: (ROLB x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64ROLB)
		v.AddArg2(x, y)
		return true
	}
	// match: (RORB x (NEGL y))
	// result: (ROLB x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64ROLB)
		v.AddArg2(x, y)
		return true
	}
	// match: (RORB x (MOVQconst [c]))
	// result: (ROLBconst [int8((-c)&7) ] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLBconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8((-c) & 7))
		v.AddArg(x)
		return true
	}
	// match: (RORB x (MOVLconst [c]))
	// result: (ROLBconst [int8((-c)&7) ] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLBconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8((-c) & 7))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64RORL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (RORL x (NEGQ y))
	// result: (ROLL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64ROLL)
		v.AddArg2(x, y)
		return true
	}
	// match: (RORL x (NEGL y))
	// result: (ROLL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64ROLL)
		v.AddArg2(x, y)
		return true
	}
	// match: (RORL x (MOVQconst [c]))
	// result: (ROLLconst [int8((-c)&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8((-c) & 31))
		v.AddArg(x)
		return true
	}
	// match: (RORL x (MOVLconst [c]))
	// result: (ROLLconst [int8((-c)&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8((-c) & 31))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64RORQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (RORQ x (NEGQ y))
	// result: (ROLQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64ROLQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (RORQ x (NEGL y))
	// result: (ROLQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64ROLQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (RORQ x (MOVQconst [c]))
	// result: (ROLQconst [int8((-c)&63)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8((-c) & 63))
		v.AddArg(x)
		return true
	}
	// match: (RORQ x (MOVLconst [c]))
	// result: (ROLQconst [int8((-c)&63)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8((-c) & 63))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64RORW(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (RORW x (NEGQ y))
	// result: (ROLW x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64ROLW)
		v.AddArg2(x, y)
		return true
	}
	// match: (RORW x (NEGL y))
	// result: (ROLW x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		y := v_1.Args[0]
		v.Reset(ssaop.OpAMD64ROLW)
		v.AddArg2(x, y)
		return true
	}
	// match: (RORW x (MOVQconst [c]))
	// result: (ROLWconst [int8((-c)&15)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLWconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8((-c) & 15))
		v.AddArg(x)
		return true
	}
	// match: (RORW x (MOVLconst [c]))
	// result: (ROLWconst [int8((-c)&15)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64ROLWconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8((-c) & 15))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SARB(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SARB x (MOVQconst [c]))
	// result: (SARBconst [int8(min(int64(c)&31,7))] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SARBconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(min(int64(c)&31, 7)))
		v.AddArg(x)
		return true
	}
	// match: (SARB x (MOVLconst [c]))
	// result: (SARBconst [int8(min(int64(c)&31,7))] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SARBconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(min(int64(c)&31, 7)))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SARBconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SARBconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (SARBconst [c] (MOVQconst [d]))
	// result: (MOVQconst [int64(int8(d))>>uint64(c)])
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(int8(d)) >> uint64(c))
		return true
	}
	return false
}
func rewriteValue_OpAMD64SARL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (SARL x (MOVQconst [c]))
	// result: (SARLconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SARLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (SARL x (MOVLconst [c]))
	// result: (SARLconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SARLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (SARL x (ADDQconst [c] y))
	// cond: c & 31 == 0
	// result: (SARL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SARL x (NEGQ <t> (ADDQconst [c] y)))
	// cond: c & 31 == 0
	// result: (SARL x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SARL x (ANDQconst [c] y))
	// cond: c & 31 == 31
	// result: (SARL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SARL x (NEGQ <t> (ANDQconst [c] y)))
	// cond: c & 31 == 31
	// result: (SARL x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SARL x (ADDLconst [c] y))
	// cond: c & 31 == 0
	// result: (SARL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SARL x (NEGL <t> (ADDLconst [c] y)))
	// cond: c & 31 == 0
	// result: (SARL x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SARL x (ANDLconst [c] y))
	// cond: c & 31 == 31
	// result: (SARL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SARL x (NEGL <t> (ANDLconst [c] y)))
	// cond: c & 31 == 31
	// result: (SARL x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SARL l:(MOVLload [off] {sym} ptr mem) x)
	// cond: buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (SARXLload [off] {sym} ptr x mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		x := v_1
		if !(buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARXLload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SARLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SARLconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (SARLconst [c] (MOVQconst [d]))
	// result: (MOVQconst [int64(int32(d))>>uint64(c)])
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(int32(d)) >> uint64(c))
		return true
	}
	return false
}
func rewriteValue_OpAMD64SARQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (SARQ x (MOVQconst [c]))
	// result: (SARQconst [int8(c&63)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SARQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v.AddArg(x)
		return true
	}
	// match: (SARQ x (MOVLconst [c]))
	// result: (SARQconst [int8(c&63)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SARQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v.AddArg(x)
		return true
	}
	// match: (SARQ x (ADDQconst [c] y))
	// cond: c & 63 == 0
	// result: (SARQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SARQ x (NEGQ <t> (ADDQconst [c] y)))
	// cond: c & 63 == 0
	// result: (SARQ x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SARQ x (ANDQconst [c] y))
	// cond: c & 63 == 63
	// result: (SARQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SARQ x (NEGQ <t> (ANDQconst [c] y)))
	// cond: c & 63 == 63
	// result: (SARQ x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SARQ x (ADDLconst [c] y))
	// cond: c & 63 == 0
	// result: (SARQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SARQ x (NEGL <t> (ADDLconst [c] y)))
	// cond: c & 63 == 0
	// result: (SARQ x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SARQ x (ANDLconst [c] y))
	// cond: c & 63 == 63
	// result: (SARQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SARQ x (NEGL <t> (ANDLconst [c] y)))
	// cond: c & 63 == 63
	// result: (SARQ x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SARQ l:(MOVQload [off] {sym} ptr mem) x)
	// cond: buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (SARXQload [off] {sym} ptr x mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		x := v_1
		if !(buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARXQload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SARQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SARQconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (SARQconst [c] (MOVQconst [d]))
	// result: (MOVQconst [d>>uint64(c)])
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(d >> uint64(c))
		return true
	}
	return false
}
func rewriteValue_OpAMD64SARW(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SARW x (MOVQconst [c]))
	// result: (SARWconst [int8(min(int64(c)&31,15))] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SARWconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(min(int64(c)&31, 15)))
		v.AddArg(x)
		return true
	}
	// match: (SARW x (MOVLconst [c]))
	// result: (SARWconst [int8(min(int64(c)&31,15))] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SARWconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(min(int64(c)&31, 15)))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SARWconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SARWconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (SARWconst [c] (MOVQconst [d]))
	// result: (MOVQconst [int64(int16(d))>>uint64(c)])
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(int16(d)) >> uint64(c))
		return true
	}
	return false
}
func rewriteValue_OpAMD64SARXLload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SARXLload [off] {sym} ptr (MOVLconst [c]) mem)
	// result: (SARLconst [int8(c&31)] (MOVLload [off] {sym} ptr mem))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64SARLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SARXQload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SARXQload [off] {sym} ptr (MOVQconst [c]) mem)
	// result: (SARQconst [int8(c&63)] (MOVQload [off] {sym} ptr mem))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64SARQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		v.AddArg(v0)
		return true
	}
	// match: (SARXQload [off] {sym} ptr (MOVLconst [c]) mem)
	// result: (SARQconst [int8(c&63)] (MOVQload [off] {sym} ptr mem))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64SARQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SBBLcarrymask(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SBBLcarrymask (FlagEQ))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SBBLcarrymask (FlagLT_ULT))
	// result: (MOVLconst [-1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(-1)
		return true
	}
	// match: (SBBLcarrymask (FlagLT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SBBLcarrymask (FlagGT_ULT))
	// result: (MOVLconst [-1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(-1)
		return true
	}
	// match: (SBBLcarrymask (FlagGT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SBBQ(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SBBQ x (MOVQconst [c]) borrow)
	// cond: ssa.Is32Bit(c)
	// result: (SBBQconst x [int32(c)] borrow)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		borrow := v_2
		if !(ssa.Is32Bit(c)) {
			break
		}
		v.Reset(ssaop.OpAMD64SBBQconst)
		v.AuxInt = ssa.Int32ToAuxInt(int32(c))
		v.AddArg2(x, borrow)
		return true
	}
	// match: (SBBQ x y (FlagEQ))
	// result: (SUBQborrow x y)
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQborrow)
		v.AddArg2(x, y)
		return true
	}
	// match: (SBBQ x y (InvertFlags f))
	// result: (SBBQ x y (Select1 <types.TypeFlags> (NEGLflags (MOVBQZX <types.Types[types.TUINT32]> (SETA <types.Types[types.TUINT8]> f)))))
	for {
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		f := v_2.Args[0]
		v.Reset(ssaop.OpAMD64SBBQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGLflags, types.NewTuple(typ.UInt32, types.TypeFlags))
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBQZX, types.Types[types.TUINT32])
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64SETA, types.Types[types.TUINT8])
		v3.AddArg(f)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg(v1)
		v.AddArg3(x, y, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SBBQcarrymask(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SBBQcarrymask (FlagEQ))
	// result: (MOVQconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(0)
		return true
	}
	// match: (SBBQcarrymask (FlagLT_ULT))
	// result: (MOVQconst [-1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(-1)
		return true
	}
	// match: (SBBQcarrymask (FlagLT_UGT))
	// result: (MOVQconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(0)
		return true
	}
	// match: (SBBQcarrymask (FlagGT_ULT))
	// result: (MOVQconst [-1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(-1)
		return true
	}
	// match: (SBBQcarrymask (FlagGT_UGT))
	// result: (MOVQconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SBBQconst(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SBBQconst x [c] (FlagEQ))
	// result: (SUBQconstborrow x [c])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		x := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQconstborrow)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (SBBQconst x [c] (InvertFlags f))
	// result: (SBBQconst x [c] (Select1 <types.TypeFlags> (NEGLflags (MOVBQZX <types.Types[types.TUINT32]> (SETA <types.Types[types.TUINT8]> f)))))
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		x := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		f := v_1.Args[0]
		v.Reset(ssaop.OpAMD64SBBQconst)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGLflags, types.NewTuple(typ.UInt32, types.TypeFlags))
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBQZX, types.Types[types.TUINT32])
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64SETA, types.Types[types.TUINT8])
		v3.AddArg(f)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg(v1)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETA(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SETA (InvertFlags x))
	// result: (SETB x)
	for {
		if v_0.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETB)
		v.AddArg(x)
		return true
	}
	// match: (SETA (FlagEQ))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETA (FlagLT_ULT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETA (FlagLT_UGT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETA (FlagGT_ULT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETA (FlagGT_UGT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETAE(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETAE (TESTQ x x))
	// result: (ConstBool [true])
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpConstBool)
		v.AuxInt = ssa.BoolToAuxInt(true)
		return true
	}
	// match: (SETAE (TESTL x x))
	// result: (ConstBool [true])
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpConstBool)
		v.AuxInt = ssa.BoolToAuxInt(true)
		return true
	}
	// match: (SETAE (TESTW x x))
	// result: (ConstBool [true])
	for {
		if v_0.Op != ssaop.OpAMD64TESTW {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpConstBool)
		v.AuxInt = ssa.BoolToAuxInt(true)
		return true
	}
	// match: (SETAE (TESTB x x))
	// result: (ConstBool [true])
	for {
		if v_0.Op != ssaop.OpAMD64TESTB {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpConstBool)
		v.AuxInt = ssa.BoolToAuxInt(true)
		return true
	}
	// match: (SETAE (BTLconst [0] x))
	// result: (XORLconst [1] (ANDLconst <typ.Bool> [1] x))
	for {
		if v_0.Op != ssaop.OpAMD64BTLconst || ssa.AuxIntToInt8(v_0.AuxInt) != 0 {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64XORLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ANDLconst, typ.Bool)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETAE (BTQconst [0] x))
	// result: (XORLconst [1] (ANDLconst <typ.Bool> [1] x))
	for {
		if v_0.Op != ssaop.OpAMD64BTQconst || ssa.AuxIntToInt8(v_0.AuxInt) != 0 {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64XORLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ANDLconst, typ.Bool)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETAE c:(CMPQconst [128] x))
	// cond: c.Uses == 1
	// result: (SETA (CMPQconst [127] x))
	for {
		c := v_0
		if c.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		x := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETA)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETAE c:(CMPLconst [128] x))
	// cond: c.Uses == 1
	// result: (SETA (CMPLconst [127] x))
	for {
		c := v_0
		if c.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		x := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETA)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETAE (InvertFlags x))
	// result: (SETBE x)
	for {
		if v_0.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETBE)
		v.AddArg(x)
		return true
	}
	// match: (SETAE (FlagEQ))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETAE (FlagLT_ULT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETAE (FlagLT_UGT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETAE (FlagGT_ULT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETAE (FlagGT_UGT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETAEstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETAEstore [off] {sym} ptr (InvertFlags x) mem)
	// result: (SETBEstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64SETBEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (SETAEstore [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SETAEstore [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETAEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETAEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SETAEstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SETAEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETAEstore [off] {sym} ptr (FlagEQ) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETAEstore [off] {sym} ptr (FlagLT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETAEstore [off] {sym} ptr (FlagLT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETAEstore [off] {sym} ptr (FlagGT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETAEstore [off] {sym} ptr (FlagGT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETAstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETAstore [off] {sym} ptr (InvertFlags x) mem)
	// result: (SETBstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64SETBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (SETAstore [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SETAstore [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETAstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETAstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SETAstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SETAstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETAstore [off] {sym} ptr (FlagEQ) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETAstore [off] {sym} ptr (FlagLT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETAstore [off] {sym} ptr (FlagLT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETAstore [off] {sym} ptr (FlagGT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETAstore [off] {sym} ptr (FlagGT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETB(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (SETB (TESTQ x x))
	// result: (ConstBool [false])
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpConstBool)
		v.AuxInt = ssa.BoolToAuxInt(false)
		return true
	}
	// match: (SETB (TESTL x x))
	// result: (ConstBool [false])
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpConstBool)
		v.AuxInt = ssa.BoolToAuxInt(false)
		return true
	}
	// match: (SETB (TESTW x x))
	// result: (ConstBool [false])
	for {
		if v_0.Op != ssaop.OpAMD64TESTW {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpConstBool)
		v.AuxInt = ssa.BoolToAuxInt(false)
		return true
	}
	// match: (SETB (TESTB x x))
	// result: (ConstBool [false])
	for {
		if v_0.Op != ssaop.OpAMD64TESTB {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpConstBool)
		v.AuxInt = ssa.BoolToAuxInt(false)
		return true
	}
	// match: (SETB (BTLconst [0] x))
	// result: (ANDLconst [1] x)
	for {
		if v_0.Op != ssaop.OpAMD64BTLconst || ssa.AuxIntToInt8(v_0.AuxInt) != 0 {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg(x)
		return true
	}
	// match: (SETB (BTQconst [0] x))
	// result: (ANDQconst [1] x)
	for {
		if v_0.Op != ssaop.OpAMD64BTQconst || ssa.AuxIntToInt8(v_0.AuxInt) != 0 {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ANDQconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg(x)
		return true
	}
	// match: (SETB c:(CMPQconst [128] x))
	// cond: c.Uses == 1
	// result: (SETBE (CMPQconst [127] x))
	for {
		c := v_0
		if c.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		x := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETBE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETB c:(CMPLconst [128] x))
	// cond: c.Uses == 1
	// result: (SETBE (CMPLconst [127] x))
	for {
		c := v_0
		if c.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		x := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETBE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETB (InvertFlags x))
	// result: (SETA x)
	for {
		if v_0.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETA)
		v.AddArg(x)
		return true
	}
	// match: (SETB (FlagEQ))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETB (FlagLT_ULT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETB (FlagLT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETB (FlagGT_ULT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETB (FlagGT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETBE(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SETBE (InvertFlags x))
	// result: (SETAE x)
	for {
		if v_0.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETAE)
		v.AddArg(x)
		return true
	}
	// match: (SETBE (FlagEQ))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETBE (FlagLT_ULT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETBE (FlagLT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETBE (FlagGT_ULT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETBE (FlagGT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETBEstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETBEstore [off] {sym} ptr (InvertFlags x) mem)
	// result: (SETAEstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64SETAEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (SETBEstore [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SETBEstore [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETBEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETBEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SETBEstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SETBEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETBEstore [off] {sym} ptr (FlagEQ) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETBEstore [off] {sym} ptr (FlagLT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETBEstore [off] {sym} ptr (FlagLT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETBEstore [off] {sym} ptr (FlagGT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETBEstore [off] {sym} ptr (FlagGT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETBstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETBstore [off] {sym} ptr (InvertFlags x) mem)
	// result: (SETAstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64SETAstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (SETBstore [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SETBstore [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETBstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SETBstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SETBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETBstore [off] {sym} ptr (FlagEQ) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETBstore [off] {sym} ptr (FlagLT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETBstore [off] {sym} ptr (FlagLT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETBstore [off] {sym} ptr (FlagGT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETBstore [off] {sym} ptr (FlagGT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETEQ(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (SETEQ (TESTL (SHLL (MOVLconst [1]) x) y))
	// result: (SETAE (BTL x y))
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			if v_0_0.Op != ssaop.OpAMD64SHLL {
				continue
			}
			x := v_0_0.Args[1]
			v_0_0_0 := v_0_0.Args[0]
			if v_0_0_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_0_0_0.AuxInt) != 1 {
				continue
			}
			y := v_0_1
			v.Reset(ssaop.OpAMD64SETAE)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTL, types.TypeFlags)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (TESTQ (SHLQ (MOVQconst [1]) x) y))
	// result: (SETAE (BTQ x y))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			if v_0_0.Op != ssaop.OpAMD64SHLQ {
				continue
			}
			x := v_0_0.Args[1]
			v_0_0_0 := v_0_0.Args[0]
			if v_0_0_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_0_0_0.AuxInt) != 1 {
				continue
			}
			y := v_0_1
			v.Reset(ssaop.OpAMD64SETAE)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQ, types.TypeFlags)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (TESTLconst [c] x))
	// cond: ssa.IsPowerOfTwo(uint32(c))
	// result: (SETAE (BTLconst [int8(ssa.Log32u(uint32(c)))] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(ssa.IsPowerOfTwo(uint32(c))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETAE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (TESTQconst [c] x))
	// cond: ssa.IsPowerOfTwo(uint64(c))
	// result: (SETAE (BTQconst [int8(ssa.Log32u(uint32(c)))] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(ssa.IsPowerOfTwo(uint64(c))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETAE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (TESTQ (MOVQconst [c]) x))
	// cond: ssa.IsPowerOfTwo(uint64(c))
	// result: (SETAE (BTQconst [int8(ssa.Log64u(uint64(c)))] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			if v_0_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_0_0.AuxInt)
			x := v_0_1
			if !(ssa.IsPowerOfTwo(uint64(c))) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log64u(uint64(c))))
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (CMPLconst [1] s:(ANDLconst [1] _)))
	// result: (SETNE (CMPLconst [0] s))
	for {
		if v_0.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(v_0.AuxInt) != 1 {
			break
		}
		s := v_0.Args[0]
		if s.Op != ssaop.OpAMD64ANDLconst || ssa.AuxIntToInt32(s.AuxInt) != 1 {
			break
		}
		v.Reset(ssaop.OpAMD64SETNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(s)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (CMPQconst [1] s:(ANDQconst [1] _)))
	// result: (SETNE (CMPQconst [0] s))
	for {
		if v_0.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(v_0.AuxInt) != 1 {
			break
		}
		s := v_0.Args[0]
		if s.Op != ssaop.OpAMD64ANDQconst || ssa.AuxIntToInt32(s.AuxInt) != 1 {
			break
		}
		v.Reset(ssaop.OpAMD64SETNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(s)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2))
	// cond: z1==z2
	// result: (SETAE (BTQconst [63] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(63)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2))
	// cond: z1==z2
	// result: (SETAE (BTQconst [31] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(31)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2))
	// cond: z1==z2
	// result: (SETAE (BTQconst [0] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(0)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2))
	// cond: z1==z2
	// result: (SETAE (BTLconst [0] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(0)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (TESTQ z1:(SHRQconst [63] x) z2))
	// cond: z1==z2
	// result: (SETAE (BTQconst [63] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			x := z1.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(63)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (TESTL z1:(SHRLconst [31] x) z2))
	// cond: z1==z2
	// result: (SETAE (BTLconst [31] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			x := z1.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(31)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (InvertFlags x))
	// result: (SETEQ x)
	for {
		if v_0.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETEQ)
		v.AddArg(x)
		return true
	}
	// match: (SETEQ (FlagEQ))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETEQ (FlagLT_ULT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETEQ (FlagLT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETEQ (FlagGT_ULT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETEQ (FlagGT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETEQ (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
	// result: (SETEQ (Select1 <types.TypeFlags> blsr))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			s := v_0_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRQ || s != v_0_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64SETEQ)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (TESTL s:(Select0 blsr:(BLSRL _)) s))
	// result: (SETEQ (Select1 <types.TypeFlags> blsr))
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			s := v_0_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRL || s != v_0_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64SETEQ)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETEQ (VPTEST x:(VPAND128 j k) y))
	// cond: x == y && x.Uses == 2
	// result: (SETEQ (VPTEST j k))
	for {
		if v_0.Op != ssaop.OpAMD64VPTEST {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		if x.Op != ssaop.OpAMD64VPAND128 {
			break
		}
		k := x.Args[1]
		j := x.Args[0]
		if !(x == y && x.Uses == 2) {
			break
		}
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
		v0.AddArg2(j, k)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (VPTEST x:(VPAND256 j k) y))
	// cond: x == y && x.Uses == 2
	// result: (SETEQ (VPTEST j k))
	for {
		if v_0.Op != ssaop.OpAMD64VPTEST {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		if x.Op != ssaop.OpAMD64VPAND256 {
			break
		}
		k := x.Args[1]
		j := x.Args[0]
		if !(x == y && x.Uses == 2) {
			break
		}
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
		v0.AddArg2(j, k)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (VPTEST x:(VPANDD512 j k) y))
	// cond: x == y && x.Uses == 2
	// result: (SETEQ (VPTEST j k))
	for {
		if v_0.Op != ssaop.OpAMD64VPTEST {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		if x.Op != ssaop.OpAMD64VPANDD512 {
			break
		}
		k := x.Args[1]
		j := x.Args[0]
		if !(x == y && x.Uses == 2) {
			break
		}
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
		v0.AddArg2(j, k)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (VPTEST x:(VPANDQ512 j k) y))
	// cond: x == y && x.Uses == 2
	// result: (SETEQ (VPTEST j k))
	for {
		if v_0.Op != ssaop.OpAMD64VPTEST {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		if x.Op != ssaop.OpAMD64VPANDQ512 {
			break
		}
		k := x.Args[1]
		j := x.Args[0]
		if !(x == y && x.Uses == 2) {
			break
		}
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
		v0.AddArg2(j, k)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (VPTEST x:(VPANDN128 j k) y))
	// cond: x == y && x.Uses == 2
	// result: (SETB (VPTEST k j))
	for {
		if v_0.Op != ssaop.OpAMD64VPTEST {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		if x.Op != ssaop.OpAMD64VPANDN128 {
			break
		}
		k := x.Args[1]
		j := x.Args[0]
		if !(x == y && x.Uses == 2) {
			break
		}
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
		v0.AddArg2(k, j)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (VPTEST x:(VPANDN256 j k) y))
	// cond: x == y && x.Uses == 2
	// result: (SETB (VPTEST k j))
	for {
		if v_0.Op != ssaop.OpAMD64VPTEST {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		if x.Op != ssaop.OpAMD64VPANDN256 {
			break
		}
		k := x.Args[1]
		j := x.Args[0]
		if !(x == y && x.Uses == 2) {
			break
		}
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
		v0.AddArg2(k, j)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (VPTEST x:(VPANDND512 j k) y))
	// cond: x == y && x.Uses == 2
	// result: (SETB (VPTEST k j))
	for {
		if v_0.Op != ssaop.OpAMD64VPTEST {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		if x.Op != ssaop.OpAMD64VPANDND512 {
			break
		}
		k := x.Args[1]
		j := x.Args[0]
		if !(x == y && x.Uses == 2) {
			break
		}
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
		v0.AddArg2(k, j)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ (VPTEST x:(VPANDNQ512 j k) y))
	// cond: x == y && x.Uses == 2
	// result: (SETB (VPTEST k j))
	for {
		if v_0.Op != ssaop.OpAMD64VPTEST {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		if x.Op != ssaop.OpAMD64VPANDNQ512 {
			break
		}
		k := x.Args[1]
		j := x.Args[0]
		if !(x == y && x.Uses == 2) {
			break
		}
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
		v0.AddArg2(k, j)
		v.AddArg(v0)
		return true
	}
	// match: (SETEQ t:(TESTQ x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (SETNE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETNE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTQ x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETEQ flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETEQ)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTQ x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (SETGE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETGE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTQ x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (SETLE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETLE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTQ x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETG flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETG)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTQ x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETL flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETL)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTQ x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (SETBE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTQ x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (SETAE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTQ x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETB flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTQ x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETA flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETA)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTL x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (SETNE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETNE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTL x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETEQ flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETEQ)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTL x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (SETGE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETGE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTL x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (SETLE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETLE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTL x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETG flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETG)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTL x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETL flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETL)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTL x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (SETBE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTL x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (SETAE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTL x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETB flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTL x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETA flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETA)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTW x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: (SETNE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETNE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTW x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETEQ flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETEQ)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTW x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: (SETGE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETGE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTW x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: (SETLE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETLE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTW x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETG flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETG)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTW x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETL flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETL)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTW x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: (SETBE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTW x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: (SETAE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTW x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETB flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTW x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: (SETA flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETA)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTB s:(SETEQ flags) s))
	// cond: t.Block == s.Block
	// result: (SETNE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETNE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTB s:(SETNE flags) s))
	// cond: t.Block == s.Block
	// result: (SETEQ flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETEQ)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTB s:(SETL flags) s))
	// cond: t.Block == s.Block
	// result: (SETGE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETGE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTB s:(SETG flags) s))
	// cond: t.Block == s.Block
	// result: (SETLE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETLE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTB s:(SETLE flags) s))
	// cond: t.Block == s.Block
	// result: (SETG flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETG)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTB s:(SETGE flags) s))
	// cond: t.Block == s.Block
	// result: (SETL flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETL)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTB s:(SETA flags) s))
	// cond: t.Block == s.Block
	// result: (SETBE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTB s:(SETB flags) s))
	// cond: t.Block == s.Block
	// result: (SETAE flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAE)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTB s:(SETAE flags) s))
	// cond: t.Block == s.Block
	// result: (SETB flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v.AddArg(flags)
			return true
		}
		break
	}
	// match: (SETEQ t:(TESTB s:(SETBE flags) s))
	// cond: t.Block == s.Block
	// result: (SETA flags)
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			flags := s.Args[0]
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETA)
			v.AddArg(flags)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64SETEQstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETEQstore [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem)
	// result: (SETAEstore [off] {sym} ptr (BTL x y) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			if v_1_0.Op != ssaop.OpAMD64SHLL {
				continue
			}
			x := v_1_0.Args[1]
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_1_0_0.AuxInt) != 1 {
				continue
			}
			y := v_1_1
			mem := v_2
			v.Reset(ssaop.OpAMD64SETAEstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTL, types.TypeFlags)
			v0.AddArg2(x, y)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETEQstore [off] {sym} ptr (TESTQ (SHLQ (MOVQconst [1]) x) y) mem)
	// result: (SETAEstore [off] {sym} ptr (BTQ x y) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			if v_1_0.Op != ssaop.OpAMD64SHLQ {
				continue
			}
			x := v_1_0.Args[1]
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_1_0_0.AuxInt) != 1 {
				continue
			}
			y := v_1_1
			mem := v_2
			v.Reset(ssaop.OpAMD64SETAEstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQ, types.TypeFlags)
			v0.AddArg2(x, y)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETEQstore [off] {sym} ptr (TESTLconst [c] x) mem)
	// cond: ssa.IsPowerOfTwo(uint32(c))
	// result: (SETAEstore [off] {sym} ptr (BTLconst [int8(ssa.Log32u(uint32(c)))] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		x := v_1.Args[0]
		mem := v_2
		if !(ssa.IsPowerOfTwo(uint32(c))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETAEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
		v0.AddArg(x)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETEQstore [off] {sym} ptr (TESTQconst [c] x) mem)
	// cond: ssa.IsPowerOfTwo(uint64(c))
	// result: (SETAEstore [off] {sym} ptr (BTQconst [int8(ssa.Log32u(uint32(c)))] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		x := v_1.Args[0]
		mem := v_2
		if !(ssa.IsPowerOfTwo(uint64(c))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETAEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
		v0.AddArg(x)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETEQstore [off] {sym} ptr (TESTQ (MOVQconst [c]) x) mem)
	// cond: ssa.IsPowerOfTwo(uint64(c))
	// result: (SETAEstore [off] {sym} ptr (BTQconst [int8(ssa.Log64u(uint64(c)))] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			if v_1_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1_0.AuxInt)
			x := v_1_1
			mem := v_2
			if !(ssa.IsPowerOfTwo(uint64(c))) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAEstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log64u(uint64(c))))
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETEQstore [off] {sym} ptr (CMPLconst [1] s:(ANDLconst [1] _)) mem)
	// result: (SETNEstore [off] {sym} ptr (CMPLconst [0] s) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(v_1.AuxInt) != 1 {
			break
		}
		s := v_1.Args[0]
		if s.Op != ssaop.OpAMD64ANDLconst || ssa.AuxIntToInt32(s.AuxInt) != 1 {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64SETNEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(s)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETEQstore [off] {sym} ptr (CMPQconst [1] s:(ANDQconst [1] _)) mem)
	// result: (SETNEstore [off] {sym} ptr (CMPQconst [0] s) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(v_1.AuxInt) != 1 {
			break
		}
		s := v_1.Args[0]
		if s.Op != ssaop.OpAMD64ANDQconst || ssa.AuxIntToInt32(s.AuxInt) != 1 {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64SETNEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(s)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETEQstore [off] {sym} ptr (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2) mem)
	// cond: z1==z2
	// result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAEstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(63)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETEQstore [off] {sym} ptr (TESTL z1:(SHLLconst [31] (SHRLconst [31] x)) z2) mem)
	// cond: z1==z2
	// result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAEstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(31)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETEQstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2) mem)
	// cond: z1==z2
	// result: (SETAEstore [off] {sym} ptr (BTQconst [0] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAEstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(0)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETEQstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2) mem)
	// cond: z1==z2
	// result: (SETAEstore [off] {sym} ptr (BTLconst [0] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAEstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(0)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETEQstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] x) z2) mem)
	// cond: z1==z2
	// result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			x := z1.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAEstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(63)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETEQstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] x) z2) mem)
	// cond: z1==z2
	// result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			x := z1.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETAEstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(31)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETEQstore [off] {sym} ptr (InvertFlags x) mem)
	// result: (SETEQstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64SETEQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (SETEQstore [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SETEQstore [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETEQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETEQstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SETEQstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SETEQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETEQstore [off] {sym} ptr (FlagEQ) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETEQstore [off] {sym} ptr (FlagLT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETEQstore [off] {sym} ptr (FlagLT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETEQstore [off] {sym} ptr (FlagGT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETEQstore [off] {sym} ptr (FlagGT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETG(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SETG (InvertFlags x))
	// result: (SETL x)
	for {
		if v_0.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETL)
		v.AddArg(x)
		return true
	}
	// match: (SETG (FlagEQ))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETG (FlagLT_ULT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETG (FlagLT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETG (FlagGT_ULT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETG (FlagGT_UGT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETGE(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (SETGE c:(CMPQconst [128] x))
	// cond: c.Uses == 1
	// result: (SETG (CMPQconst [127] x))
	for {
		c := v_0
		if c.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		x := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETG)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETGE c:(CMPLconst [128] x))
	// cond: c.Uses == 1
	// result: (SETG (CMPLconst [127] x))
	for {
		c := v_0
		if c.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		x := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETG)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETGE (InvertFlags x))
	// result: (SETLE x)
	for {
		if v_0.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETLE)
		v.AddArg(x)
		return true
	}
	// match: (SETGE (FlagEQ))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETGE (FlagLT_ULT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETGE (FlagLT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETGE (FlagGT_ULT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETGE (FlagGT_UGT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETGEstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETGEstore [off] {sym} ptr (InvertFlags x) mem)
	// result: (SETLEstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64SETLEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (SETGEstore [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SETGEstore [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETGEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETGEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SETGEstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SETGEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETGEstore [off] {sym} ptr (FlagEQ) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETGEstore [off] {sym} ptr (FlagLT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETGEstore [off] {sym} ptr (FlagLT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETGEstore [off] {sym} ptr (FlagGT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETGEstore [off] {sym} ptr (FlagGT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETGstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETGstore [off] {sym} ptr (InvertFlags x) mem)
	// result: (SETLstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64SETLstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (SETGstore [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SETGstore [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETGstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETGstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SETGstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SETGstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETGstore [off] {sym} ptr (FlagEQ) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETGstore [off] {sym} ptr (FlagLT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETGstore [off] {sym} ptr (FlagLT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETGstore [off] {sym} ptr (FlagGT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETGstore [off] {sym} ptr (FlagGT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETL(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (SETL c:(CMPQconst [128] x))
	// cond: c.Uses == 1
	// result: (SETLE (CMPQconst [127] x))
	for {
		c := v_0
		if c.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		x := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETLE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETL c:(CMPLconst [128] x))
	// cond: c.Uses == 1
	// result: (SETLE (CMPLconst [127] x))
	for {
		c := v_0
		if c.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(c.AuxInt) != 128 {
			break
		}
		x := c.Args[0]
		if !(c.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64SETLE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(127)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETL (InvertFlags x))
	// result: (SETG x)
	for {
		if v_0.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETG)
		v.AddArg(x)
		return true
	}
	// match: (SETL (FlagEQ))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETL (FlagLT_ULT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETL (FlagLT_UGT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETL (FlagGT_ULT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETL (FlagGT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETLE(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SETLE (InvertFlags x))
	// result: (SETGE x)
	for {
		if v_0.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETGE)
		v.AddArg(x)
		return true
	}
	// match: (SETLE (FlagEQ))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETLE (FlagLT_ULT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETLE (FlagLT_UGT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETLE (FlagGT_ULT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETLE (FlagGT_UGT))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETLEstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETLEstore [off] {sym} ptr (InvertFlags x) mem)
	// result: (SETGEstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64SETGEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (SETLEstore [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SETLEstore [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETLEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETLEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SETLEstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SETLEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETLEstore [off] {sym} ptr (FlagEQ) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETLEstore [off] {sym} ptr (FlagLT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETLEstore [off] {sym} ptr (FlagLT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETLEstore [off] {sym} ptr (FlagGT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETLEstore [off] {sym} ptr (FlagGT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETLstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETLstore [off] {sym} ptr (InvertFlags x) mem)
	// result: (SETGstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64SETGstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (SETLstore [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SETLstore [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETLstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETLstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SETLstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SETLstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETLstore [off] {sym} ptr (FlagEQ) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETLstore [off] {sym} ptr (FlagLT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETLstore [off] {sym} ptr (FlagLT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETLstore [off] {sym} ptr (FlagGT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETLstore [off] {sym} ptr (FlagGT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SETNE(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (SETNE (TESTBconst [1] x))
	// result: (ANDLconst [1] x)
	for {
		if v_0.Op != ssaop.OpAMD64TESTBconst || ssa.AuxIntToInt8(v_0.AuxInt) != 1 {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg(x)
		return true
	}
	// match: (SETNE (TESTWconst [1] x))
	// result: (ANDLconst [1] x)
	for {
		if v_0.Op != ssaop.OpAMD64TESTWconst || ssa.AuxIntToInt16(v_0.AuxInt) != 1 {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg(x)
		return true
	}
	// match: (SETNE (TESTL (SHLL (MOVLconst [1]) x) y))
	// result: (SETB (BTL x y))
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			if v_0_0.Op != ssaop.OpAMD64SHLL {
				continue
			}
			x := v_0_0.Args[1]
			v_0_0_0 := v_0_0.Args[0]
			if v_0_0_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_0_0_0.AuxInt) != 1 {
				continue
			}
			y := v_0_1
			v.Reset(ssaop.OpAMD64SETB)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTL, types.TypeFlags)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE (TESTQ (SHLQ (MOVQconst [1]) x) y))
	// result: (SETB (BTQ x y))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			if v_0_0.Op != ssaop.OpAMD64SHLQ {
				continue
			}
			x := v_0_0.Args[1]
			v_0_0_0 := v_0_0.Args[0]
			if v_0_0_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_0_0_0.AuxInt) != 1 {
				continue
			}
			y := v_0_1
			v.Reset(ssaop.OpAMD64SETB)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQ, types.TypeFlags)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE (TESTLconst [c] x))
	// cond: ssa.IsPowerOfTwo(uint32(c))
	// result: (SETB (BTLconst [int8(ssa.Log32u(uint32(c)))] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(ssa.IsPowerOfTwo(uint32(c))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETNE (TESTQconst [c] x))
	// cond: ssa.IsPowerOfTwo(uint64(c))
	// result: (SETB (BTQconst [int8(ssa.Log32u(uint32(c)))] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(ssa.IsPowerOfTwo(uint64(c))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SETNE (TESTQ (MOVQconst [c]) x))
	// cond: ssa.IsPowerOfTwo(uint64(c))
	// result: (SETB (BTQconst [int8(ssa.Log64u(uint64(c)))] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			if v_0_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_0_0.AuxInt)
			x := v_0_1
			if !(ssa.IsPowerOfTwo(uint64(c))) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log64u(uint64(c))))
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE (CMPLconst [1] s:(ANDLconst [1] _)))
	// result: (SETEQ (CMPLconst [0] s))
	for {
		if v_0.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(v_0.AuxInt) != 1 {
			break
		}
		s := v_0.Args[0]
		if s.Op != ssaop.OpAMD64ANDLconst || ssa.AuxIntToInt32(s.AuxInt) != 1 {
			break
		}
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(s)
		v.AddArg(v0)
		return true
	}
	// match: (SETNE (CMPQconst [1] s:(ANDQconst [1] _)))
	// result: (SETEQ (CMPQconst [0] s))
	for {
		if v_0.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(v_0.AuxInt) != 1 {
			break
		}
		s := v_0.Args[0]
		if s.Op != ssaop.OpAMD64ANDQconst || ssa.AuxIntToInt32(s.AuxInt) != 1 {
			break
		}
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(s)
		v.AddArg(v0)
		return true
	}
	// match: (SETNE (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2))
	// cond: z1==z2
	// result: (SETB (BTQconst [63] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(63)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2))
	// cond: z1==z2
	// result: (SETB (BTQconst [31] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(31)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2))
	// cond: z1==z2
	// result: (SETB (BTQconst [0] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(0)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2))
	// cond: z1==z2
	// result: (SETB (BTLconst [0] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(0)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE (TESTQ z1:(SHRQconst [63] x) z2))
	// cond: z1==z2
	// result: (SETB (BTQconst [63] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			x := z1.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(63)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE (TESTL z1:(SHRLconst [31] x) z2))
	// cond: z1==z2
	// result: (SETB (BTLconst [31] x))
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			z1 := v_0_0
			if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			x := z1.Args[0]
			z2 := v_0_1
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETB)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(31)
			v0.AddArg(x)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE (InvertFlags x))
	// result: (SETNE x)
	for {
		if v_0.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETNE)
		v.AddArg(x)
		return true
	}
	// match: (SETNE (FlagEQ))
	// result: (MOVLconst [0])
	for {
		if v_0.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SETNE (FlagLT_ULT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETNE (FlagLT_UGT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETNE (FlagGT_ULT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETNE (FlagGT_UGT))
	// result: (MOVLconst [1])
	for {
		if v_0.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		return true
	}
	// match: (SETNE (TESTQ s:(Select0 blsr:(BLSRQ _)) s))
	// result: (SETNE (Select1 <types.TypeFlags> blsr))
	for {
		if v_0.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			s := v_0_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRQ || s != v_0_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64SETNE)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE (TESTL s:(Select0 blsr:(BLSRL _)) s))
	// result: (SETNE (Select1 <types.TypeFlags> blsr))
	for {
		if v_0.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_0.Args[1]
		v_0_0 := v_0.Args[0]
		v_0_1 := v_0.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
			s := v_0_0
			if s.Op != ssaop.OpSelect0 {
				continue
			}
			blsr := s.Args[0]
			if blsr.Op != ssaop.OpAMD64BLSRL || s != v_0_1 {
				continue
			}
			v.Reset(ssaop.OpAMD64SETNE)
			v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
			v0.AddArg(blsr)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTQ x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTL x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETEQ flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETNE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETL flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETG flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETLE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETGE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETA flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETB flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETAE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETBE flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETEQF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETNEF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETGF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTW x:(MOVBQZX s:(SETGEF flags)) x))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTW {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			x := t_0
			if x.Op != ssaop.OpAMD64MOVBQZX {
				continue
			}
			s := x.Args[0]
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			if x != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETEQ flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQ {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETNE flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNE {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETL flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETL {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETG flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETG {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETLE flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETLE {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETGE flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGE {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETA flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETA {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETB flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETB {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETAE flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETAE {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETBE flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETBE {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETEQF flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETEQF {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETNEF flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETNEF {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETGF flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGF {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	// match: (SETNE t:(TESTB s:(SETGEF flags) s))
	// cond: t.Block == s.Block
	// result: s
	for {
		t := v_0
		if t.Op != ssaop.OpAMD64TESTB {
			break
		}
		_ = t.Args[1]
		t_0 := t.Args[0]
		t_1 := t.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
			s := t_0
			if s.Op != ssaop.OpAMD64SETGEF {
				continue
			}
			if s != t_1 || !(t.Block == s.Block) {
				continue
			}
			v.CopyOf(s)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64SETNEstore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SETNEstore [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem)
	// result: (SETBstore [off] {sym} ptr (BTL x y) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			if v_1_0.Op != ssaop.OpAMD64SHLL {
				continue
			}
			x := v_1_0.Args[1]
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_1_0_0.AuxInt) != 1 {
				continue
			}
			y := v_1_1
			mem := v_2
			v.Reset(ssaop.OpAMD64SETBstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTL, types.TypeFlags)
			v0.AddArg2(x, y)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETNEstore [off] {sym} ptr (TESTQ (SHLQ (MOVQconst [1]) x) y) mem)
	// result: (SETBstore [off] {sym} ptr (BTQ x y) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			if v_1_0.Op != ssaop.OpAMD64SHLQ {
				continue
			}
			x := v_1_0.Args[1]
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_1_0_0.AuxInt) != 1 {
				continue
			}
			y := v_1_1
			mem := v_2
			v.Reset(ssaop.OpAMD64SETBstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQ, types.TypeFlags)
			v0.AddArg2(x, y)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETNEstore [off] {sym} ptr (TESTLconst [c] x) mem)
	// cond: ssa.IsPowerOfTwo(uint32(c))
	// result: (SETBstore [off] {sym} ptr (BTLconst [int8(ssa.Log32u(uint32(c)))] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		x := v_1.Args[0]
		mem := v_2
		if !(ssa.IsPowerOfTwo(uint32(c))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
		v0.AddArg(x)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETNEstore [off] {sym} ptr (TESTQconst [c] x) mem)
	// cond: ssa.IsPowerOfTwo(uint64(c))
	// result: (SETBstore [off] {sym} ptr (BTQconst [int8(ssa.Log32u(uint32(c)))] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		x := v_1.Args[0]
		mem := v_2
		if !(ssa.IsPowerOfTwo(uint64(c))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
		v0.AddArg(x)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETNEstore [off] {sym} ptr (TESTQ (MOVQconst [c]) x) mem)
	// cond: ssa.IsPowerOfTwo(uint64(c))
	// result: (SETBstore [off] {sym} ptr (BTQconst [int8(ssa.Log64u(uint64(c)))] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			if v_1_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1_0.AuxInt)
			x := v_1_1
			mem := v_2
			if !(ssa.IsPowerOfTwo(uint64(c))) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log64u(uint64(c))))
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETNEstore [off] {sym} ptr (CMPLconst [1] s:(ANDLconst [1] _)) mem)
	// result: (SETEQstore [off] {sym} ptr (CMPLconst [0] s) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64CMPLconst || ssa.AuxIntToInt32(v_1.AuxInt) != 1 {
			break
		}
		s := v_1.Args[0]
		if s.Op != ssaop.OpAMD64ANDLconst || ssa.AuxIntToInt32(s.AuxInt) != 1 {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64SETEQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(s)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETNEstore [off] {sym} ptr (CMPQconst [1] s:(ANDQconst [1] _)) mem)
	// result: (SETEQstore [off] {sym} ptr (CMPQconst [0] s) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64CMPQconst || ssa.AuxIntToInt32(v_1.AuxInt) != 1 {
			break
		}
		s := v_1.Args[0]
		if s.Op != ssaop.OpAMD64ANDQconst || ssa.AuxIntToInt32(s.AuxInt) != 1 {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64SETEQstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(s)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETNEstore [off] {sym} ptr (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2) mem)
	// cond: z1==z2
	// result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(63)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETNEstore [off] {sym} ptr (TESTL z1:(SHLLconst [31] (SHRLconst [31] x)) z2) mem)
	// cond: z1==z2
	// result: (SETBstore [off] {sym} ptr (BTLconst [31] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(31)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETNEstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2) mem)
	// cond: z1==z2
	// result: (SETBstore [off] {sym} ptr (BTQconst [0] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(0)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETNEstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2) mem)
	// cond: z1==z2
	// result: (SETBstore [off] {sym} ptr (BTLconst [0] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			z1_0 := z1.Args[0]
			if z1_0.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
				continue
			}
			x := z1_0.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(0)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETNEstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] x) z2) mem)
	// cond: z1==z2
	// result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTQ {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
				continue
			}
			x := z1.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(63)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETNEstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] x) z2) mem)
	// cond: z1==z2
	// result: (SETBstore [off] {sym} ptr (BTLconst [31] x) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64TESTL {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			z1 := v_1_0
			if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
				continue
			}
			x := z1.Args[0]
			z2 := v_1_1
			mem := v_2
			if !(z1 == z2) {
				continue
			}
			v.Reset(ssaop.OpAMD64SETBstore)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(31)
			v0.AddArg(x)
			v.AddArg3(ptr, v0, mem)
			return true
		}
		break
	}
	// match: (SETNEstore [off] {sym} ptr (InvertFlags x) mem)
	// result: (SETNEstore [off] {sym} ptr x mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64InvertFlags {
			break
		}
		x := v_1.Args[0]
		mem := v_2
		v.Reset(ssaop.OpAMD64SETNEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	// match: (SETNEstore [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SETNEstore [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SETNEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETNEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SETNEstore [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SETNEstore)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SETNEstore [off] {sym} ptr (FlagEQ) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [0]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagEQ {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETNEstore [off] {sym} ptr (FlagLT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETNEstore [off] {sym} ptr (FlagLT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagLT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETNEstore [off] {sym} ptr (FlagGT_ULT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_ULT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	// match: (SETNEstore [off] {sym} ptr (FlagGT_UGT) mem)
	// result: (MOVBstore [off] {sym} ptr (MOVLconst <typ.UInt8> [1]) mem)
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64FlagGT_UGT {
			break
		}
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLconst, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHLL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (SHLL x (MOVQconst [c]))
	// result: (SHLLconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SHLLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (SHLL x (MOVLconst [c]))
	// result: (SHLLconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SHLLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (SHLL x (ADDQconst [c] y))
	// cond: c & 31 == 0
	// result: (SHLL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHLL x (NEGQ <t> (ADDQconst [c] y)))
	// cond: c & 31 == 0
	// result: (SHLL x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHLL x (ANDQconst [c] y))
	// cond: c & 31 == 31
	// result: (SHLL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHLL x (NEGQ <t> (ANDQconst [c] y)))
	// cond: c & 31 == 31
	// result: (SHLL x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHLL x (ADDLconst [c] y))
	// cond: c & 31 == 0
	// result: (SHLL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHLL x (NEGL <t> (ADDLconst [c] y)))
	// cond: c & 31 == 0
	// result: (SHLL x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHLL x (ANDLconst [c] y))
	// cond: c & 31 == 31
	// result: (SHLL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHLL x (NEGL <t> (ANDLconst [c] y)))
	// cond: c & 31 == 31
	// result: (SHLL x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHLL l:(MOVLload [off] {sym} ptr mem) x)
	// cond: buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (SHLXLload [off] {sym} ptr x mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		x := v_1
		if !(buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLXLload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHLLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SHLLconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (SHLLconst [1] x)
	// result: (ADDL x x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 1 {
			break
		}
		x := v_0
		v.Reset(ssaop.OpAMD64ADDL)
		v.AddArg2(x, x)
		return true
	}
	// match: (SHLLconst [c] (ADDL x x))
	// cond: c < 31
	// result: (SHLLconst [c+1] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDL {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] || !(c < 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLLconst)
		v.AuxInt = ssa.Int8ToAuxInt(c + 1)
		v.AddArg(x)
		return true
	}
	// match: (SHLLconst [d] (MOVLconst [c]))
	// result: (MOVLconst [c << uint64(d)])
	for {
		d := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c << uint64(d))
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHLQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (SHLQ x (MOVQconst [c]))
	// result: (SHLQconst [int8(c&63)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SHLQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v.AddArg(x)
		return true
	}
	// match: (SHLQ x (MOVLconst [c]))
	// result: (SHLQconst [int8(c&63)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SHLQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v.AddArg(x)
		return true
	}
	// match: (SHLQ x (ADDQconst [c] y))
	// cond: c & 63 == 0
	// result: (SHLQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHLQ x (NEGQ <t> (ADDQconst [c] y)))
	// cond: c & 63 == 0
	// result: (SHLQ x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHLQ x (ANDQconst [c] y))
	// cond: c & 63 == 63
	// result: (SHLQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHLQ x (NEGQ <t> (ANDQconst [c] y)))
	// cond: c & 63 == 63
	// result: (SHLQ x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHLQ x (ADDLconst [c] y))
	// cond: c & 63 == 0
	// result: (SHLQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHLQ x (NEGL <t> (ADDLconst [c] y)))
	// cond: c & 63 == 0
	// result: (SHLQ x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHLQ x (ANDLconst [c] y))
	// cond: c & 63 == 63
	// result: (SHLQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHLQ x (NEGL <t> (ANDLconst [c] y)))
	// cond: c & 63 == 63
	// result: (SHLQ x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHLQ l:(MOVQload [off] {sym} ptr mem) x)
	// cond: buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (SHLXQload [off] {sym} ptr x mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		x := v_1
		if !(buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLXQload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHLQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SHLQconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (SHLQconst [1] x)
	// result: (ADDQ x x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 1 {
			break
		}
		x := v_0
		v.Reset(ssaop.OpAMD64ADDQ)
		v.AddArg2(x, x)
		return true
	}
	// match: (SHLQconst [c] (ADDQ x x))
	// cond: c < 63
	// result: (SHLQconst [c+1] x)
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64ADDQ {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] || !(c < 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQconst)
		v.AuxInt = ssa.Int8ToAuxInt(c + 1)
		v.AddArg(x)
		return true
	}
	// match: (SHLQconst [d] (MOVQconst [c]))
	// result: (MOVQconst [c << uint64(d)])
	for {
		d := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(c << uint64(d))
		return true
	}
	// match: (SHLQconst [d] (MOVLconst [c]))
	// result: (MOVQconst [int64(c) << uint64(d)])
	for {
		d := ssa.AuxIntToInt8(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(c) << uint64(d))
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHLXLload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SHLXLload [off] {sym} ptr (MOVLconst [c]) mem)
	// result: (SHLLconst [int8(c&31)] (MOVLload [off] {sym} ptr mem))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64SHLLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHLXQload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SHLXQload [off] {sym} ptr (MOVQconst [c]) mem)
	// result: (SHLQconst [int8(c&63)] (MOVQload [off] {sym} ptr mem))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64SHLQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		v.AddArg(v0)
		return true
	}
	// match: (SHLXQload [off] {sym} ptr (MOVLconst [c]) mem)
	// result: (SHLQconst [int8(c&63)] (MOVQload [off] {sym} ptr mem))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64SHLQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHRB(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SHRB x (MOVQconst [c]))
	// cond: c&31 < 8
	// result: (SHRBconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(c&31 < 8) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRBconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (SHRB x (MOVLconst [c]))
	// cond: c&31 < 8
	// result: (SHRBconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		if !(c&31 < 8) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRBconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (SHRB _ (MOVQconst [c]))
	// cond: c&31 >= 8
	// result: (MOVLconst [0])
	for {
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(c&31 >= 8) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SHRB _ (MOVLconst [c]))
	// cond: c&31 >= 8
	// result: (MOVLconst [0])
	for {
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		if !(c&31 >= 8) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHRBconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SHRBconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHRL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (SHRL x (MOVQconst [c]))
	// result: (SHRLconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SHRLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (SHRL x (MOVLconst [c]))
	// result: (SHRLconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SHRLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (SHRL x (ADDQconst [c] y))
	// cond: c & 31 == 0
	// result: (SHRL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHRL x (NEGQ <t> (ADDQconst [c] y)))
	// cond: c & 31 == 0
	// result: (SHRL x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHRL x (ANDQconst [c] y))
	// cond: c & 31 == 31
	// result: (SHRL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHRL x (NEGQ <t> (ANDQconst [c] y)))
	// cond: c & 31 == 31
	// result: (SHRL x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHRL x (ADDLconst [c] y))
	// cond: c & 31 == 0
	// result: (SHRL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHRL x (NEGL <t> (ADDLconst [c] y)))
	// cond: c & 31 == 0
	// result: (SHRL x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHRL x (ANDLconst [c] y))
	// cond: c & 31 == 31
	// result: (SHRL x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHRL x (NEGL <t> (ANDLconst [c] y)))
	// cond: c & 31 == 31
	// result: (SHRL x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&31 == 31) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHRL l:(MOVLload [off] {sym} ptr mem) x)
	// cond: buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (SHRXLload [off] {sym} ptr x mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		x := v_1
		if !(buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRXLload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHRLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SHRLconst [1] (ADDL x x))
	// result: (ANDLconst [0x7fffffff] x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64ADDL {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0x7fffffff)
		v.AddArg(x)
		return true
	}
	// match: (SHRLconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHRQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (SHRQ x (MOVQconst [c]))
	// result: (SHRQconst [int8(c&63)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SHRQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v.AddArg(x)
		return true
	}
	// match: (SHRQ x (MOVLconst [c]))
	// result: (SHRQconst [int8(c&63)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SHRQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v.AddArg(x)
		return true
	}
	// match: (SHRQ x (ADDQconst [c] y))
	// cond: c & 63 == 0
	// result: (SHRQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHRQ x (NEGQ <t> (ADDQconst [c] y)))
	// cond: c & 63 == 0
	// result: (SHRQ x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHRQ x (ANDQconst [c] y))
	// cond: c & 63 == 63
	// result: (SHRQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHRQ x (NEGQ <t> (ANDQconst [c] y)))
	// cond: c & 63 == 63
	// result: (SHRQ x (NEGQ <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGQ {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDQconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHRQ x (ADDLconst [c] y))
	// cond: c & 63 == 0
	// result: (SHRQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHRQ x (NEGL <t> (ADDLconst [c] y)))
	// cond: c & 63 == 0
	// result: (SHRQ x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ADDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHRQ x (ANDLconst [c] y))
	// cond: c & 63 == 63
	// result: (SHRQ x y)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		y := v_1.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (SHRQ x (NEGL <t> (ANDLconst [c] y)))
	// cond: c & 63 == 63
	// result: (SHRQ x (NEGL <t> y))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64NEGL {
			break
		}
		t := v_1.Type
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64ANDLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1_0.AuxInt)
		y := v_1_0.Args[0]
		if !(c&63 == 63) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGL, t)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	// match: (SHRQ l:(MOVQload [off] {sym} ptr mem) x)
	// cond: buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (SHRXQload [off] {sym} ptr x mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		x := v_1
		if !(buildcfg.GOAMD64 >= 3 && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRXQload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, x, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHRQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SHRQconst [1] (ADDQ x x))
	// result: (BTRQconst [63] x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64ADDQ {
			break
		}
		x := v_0.Args[1]
		if x != v_0.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64BTRQconst)
		v.AuxInt = ssa.Int8ToAuxInt(63)
		v.AddArg(x)
		return true
	}
	// match: (SHRQconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHRW(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SHRW x (MOVQconst [c]))
	// cond: c&31 < 16
	// result: (SHRWconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(c&31 < 16) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRWconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (SHRW x (MOVLconst [c]))
	// cond: c&31 < 16
	// result: (SHRWconst [int8(c&31)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		if !(c&31 < 16) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRWconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v.AddArg(x)
		return true
	}
	// match: (SHRW _ (MOVQconst [c]))
	// cond: c&31 >= 16
	// result: (MOVLconst [0])
	for {
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(c&31 >= 16) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SHRW _ (MOVLconst [c]))
	// cond: c&31 >= 16
	// result: (MOVLconst [0])
	for {
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		if !(c&31 >= 16) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHRWconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SHRWconst x [0])
	// result: x
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHRXLload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SHRXLload [off] {sym} ptr (MOVLconst [c]) mem)
	// result: (SHRLconst [int8(c&31)] (MOVLload [off] {sym} ptr mem))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64SHRLconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 31))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SHRXQload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SHRXQload [off] {sym} ptr (MOVQconst [c]) mem)
	// result: (SHRQconst [int8(c&63)] (MOVQload [off] {sym} ptr mem))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64SHRQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		v.AddArg(v0)
		return true
	}
	// match: (SHRXQload [off] {sym} ptr (MOVLconst [c]) mem)
	// result: (SHRQconst [int8(c&63)] (MOVQload [off] {sym} ptr mem))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		ptr := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		mem := v_2
		v.Reset(ssaop.OpAMD64SHRQconst)
		v.AuxInt = ssa.Int8ToAuxInt(int8(c & 63))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SUBL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (SUBL x (MOVLconst [c]))
	// result: (SUBLconst x [c])
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64SUBLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (SUBL (MOVLconst [c]) x)
	// result: (NEGL (SUBLconst <v.Type> x [c]))
	for {
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		c := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_1
		v.Reset(ssaop.OpAMD64NEGL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SUBLconst, v.Type)
		v0.AuxInt = ssa.Int32ToAuxInt(c)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SUBL x x)
	// result: (MOVLconst [0])
	for {
		x := v_0
		if x != v_1 {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SUBL x l:(MOVLload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (SUBLload x [off] {sym} ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBLload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SUBLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SUBLconst [0] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (SUBLconst [c] x)
	// result: (ADDLconst [-c] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64ADDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(-c)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpAMD64SUBLload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SUBLload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SUBLload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (SUBLload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SUBLload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (SUBLload x [off] {sym} ptr (MOVSSstore [off] {sym} ptr y _))
	// result: (SUBL x (MOVLf2i y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVSSstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64SUBL)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVLf2i, typ.UInt32)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SUBLmodify(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SUBLmodify [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SUBLmodify [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SUBLmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SUBLmodify [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SUBQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SUBQ x (MOVBQZX (SETB flags)))
	// result: (Select0 (SBBQconst [0] x flags))
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVBQZX {
			break
		}
		v_1_0 := v_1.Args[0]
		if v_1_0.Op != ssaop.OpAMD64SETB {
			break
		}
		flags := v_1_0.Args[0]
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQconst, types.NewTuple(typ.UInt64, types.TypeFlags))
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg2(x, flags)
		v.AddArg(v0)
		return true
	}
	// match: (SUBQ x (MOVQconst [c]))
	// cond: ssa.Is32Bit(c)
	// result: (SUBQconst x [int32(c)])
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(ssa.Is32Bit(c)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQconst)
		v.AuxInt = ssa.Int32ToAuxInt(int32(c))
		v.AddArg(x)
		return true
	}
	// match: (SUBQ (MOVQconst [c]) x)
	// cond: ssa.Is32Bit(c)
	// result: (NEGQ (SUBQconst <v.Type> x [int32(c)]))
	for {
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_0.AuxInt)
		x := v_1
		if !(ssa.Is32Bit(c)) {
			break
		}
		v.Reset(ssaop.OpAMD64NEGQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SUBQconst, v.Type)
		v0.AuxInt = ssa.Int32ToAuxInt(int32(c))
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	// match: (SUBQ x x)
	// result: (MOVLconst [0])
	for {
		x := v_0
		if x != v_1 {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (SUBQ x l:(MOVQload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (SUBQload x [off] {sym} ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SUBQborrow(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SUBQborrow x (MOVQconst [c]))
	// cond: ssa.Is32Bit(c)
	// result: (SUBQconstborrow x [int32(c)])
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		if !(ssa.Is32Bit(c)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQconstborrow)
		v.AuxInt = ssa.Int32ToAuxInt(int32(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SUBQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (SUBQconst [0] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (SUBQconst [c] x)
	// cond: c != -(1<<31)
	// result: (ADDQconst [-c] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		x := v_0
		if !(c != -(1 << 31)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconst)
		v.AuxInt = ssa.Int32ToAuxInt(-c)
		v.AddArg(x)
		return true
	}
	// match: (SUBQconst (MOVQconst [d]) [c])
	// result: (MOVQconst [d-int64(c)])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(d - int64(c))
		return true
	}
	// match: (SUBQconst (SUBQconst x [d]) [c])
	// cond: ssa.Is32Bit(int64(-c)-int64(d))
	// result: (ADDQconst [-c-d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64SUBQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		if !(ssa.Is32Bit(int64(-c) - int64(d))) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconst)
		v.AuxInt = ssa.Int32ToAuxInt(-c - d)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SUBQload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SUBQload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SUBQload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (SUBQload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SUBQload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (SUBQload x [off] {sym} ptr (MOVSDstore [off] {sym} ptr y _))
	// result: (SUBQ x (MOVQf2i y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVSDstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQ)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVQf2i, typ.UInt64)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SUBQmodify(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SUBQmodify [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SUBQmodify [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (SUBQmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SUBQmodify [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SUBSD(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SUBSD x l:(MOVSDload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (SUBSDload x [off] {sym} ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64MOVSDload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	// match: (SUBSD (MULSD x y) z)
	// cond: buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)
	// result: (VFMSUB231SD z x y)
	for {
		if v_0.Op != ssaop.OpAMD64MULSD {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		z := v_1
		if !(buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUB231SD)
		v.AddArg3(z, x, y)
		return true
	}
	// match: (SUBSD x (MULSD y z))
	// cond: buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)
	// result: (VFNMADD231SD x y z)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MULSD {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			y := v_1_0
			z := v_1_1
			if !(buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VFNMADD231SD)
			v.AddArg3(x, y, z)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64SUBSDload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SUBSDload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SUBSDload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (SUBSDload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SUBSDload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBSDload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (SUBSDload x [off] {sym} ptr (MOVQstore [off] {sym} ptr y _))
	// result: (SUBSD x (MOVQi2f y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVQstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64SUBSD)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVQi2f, typ.Float64)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64SUBSS(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SUBSS x l:(MOVSSload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (SUBSSload x [off] {sym} ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64MOVSSload {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	// match: (SUBSS (MULSS x y) z)
	// cond: buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)
	// result: (VFMSUB231SS z x y)
	for {
		if v_0.Op != ssaop.OpAMD64MULSS {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		z := v_1
		if !(buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUB231SS)
		v.AddArg3(z, x, y)
		return true
	}
	// match: (SUBSS x (MULSS y z))
	// cond: buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)
	// result: (VFNMADD231SS x y z)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MULSS {
			break
		}
		_ = v_1.Args[1]
		v_1_0 := v_1.Args[0]
		v_1_1 := v_1.Args[1]
		for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 {
			y := v_1_0
			z := v_1_1
			if !(buildcfg.GOAMD64 >= 3 && z.Block.Func.UseFMA(v)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VFNMADD231SS)
			v.AddArg3(x, y, z)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64SUBSSload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SUBSSload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (SUBSSload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (SUBSSload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (SUBSSload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64SUBSSload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (SUBSSload x [off] {sym} ptr (MOVLstore [off] {sym} ptr y _))
	// result: (SUBSS x (MOVLi2f y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVLstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64SUBSS)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVLi2f, typ.Float32)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64TESTB(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (TESTB (MOVLconst [c]) x)
	// result: (TESTBconst [int8(c)] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_1
			v.Reset(ssaop.OpAMD64TESTBconst)
			v.AuxInt = ssa.Int8ToAuxInt(int8(c))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (TESTB l:(MOVBload {sym} [off] ptr mem) l2)
	// cond: l == l2 && l.Uses == 2 && ssa.Clobber(l)
	// result: @l.Block (CMPBconstload {sym} [ssa.MakeValAndOff(0, off)] ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			l := v_0
			if l.Op != ssaop.OpAMD64MOVBload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			l2 := v_1
			if !(l == l2 && l.Uses == 2 && ssa.Clobber(l)) {
				continue
			}
			b = l.Block
			v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPBconstload, types.TypeFlags)
			v.CopyOf(v0)
			v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, off))
			v0.Aux = ssa.SymToAux(sym)
			v0.AddArg2(ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64TESTBconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TESTBconst [-1] x)
	// cond: x.Op != ssaop.OpAMD64MOVLconst
	// result: (TESTB x x)
	for {
		if ssa.AuxIntToInt8(v.AuxInt) != -1 {
			break
		}
		x := v_0
		if !(x.Op != ssaop.OpAMD64MOVLconst) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTB)
		v.AddArg2(x, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64TESTL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (TESTL (MOVLconst [c]) x)
	// result: (TESTLconst [c] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_1
			v.Reset(ssaop.OpAMD64TESTLconst)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (TESTL l:(MOVLload {sym} [off] ptr mem) l2)
	// cond: l == l2 && l.Uses == 2 && ssa.Clobber(l)
	// result: @l.Block (CMPLconstload {sym} [ssa.MakeValAndOff(0, off)] ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			l := v_0
			if l.Op != ssaop.OpAMD64MOVLload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			l2 := v_1
			if !(l == l2 && l.Uses == 2 && ssa.Clobber(l)) {
				continue
			}
			b = l.Block
			v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPLconstload, types.TypeFlags)
			v.CopyOf(v0)
			v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, off))
			v0.Aux = ssa.SymToAux(sym)
			v0.AddArg2(ptr, mem)
			return true
		}
		break
	}
	// match: (TESTL a:(ANDLload [off] {sym} x ptr mem) a)
	// cond: a.Uses == 2 && a.Block == v.Block && ssa.Clobber(a)
	// result: (TESTL (MOVLload <a.Type> [off] {sym} ptr mem) x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			a := v_0
			if a.Op != ssaop.OpAMD64ANDLload {
				continue
			}
			off := ssa.AuxIntToInt32(a.AuxInt)
			sym := ssa.AuxToSym(a.Aux)
			mem := a.Args[2]
			x := a.Args[0]
			ptr := a.Args[1]
			if a != v_1 || !(a.Uses == 2 && a.Block == v.Block && ssa.Clobber(a)) {
				continue
			}
			v.Reset(ssaop.OpAMD64TESTL)
			v0 := b.NewValue0(a.Pos, ssaop.OpAMD64MOVLload, a.Type)
			v0.AuxInt = ssa.Int32ToAuxInt(off)
			v0.Aux = ssa.SymToAux(sym)
			v0.AddArg2(ptr, mem)
			v.AddArg2(v0, x)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64TESTLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TESTLconst [c] (MOVLconst [c]))
	// cond: c == 0
	// result: (FlagEQ)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_0.AuxInt) != c || !(c == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagEQ)
		return true
	}
	// match: (TESTLconst [c] (MOVLconst [c]))
	// cond: c < 0
	// result: (FlagLT_UGT)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_0.AuxInt) != c || !(c < 0) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_UGT)
		return true
	}
	// match: (TESTLconst [c] (MOVLconst [c]))
	// cond: c > 0
	// result: (FlagGT_UGT)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_0.AuxInt) != c || !(c > 0) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_UGT)
		return true
	}
	// match: (TESTLconst [-1] x)
	// cond: x.Op != ssaop.OpAMD64MOVLconst
	// result: (TESTL x x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != -1 {
			break
		}
		x := v_0
		if !(x.Op != ssaop.OpAMD64MOVLconst) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTL)
		v.AddArg2(x, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64TESTQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (TESTQ (MOVQconst [c]) x)
	// cond: ssa.Is32Bit(c)
	// result: (TESTQconst [int32(c)] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_0.AuxInt)
			x := v_1
			if !(ssa.Is32Bit(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64TESTQconst)
			v.AuxInt = ssa.Int32ToAuxInt(int32(c))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (TESTQ l:(MOVQload {sym} [off] ptr mem) l2)
	// cond: l == l2 && l.Uses == 2 && ssa.Clobber(l)
	// result: @l.Block (CMPQconstload {sym} [ssa.MakeValAndOff(0, off)] ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			l := v_0
			if l.Op != ssaop.OpAMD64MOVQload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			l2 := v_1
			if !(l == l2 && l.Uses == 2 && ssa.Clobber(l)) {
				continue
			}
			b = l.Block
			v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPQconstload, types.TypeFlags)
			v.CopyOf(v0)
			v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, off))
			v0.Aux = ssa.SymToAux(sym)
			v0.AddArg2(ptr, mem)
			return true
		}
		break
	}
	// match: (TESTQ a:(ANDQload [off] {sym} x ptr mem) a)
	// cond: a.Uses == 2 && a.Block == v.Block && ssa.Clobber(a)
	// result: (TESTQ (MOVQload <a.Type> [off] {sym} ptr mem) x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			a := v_0
			if a.Op != ssaop.OpAMD64ANDQload {
				continue
			}
			off := ssa.AuxIntToInt32(a.AuxInt)
			sym := ssa.AuxToSym(a.Aux)
			mem := a.Args[2]
			x := a.Args[0]
			ptr := a.Args[1]
			if a != v_1 || !(a.Uses == 2 && a.Block == v.Block && ssa.Clobber(a)) {
				continue
			}
			v.Reset(ssaop.OpAMD64TESTQ)
			v0 := b.NewValue0(a.Pos, ssaop.OpAMD64MOVQload, a.Type)
			v0.AuxInt = ssa.Int32ToAuxInt(off)
			v0.Aux = ssa.SymToAux(sym)
			v0.AddArg2(ptr, mem)
			v.AddArg2(v0, x)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64TESTQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TESTQconst [c] (MOVQconst [d]))
	// cond: int64(c) == d && c == 0
	// result: (FlagEQ)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		if !(int64(c) == d && c == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagEQ)
		return true
	}
	// match: (TESTQconst [c] (MOVQconst [d]))
	// cond: int64(c) == d && c < 0
	// result: (FlagLT_UGT)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		if !(int64(c) == d && c < 0) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagLT_UGT)
		return true
	}
	// match: (TESTQconst [c] (MOVQconst [d]))
	// cond: int64(c) == d && c > 0
	// result: (FlagGT_UGT)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		if !(int64(c) == d && c > 0) {
			break
		}
		v.Reset(ssaop.OpAMD64FlagGT_UGT)
		return true
	}
	// match: (TESTQconst [-1] x)
	// cond: x.Op != ssaop.OpAMD64MOVQconst
	// result: (TESTQ x x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != -1 {
			break
		}
		x := v_0
		if !(x.Op != ssaop.OpAMD64MOVQconst) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTQ)
		v.AddArg2(x, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64TESTW(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (TESTW (MOVLconst [c]) x)
	// result: (TESTWconst [int16(c)] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_1
			v.Reset(ssaop.OpAMD64TESTWconst)
			v.AuxInt = ssa.Int16ToAuxInt(int16(c))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (TESTW l:(MOVWload {sym} [off] ptr mem) l2)
	// cond: l == l2 && l.Uses == 2 && ssa.Clobber(l)
	// result: @l.Block (CMPWconstload {sym} [ssa.MakeValAndOff(0, off)] ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			l := v_0
			if l.Op != ssaop.OpAMD64MOVWload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			l2 := v_1
			if !(l == l2 && l.Uses == 2 && ssa.Clobber(l)) {
				continue
			}
			b = l.Block
			v0 := b.NewValue0(l.Pos, ssaop.OpAMD64CMPWconstload, types.TypeFlags)
			v.CopyOf(v0)
			v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, off))
			v0.Aux = ssa.SymToAux(sym)
			v0.AddArg2(ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64TESTWconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TESTWconst [-1] x)
	// cond: x.Op != ssaop.OpAMD64MOVLconst
	// result: (TESTW x x)
	for {
		if ssa.AuxIntToInt16(v.AuxInt) != -1 {
			break
		}
		x := v_0
		if !(x.Op != ssaop.OpAMD64MOVLconst) {
			break
		}
		v.Reset(ssaop.OpAMD64TESTW)
		v.AddArg2(x, x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VADDPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPS128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPS128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPS128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPS256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPS256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPS512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPS512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPS512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPS512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPSMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPSMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPSMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPSMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPSMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPSMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPSMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPSMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDPSMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDPSMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDPSMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VADDPSMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VADDSUBPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDSUBPD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDSUBPD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VADDSUBPD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VADDSUBPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDSUBPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDSUBPD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VADDSUBPD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VADDSUBPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDSUBPS128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDSUBPS128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VADDSUBPS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VADDSUBPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VADDSUBPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VADDSUBPS256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VADDSUBPS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VAESDEC128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VAESDEC128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VAESDEC128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VAESDEC128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VAESDEC256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VAESDEC256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VAESDEC256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VAESDEC256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VAESDECLAST128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VAESDECLAST128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VAESDECLAST128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VAESDECLAST128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VAESDECLAST256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VAESDECLAST256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VAESDECLAST256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VAESDECLAST256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VAESENC128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VAESENC128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VAESENC128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VAESENC128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VAESENC256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VAESENC256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VAESENC256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VAESENC256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VAESENCLAST128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VAESENCLAST128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VAESENCLAST128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VAESENCLAST128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VAESENCLAST256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VAESENCLAST256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VAESENCLAST256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VAESENCLAST256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VAESIMC128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VAESIMC128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VAESIMC128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VAESIMC128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VAESKEYGENASSIST128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VAESKEYGENASSIST128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VAESKEYGENASSIST128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VAESKEYGENASSIST128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VBROADCASTSD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VBROADCASTSD256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx) && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VBROADCASTSD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx) && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VBROADCASTSD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VBROADCASTSD512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VBROADCASTSD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VBROADCASTSDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VBROADCASTSDMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VBROADCASTSDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VBROADCASTSDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VBROADCASTSDMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VBROADCASTSDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VBROADCASTSS128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VBROADCASTSS128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx) && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VBROADCASTSS128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx) && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VBROADCASTSS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VBROADCASTSS256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx) && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VBROADCASTSS256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx) && ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VBROADCASTSS512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VBROADCASTSS512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VBROADCASTSS512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VBROADCASTSSMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VBROADCASTSSMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VBROADCASTSSMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VBROADCASTSSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VBROADCASTSSMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VBROADCASTSSMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VBROADCASTSSMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VBROADCASTSSMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VBROADCASTSSMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPD128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPD256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPD512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPDMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPDMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPDMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPDMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPDMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPDMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPDMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPDMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPDMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPS128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPS128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPS128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPS256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPS256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPS256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPS512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPS512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPS512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPS512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPSMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPSMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPSMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPSMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPSMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPSMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPSMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPSMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCMPPSMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCMPPSMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCMPPSMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCMPPSMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTDQ2PD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTDQ2PD256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTDQ2PD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTDQ2PD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTDQ2PD512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTDQ2PD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTDQ2PDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTDQ2PDMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTDQ2PDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTDQ2PDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTDQ2PDMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTDQ2PDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTDQ2PS128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTDQ2PS128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTDQ2PS128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTDQ2PS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTDQ2PS256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTDQ2PS256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTDQ2PS512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTDQ2PS512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTDQ2PS512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTDQ2PSMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTDQ2PSMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTDQ2PSMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTDQ2PSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTDQ2PSMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTDQ2PSMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTDQ2PSMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTDQ2PSMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTDQ2PSMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTPD2PS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTPD2PS256 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTPD2PS256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPD2PS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTPD2PSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTPD2PSMasked256 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTPD2PSMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPD2PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTPD2PSX128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTPD2PSX128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTPD2PSX128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPD2PSX128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTPD2PSXMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTPD2PSXMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTPD2PSXMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPD2PSXMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTPD2PSY128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTPD2PSY128 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTPD2PSY128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPD2PSY128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTPD2PSYMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTPD2PSYMasked128 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTPD2PSYMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPD2PSYMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTPS2PD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTPS2PD256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTPS2PD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPS2PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTPS2PD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTPS2PD512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTPS2PD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPS2PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTPS2PDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTPS2PDMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTPS2PDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPS2PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTPS2PDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTPS2PDMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTPS2PDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPS2PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTQQ2PD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTQQ2PD256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTQQ2PD512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTQQ2PDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTQQ2PDMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTQQ2PDMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTQQ2PS256 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PS256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTQQ2PSMasked256 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PSMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PSX128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTQQ2PSX128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PSX128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PSX128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PSXMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTQQ2PSXMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PSXMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PSXMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PSY128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTQQ2PSY128 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PSY128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PSY128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTQQ2PSYMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTQQ2PSYMasked128 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTQQ2PSYMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PSYMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2DQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2DQ256 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2DQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2DQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2DQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2DQMasked256 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2DQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2DQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2DQX128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2DQX128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2DQX128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2DQX128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2DQXMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2DQXMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2DQXMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2DQXMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2DQY128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2DQY128 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2DQY128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2DQY128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2DQYMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2DQYMasked128 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2DQYMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2DQYMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2QQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2QQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2QQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2QQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2QQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2QQ256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2QQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2QQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2QQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2QQ512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2QQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2QQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2QQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2QQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2QQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2QQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2QQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2QQMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2QQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2QQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2QQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2QQMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2QQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2QQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UDQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2UDQ256 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UDQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UDQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2UDQMasked256 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UDQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UDQX128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2UDQX128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UDQX128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQX128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UDQXMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2UDQXMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UDQXMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQXMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UDQY128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2UDQY128 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UDQY128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQY128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UDQYMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2UDQYMasked128 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UDQYMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQYMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UQQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2UQQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UQQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UQQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2UQQ256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UQQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UQQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPD2UQQ512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UQQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UQQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2UQQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UQQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UQQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2UQQMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UQQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPD2UQQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPD2UQQMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPD2UQQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2DQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPS2DQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2DQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2DQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2DQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPS2DQ256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2DQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2DQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2DQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPS2DQ512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2DQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2DQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2DQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPS2DQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2DQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2DQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2DQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPS2DQMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2DQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2DQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2DQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPS2DQMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2DQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2DQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2QQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPS2QQ256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2QQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2QQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2QQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPS2QQ512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2QQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2QQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2QQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPS2QQMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2QQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2QQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2QQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPS2QQMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2QQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2QQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2UDQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPS2UDQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2UDQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2UDQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPS2UDQ256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2UDQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2UDQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPS2UDQ512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2UDQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2UDQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPS2UDQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2UDQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2UDQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPS2UDQMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2UDQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2UDQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPS2UDQMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2UDQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2UQQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPS2UQQ256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2UQQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UQQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2UQQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTTPS2UQQ512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2UQQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UQQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2UQQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPS2UQQMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2UQQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UQQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTTPS2UQQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTTPS2UQQMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTTPS2UQQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UQQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUDQ2PD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUDQ2PD256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUDQ2PD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUDQ2PD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUDQ2PD512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUDQ2PD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUDQ2PDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUDQ2PDMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUDQ2PDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUDQ2PDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUDQ2PDMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUDQ2PDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUDQ2PS128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUDQ2PS128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUDQ2PS128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUDQ2PS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUDQ2PS256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUDQ2PS256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUDQ2PS512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUDQ2PS512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUDQ2PS512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUDQ2PSMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUDQ2PSMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUDQ2PSMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUDQ2PSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUDQ2PSMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUDQ2PSMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUDQ2PSMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUDQ2PSMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUDQ2PSMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PD256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PD512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PDMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PDMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PS256 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PS256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PSMasked256 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PSMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PSX128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PSX128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PSX128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSX128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PSXMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PSXMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PSXMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSXMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PSY128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PSY128 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PSY128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSY128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VCVTUQQ2PSYMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VCVTUQQ2PSYMasked128 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VCVTUQQ2PSYMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSYMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPS128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPS128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPS256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPS512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPS512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPS512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPSMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPSMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPSMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPSMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPSMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPSMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VDIVPSMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VDIVPSMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VDIVPSMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VEXPANDPDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VEXPANDPDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VEXPANDPDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VEXPANDPDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VEXPANDPDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VEXPANDPDMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VEXPANDPDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VEXPANDPDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VEXPANDPSMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VEXPANDPSMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VEXPANDPSMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VEXPANDPSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VEXPANDPSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VEXPANDPSMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VEXPANDPSMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VEXPANDPSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PD128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PD128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PD128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PD256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PD256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PD256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PD512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PD512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PD512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PDMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PDMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PDMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PDMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PDMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PDMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PDMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PDMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PDMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PS128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PS128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PS128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PS256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PS256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PS256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PS512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PS512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PS512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PSMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PSMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PSMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PSMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PSMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PSMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADD213PSMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADD213PSMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADD213PSMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADD213PSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PD128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PD128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PD128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PD256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PD256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PD256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PD512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PD512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PD512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PDMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PDMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PDMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PDMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PDMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PDMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PDMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PDMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PDMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PS128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PS128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PS128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PS256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PS256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PS256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PS512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PS512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PS512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PSMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PSMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PSMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PSMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PSMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PSMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMADDSUB213PSMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMADDSUB213PSMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMADDSUB213PSMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMADDSUB213PSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PD128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PD128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PD128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PD256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PD256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PD256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PD512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PD512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PD512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PDMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PDMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PDMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PDMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PDMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PDMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PDMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PDMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PDMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PS128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PS128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PS128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PS256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PS256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PS256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PS512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PS512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PS512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PSMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PSMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PSMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PSMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PSMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PSMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VFMSUBADD213PSMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VFMSUBADD213PSMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VFMSUBADD213PSMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VFMSUBADD213PSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEINVQB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEINVQB128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEINVQB128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEINVQB128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEINVQB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEINVQB256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEINVQB256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEINVQB256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEINVQB512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEINVQB512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEINVQB512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEINVQB512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEINVQBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEINVQBMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEINVQBMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEINVQBMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEINVQBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEINVQBMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEINVQBMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEINVQBMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEINVQBMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEINVQBMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEINVQBMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEINVQBMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEQB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEQB128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEQB128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEQB128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEQB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEQB256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEQB256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEQB256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEQB512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEQB512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEQB512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEQB512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEQBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEQBMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEQBMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEQBMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEQBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEQBMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEQBMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEQBMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8AFFINEQBMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8AFFINEQBMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8AFFINEQBMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEQBMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8MULB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8MULB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8MULB128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8MULB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8MULB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8MULB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8MULB256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8MULB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8MULBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8MULBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8MULBMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8MULBMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VGF2P8MULBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VGF2P8MULBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VGF2P8MULBMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8MULBMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VHADDPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VHADDPD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VHADDPD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VHADDPD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VHADDPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VHADDPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VHADDPD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VHADDPD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VHADDPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VHADDPS128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VHADDPS128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VHADDPS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VHADDPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VHADDPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VHADDPS256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VHADDPS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VHSUBPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VHSUBPD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VHSUBPD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VHSUBPD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VHSUBPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VHSUBPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VHSUBPD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VHSUBPD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VHSUBPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VHSUBPS128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VHSUBPS128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VHSUBPS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VHSUBPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VHSUBPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VHSUBPS256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VHSUBPS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VINSERTF128256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VINSERTF128256 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VINSERTF128256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VINSERTF128256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VINSERTF64X4512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VINSERTF64X4512 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VINSERTF64X4512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VINSERTF64X4512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VINSERTI128256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VINSERTI128256 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VINSERTI128256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VINSERTI128256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VINSERTI64X4512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VINSERTI64X4512 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VINSERTI64X4512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VINSERTI64X4512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMAXPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPS128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPS128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPS128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPS256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPS256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPS512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPS512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPS512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPS512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPSMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPSMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPSMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPSMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPSMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPSMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPSMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPSMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMAXPSMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMAXPSMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMAXPSMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMAXPSMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPS128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPS128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPS128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPS256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPS256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPS512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPS512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPS512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPS512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPSMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPSMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPSMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPSMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPSMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPSMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPSMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPSMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMINPSMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMINPSMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMINPSMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMINPSMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMOVD(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (VMOVD x:(MOVLload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (VMOVDload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVLload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64VMOVDload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU16Masked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU16Masked128 (VPABSW128 x) mask)
	// result: (VPABSWMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSW128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSWMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPADDW128 x y) mask)
	// result: (VPADDWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPADDSW128 x y) mask)
	// result: (VPADDSWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDSW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDSWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPADDUSW128 x y) mask)
	// result: (VPADDUSWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDUSW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDUSWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPAVGW128 x y) mask)
	// result: (VPAVGWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPAVGW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPAVGWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPERMI2W128 x y z) mask)
	// result: (VPERMI2WMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2W128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2WMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMADDWD128 x y) mask)
	// result: (VPMADDWDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMADDWD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMADDWDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMADDUBSW128 x y) mask)
	// result: (VPMADDUBSWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMADDUBSW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMADDUBSWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMOVSXWQ128 x) mask)
	// result: (VPMOVSXWQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXWQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXWQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMOVZXWQ128 x) mask)
	// result: (VPMOVZXWQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXWQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXWQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMOVSXWD128 x) mask)
	// result: (VPMOVSXWDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXWD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXWDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMOVZXWD128 x) mask)
	// result: (VPMOVZXWDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXWD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXWDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMAXSW128 x y) mask)
	// result: (VPMAXSWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMAXUW128 x y) mask)
	// result: (VPMAXUWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMINSW128 x y) mask)
	// result: (VPMINSWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMINUW128 x y) mask)
	// result: (VPMINUWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMULHW128 x y) mask)
	// result: (VPMULHWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULHW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULHWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMULHUW128 x y) mask)
	// result: (VPMULHUWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULHUW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULHUWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMULLW128 x y) mask)
	// result: (VPMULLWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULLW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULLWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPOPCNTW128 x) mask)
	// result: (VPOPCNTWMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTW128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTWMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPERMW128 x y) mask)
	// result: (VPERMWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMOVSWB128_128 x) mask)
	// result: (VPMOVSWBMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSWB128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSWBMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMOVUSWB128_128 x) mask)
	// result: (VPMOVUSWBMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSWB128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSWBMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSHLDW128 [a] x y) mask)
	// result: (VPSHLDWMasked128 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDW128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDWMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSLLW128 x y) mask)
	// result: (VPSLLWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSHRDW128 [a] x y) mask)
	// result: (VPSHRDWMasked128 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDW128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDWMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSRAW128 x y) mask)
	// result: (VPSRAWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSRLW128 x y) mask)
	// result: (VPSRLWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSHLDVW128 x y z) mask)
	// result: (VPSHLDVWMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDVW128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDVWMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSLLVW128 x y) mask)
	// result: (VPSLLVWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLVW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLVWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSHRDVW128 x y z) mask)
	// result: (VPSHRDVWMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDVW128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDVWMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSRAVW128 x y) mask)
	// result: (VPSRAVWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAVW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAVWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSRLVW128 x y) mask)
	// result: (VPSRLVWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLVW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLVWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSUBW128 x y) mask)
	// result: (VPSUBWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSUBSW128 x y) mask)
	// result: (VPSUBSWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBSW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBSWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSUBUSW128 x y) mask)
	// result: (VPSUBUSWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBUSW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBUSWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPMOVWB128_128 x) mask)
	// result: (VPMOVWBMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVWB128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVWBMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSHUFHW128 [a] x) mask)
	// result: (VPSHUFHWMasked128 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFHW128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFHWMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSHUFLW128 [a] x) mask)
	// result: (VPSHUFLWMasked128 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFLW128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFLWMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSLLW128const [a] x) mask)
	// result: (VPSLLWMasked128const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLW128const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLWMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSRAW128const [a] x) mask)
	// result: (VPSRAWMasked128const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAW128const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAWMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked128 (VPSRLW128const [a] x) mask)
	// result: (VPSRLWMasked128const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLW128const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLWMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU16Masked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU16Masked256 (VPABSW256 x) mask)
	// result: (VPABSWMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSW256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSWMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPADDW256 x y) mask)
	// result: (VPADDWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPADDSW256 x y) mask)
	// result: (VPADDSWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDSW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDSWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPADDUSW256 x y) mask)
	// result: (VPADDUSWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDUSW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDUSWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPAVGW256 x y) mask)
	// result: (VPAVGWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPAVGW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPAVGWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPERMI2W256 x y z) mask)
	// result: (VPERMI2WMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2W256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2WMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMADDWD256 x y) mask)
	// result: (VPMADDWDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMADDWD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMADDWDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMADDUBSW256 x y) mask)
	// result: (VPMADDUBSWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMADDUBSW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMADDUBSWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMOVSXWQ256 x) mask)
	// result: (VPMOVSXWQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXWQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXWQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMOVZXWQ256 x) mask)
	// result: (VPMOVZXWQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXWQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXWQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMOVSXWD256 x) mask)
	// result: (VPMOVSXWDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXWD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXWDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMOVZXWD256 x) mask)
	// result: (VPMOVZXWDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXWD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXWDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMAXSW256 x y) mask)
	// result: (VPMAXSWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMAXUW256 x y) mask)
	// result: (VPMAXUWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMINSW256 x y) mask)
	// result: (VPMINSWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMINUW256 x y) mask)
	// result: (VPMINUWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMULHW256 x y) mask)
	// result: (VPMULHWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULHW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULHWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMULHUW256 x y) mask)
	// result: (VPMULHUWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULHUW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULHUWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMULLW256 x y) mask)
	// result: (VPMULLWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULLW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULLWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPOPCNTW256 x) mask)
	// result: (VPOPCNTWMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTW256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTWMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPERMW256 x y) mask)
	// result: (VPERMWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMOVSWB128_256 x) mask)
	// result: (VPMOVSWBMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSWB128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSWBMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMOVSWB256 x) mask)
	// result: (VPMOVSWBMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSWB256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSWBMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMOVUSWB128_256 x) mask)
	// result: (VPMOVUSWBMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSWB128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSWBMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMOVUSWB256 x) mask)
	// result: (VPMOVUSWBMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSWB256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSWBMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSHLDW256 [a] x y) mask)
	// result: (VPSHLDWMasked256 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDW256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDWMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSLLW256 x y) mask)
	// result: (VPSLLWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSHRDW256 [a] x y) mask)
	// result: (VPSHRDWMasked256 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDW256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDWMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSRAW256 x y) mask)
	// result: (VPSRAWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSRLW256 x y) mask)
	// result: (VPSRLWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSHLDVW256 x y z) mask)
	// result: (VPSHLDVWMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDVW256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDVWMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSLLVW256 x y) mask)
	// result: (VPSLLVWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLVW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLVWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSHRDVW256 x y z) mask)
	// result: (VPSHRDVWMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDVW256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDVWMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSRAVW256 x y) mask)
	// result: (VPSRAVWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAVW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAVWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSRLVW256 x y) mask)
	// result: (VPSRLVWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLVW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLVWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSUBW256 x y) mask)
	// result: (VPSUBWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSUBSW256 x y) mask)
	// result: (VPSUBSWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBSW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBSWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSUBUSW256 x y) mask)
	// result: (VPSUBUSWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBUSW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBUSWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMOVWB128_256 x) mask)
	// result: (VPMOVWBMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVWB128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVWBMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPMOVWB256 x) mask)
	// result: (VPMOVWBMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVWB256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVWBMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSHUFHW256 [a] x) mask)
	// result: (VPSHUFHWMasked256 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFHW256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFHWMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSHUFLW256 [a] x) mask)
	// result: (VPSHUFLWMasked256 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFLW256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFLWMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSLLW256const [a] x) mask)
	// result: (VPSLLWMasked256const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLW256const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLWMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSRAW256const [a] x) mask)
	// result: (VPSRAWMasked256const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAW256const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAWMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked256 (VPSRLW256const [a] x) mask)
	// result: (VPSRLWMasked256const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLW256const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLWMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU16Masked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU16Masked512 (VPABSW512 x) mask)
	// result: (VPABSWMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSW512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSWMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPADDW512 x y) mask)
	// result: (VPADDWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPADDSW512 x y) mask)
	// result: (VPADDSWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDSW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDSWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPADDUSW512 x y) mask)
	// result: (VPADDUSWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDUSW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDUSWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPAVGW512 x y) mask)
	// result: (VPAVGWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPAVGW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPAVGWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPERMI2W512 x y z) mask)
	// result: (VPERMI2WMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2W512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2WMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMADDWD512 x y) mask)
	// result: (VPMADDWDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMADDWD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMADDWDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMADDUBSW512 x y) mask)
	// result: (VPMADDUBSWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMADDUBSW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMADDUBSWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMOVSXWD512 x) mask)
	// result: (VPMOVSXWDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXWD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXWDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMOVSXWQ512 x) mask)
	// result: (VPMOVSXWQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXWQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXWQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMOVZXWD512 x) mask)
	// result: (VPMOVZXWDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXWD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXWDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMOVZXWQ512 x) mask)
	// result: (VPMOVZXWQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXWQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXWQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMAXSW512 x y) mask)
	// result: (VPMAXSWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMAXUW512 x y) mask)
	// result: (VPMAXUWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMINSW512 x y) mask)
	// result: (VPMINSWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMINUW512 x y) mask)
	// result: (VPMINUWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMULHW512 x y) mask)
	// result: (VPMULHWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULHW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULHWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMULHUW512 x y) mask)
	// result: (VPMULHUWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULHUW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULHUWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPMULLW512 x y) mask)
	// result: (VPMULLWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULLW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULLWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPOPCNTW512 x) mask)
	// result: (VPOPCNTWMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTW512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTWMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPERMW512 x y) mask)
	// result: (VPERMWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSHLDW512 [a] x y) mask)
	// result: (VPSHLDWMasked512 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDW512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDWMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSLLW512 x y) mask)
	// result: (VPSLLWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSHRDW512 [a] x y) mask)
	// result: (VPSHRDWMasked512 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDW512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDWMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSRAW512 x y) mask)
	// result: (VPSRAWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSRLW512 x y) mask)
	// result: (VPSRLWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSHLDVW512 x y z) mask)
	// result: (VPSHLDVWMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDVW512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDVWMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSLLVW512 x y) mask)
	// result: (VPSLLVWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLVW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLVWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSHRDVW512 x y z) mask)
	// result: (VPSHRDVWMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDVW512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDVWMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSRAVW512 x y) mask)
	// result: (VPSRAVWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAVW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAVWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSRLVW512 x y) mask)
	// result: (VPSRLVWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLVW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLVWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSUBW512 x y) mask)
	// result: (VPSUBWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSUBSW512 x y) mask)
	// result: (VPSUBSWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBSW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBSWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSUBUSW512 x y) mask)
	// result: (VPSUBUSWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBUSW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBUSWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSHUFHW512 [a] x) mask)
	// result: (VPSHUFHWMasked512 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFHW512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFHWMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSHUFLW512 [a] x) mask)
	// result: (VPSHUFLWMasked512 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFLW512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFLWMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSLLW512const [a] x) mask)
	// result: (VPSLLWMasked512const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLW512const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLWMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSRAW512const [a] x) mask)
	// result: (VPSRAWMasked512const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAW512const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAWMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU16Masked512 (VPSRLW512const [a] x) mask)
	// result: (VPSRLWMasked512const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLW512const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLWMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU32Masked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU32Masked128 (VPABSD128 x) mask)
	// result: (VPABSDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VADDPS128 x y) mask)
	// result: (VADDPSMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VADDPS128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VADDPSMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPADDD128 x y) mask)
	// result: (VPADDDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VRNDSCALEPS128 [a] x) mask)
	// result: (VRNDSCALEPSMasked128 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRNDSCALEPS128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRNDSCALEPSMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VREDUCEPS128 [a] x) mask)
	// result: (VREDUCEPSMasked128 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VREDUCEPS128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VREDUCEPSMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPERMI2PS128 x y z) mask)
	// result: (VPERMI2PSMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2PS128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2PSMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPERMI2D128 x y z) mask)
	// result: (VPERMI2DMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2D128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2DMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPACKSSDW128 x y) mask)
	// result: (VPACKSSDWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPACKSSDW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPACKSSDWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPACKUSDW128 x y) mask)
	// result: (VPACKUSDWMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPACKUSDW128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPACKUSDWMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VCVTDQ2PS128 x) mask)
	// result: (VCVTDQ2PSMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTDQ2PS128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTDQ2PSMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VCVTUDQ2PS128 x) mask)
	// result: (VCVTUDQ2PSMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUDQ2PS128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUDQ2PSMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VCVTTPS2DQ128 x) mask)
	// result: (VCVTTPS2DQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPS2DQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPS2DQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VCVTTPS2UDQ128 x) mask)
	// result: (VCVTTPS2UDQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPS2UDQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VDIVPS128 x y) mask)
	// result: (VDIVPSMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VDIVPS128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VDIVPSMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMOVSXDQ128 x) mask)
	// result: (VPMOVSXDQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXDQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXDQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMOVZXDQ128 x) mask)
	// result: (VPMOVZXDQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXDQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXDQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPLZCNTD128 x) mask)
	// result: (VPLZCNTDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPLZCNTD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPLZCNTDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VMAXPS128 x y) mask)
	// result: (VMAXPSMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMAXPS128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMAXPSMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMAXSD128 x y) mask)
	// result: (VPMAXSDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMAXUD128 x y) mask)
	// result: (VPMAXUDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VMINPS128 x y) mask)
	// result: (VMINPSMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMINPS128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMINPSMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMINSD128 x y) mask)
	// result: (VPMINSDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMINUD128 x y) mask)
	// result: (VPMINUDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VFMADDSUB213PS128 x y z) mask)
	// result: (VFMADDSUB213PSMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADDSUB213PS128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADDSUB213PSMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VFMADD213PS128 x y z) mask)
	// result: (VFMADD213PSMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADD213PS128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADD213PSMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VFMSUBADD213PS128 x y z) mask)
	// result: (VFMSUBADD213PSMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMSUBADD213PS128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMSUBADD213PSMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VMULPS128 x y) mask)
	// result: (VMULPSMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMULPS128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMULPSMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMULLD128 x y) mask)
	// result: (VPMULLDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULLD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULLDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPOPCNTD128 x) mask)
	// result: (VPOPCNTDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPROLVD128 x y) mask)
	// result: (VPROLVDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPROLVD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPROLVDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPRORVD128 x y) mask)
	// result: (VPRORVDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPRORVD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPRORVDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMOVSDB128_128 x) mask)
	// result: (VPMOVSDBMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSDB128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSDBMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMOVSDW128_128 x) mask)
	// result: (VPMOVSDWMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSDW128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSDWMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMOVUSDB128_128 x) mask)
	// result: (VPMOVUSDBMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSDB128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSDBMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMOVUSDW128_128 x) mask)
	// result: (VPMOVUSDWMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSDW128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSDWMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VSCALEFPS128 x y) mask)
	// result: (VSCALEFPSMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSCALEFPS128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSCALEFPSMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSHLDD128 [a] x y) mask)
	// result: (VPSHLDDMasked128 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDD128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDDMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSLLD128 x y) mask)
	// result: (VPSLLDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSHRDD128 [a] x y) mask)
	// result: (VPSHRDDMasked128 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDD128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDDMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSRAD128 x y) mask)
	// result: (VPSRADMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRADMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSRLD128 x y) mask)
	// result: (VPSRLDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSHLDVD128 x y z) mask)
	// result: (VPSHLDVDMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDVD128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDVDMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSLLVD128 x y) mask)
	// result: (VPSLLVDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLVD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLVDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSHRDVD128 x y z) mask)
	// result: (VPSHRDVDMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDVD128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDVDMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSRAVD128 x y) mask)
	// result: (VPSRAVDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAVD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAVDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSRLVD128 x y) mask)
	// result: (VPSRLVDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLVD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLVDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VSQRTPS128 x) mask)
	// result: (VSQRTPSMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSQRTPS128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSQRTPSMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VSUBPS128 x y) mask)
	// result: (VSUBPSMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSUBPS128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSUBPSMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSUBD128 x y) mask)
	// result: (VPSUBDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMOVDB128_128 x) mask)
	// result: (VPMOVDBMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVDB128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVDBMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPMOVDW128_128 x) mask)
	// result: (VPMOVDWMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVDW128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVDWMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSHUFD128 [a] x) mask)
	// result: (VPSHUFDMasked128 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFD128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFDMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSLLD128const [a] x) mask)
	// result: (VPSLLDMasked128const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLD128const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLDMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSRAD128const [a] x) mask)
	// result: (VPSRADMasked128const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAD128const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRADMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked128 (VPSRLD128const [a] x) mask)
	// result: (VPSRLDMasked128const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLD128const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLDMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU32Masked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU32Masked256 (VPABSD256 x) mask)
	// result: (VPABSDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VADDPS256 x y) mask)
	// result: (VADDPSMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VADDPS256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VADDPSMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPADDD256 x y) mask)
	// result: (VPADDDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VRNDSCALEPS256 [a] x) mask)
	// result: (VRNDSCALEPSMasked256 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRNDSCALEPS256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRNDSCALEPSMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VREDUCEPS256 [a] x) mask)
	// result: (VREDUCEPSMasked256 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VREDUCEPS256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VREDUCEPSMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPERMI2PS256 x y z) mask)
	// result: (VPERMI2PSMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2PS256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2PSMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPERMI2D256 x y z) mask)
	// result: (VPERMI2DMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2D256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2DMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPACKSSDW256 x y) mask)
	// result: (VPACKSSDWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPACKSSDW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPACKSSDWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPACKUSDW256 x y) mask)
	// result: (VPACKUSDWMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPACKUSDW256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPACKUSDWMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VCVTDQ2PS256 x) mask)
	// result: (VCVTDQ2PSMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTDQ2PS256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTDQ2PSMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VCVTUDQ2PS256 x) mask)
	// result: (VCVTUDQ2PSMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUDQ2PS256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUDQ2PSMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VCVTPS2PD256 x) mask)
	// result: (VCVTPS2PDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTPS2PD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTPS2PDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VCVTDQ2PD256 x) mask)
	// result: (VCVTDQ2PDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTDQ2PD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTDQ2PDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VCVTUDQ2PD256 x) mask)
	// result: (VCVTUDQ2PDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUDQ2PD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUDQ2PDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VCVTTPS2DQ256 x) mask)
	// result: (VCVTTPS2DQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPS2DQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPS2DQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VCVTTPS2QQ256 x) mask)
	// result: (VCVTTPS2QQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPS2QQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPS2QQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VCVTTPS2UDQ256 x) mask)
	// result: (VCVTTPS2UDQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPS2UDQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VCVTTPS2UQQ256 x) mask)
	// result: (VCVTTPS2UQQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPS2UQQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPS2UQQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VDIVPS256 x y) mask)
	// result: (VDIVPSMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VDIVPS256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VDIVPSMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVSXDQ256 x) mask)
	// result: (VPMOVSXDQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXDQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXDQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVZXDQ256 x) mask)
	// result: (VPMOVZXDQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXDQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXDQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPLZCNTD256 x) mask)
	// result: (VPLZCNTDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPLZCNTD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPLZCNTDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VMAXPS256 x y) mask)
	// result: (VMAXPSMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMAXPS256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMAXPSMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMAXSD256 x y) mask)
	// result: (VPMAXSDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMAXUD256 x y) mask)
	// result: (VPMAXUDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VMINPS256 x y) mask)
	// result: (VMINPSMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMINPS256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMINPSMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMINSD256 x y) mask)
	// result: (VPMINSDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMINUD256 x y) mask)
	// result: (VPMINUDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VFMADDSUB213PS256 x y z) mask)
	// result: (VFMADDSUB213PSMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADDSUB213PS256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADDSUB213PSMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VFMADD213PS256 x y z) mask)
	// result: (VFMADD213PSMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADD213PS256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADD213PSMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VFMSUBADD213PS256 x y z) mask)
	// result: (VFMSUBADD213PSMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMSUBADD213PS256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMSUBADD213PSMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VMULPS256 x y) mask)
	// result: (VMULPSMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMULPS256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMULPSMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMULLD256 x y) mask)
	// result: (VPMULLDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULLD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULLDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPOPCNTD256 x) mask)
	// result: (VPOPCNTDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPERMPS256 x y) mask)
	// result: (VPERMPSMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMPS256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMPSMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPERMD256 x y) mask)
	// result: (VPERMDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPROLVD256 x y) mask)
	// result: (VPROLVDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPROLVD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPROLVDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPRORVD256 x y) mask)
	// result: (VPRORVDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPRORVD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPRORVDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVSDB128_256 x) mask)
	// result: (VPMOVSDBMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSDB128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSDBMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVSDW128_256 x) mask)
	// result: (VPMOVSDWMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSDW128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSDWMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVSDW256 x) mask)
	// result: (VPMOVSDWMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSDW256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSDWMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVUSDB128_256 x) mask)
	// result: (VPMOVUSDBMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSDB128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSDBMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVUSDW128_256 x) mask)
	// result: (VPMOVUSDWMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSDW128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSDWMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVUSDW256 x) mask)
	// result: (VPMOVUSDWMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSDW256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSDWMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VSCALEFPS256 x y) mask)
	// result: (VSCALEFPSMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSCALEFPS256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSCALEFPSMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSHLDD256 [a] x y) mask)
	// result: (VPSHLDDMasked256 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDD256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDDMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSLLD256 x y) mask)
	// result: (VPSLLDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSHRDD256 [a] x y) mask)
	// result: (VPSHRDDMasked256 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDD256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDDMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSRAD256 x y) mask)
	// result: (VPSRADMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRADMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSRLD256 x y) mask)
	// result: (VPSRLDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSHLDVD256 x y z) mask)
	// result: (VPSHLDVDMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDVD256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDVDMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSLLVD256 x y) mask)
	// result: (VPSLLVDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLVD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLVDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSHRDVD256 x y z) mask)
	// result: (VPSHRDVDMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDVD256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDVDMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSRAVD256 x y) mask)
	// result: (VPSRAVDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAVD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAVDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSRLVD256 x y) mask)
	// result: (VPSRLVDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLVD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLVDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VSQRTPS256 x) mask)
	// result: (VSQRTPSMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSQRTPS256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSQRTPSMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VSUBPS256 x y) mask)
	// result: (VSUBPSMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSUBPS256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSUBPSMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSUBD256 x y) mask)
	// result: (VPSUBDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVDB128_256 x) mask)
	// result: (VPMOVDBMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVDB128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVDBMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVDW128_256 x) mask)
	// result: (VPMOVDWMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVDW128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVDWMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPMOVDW256 x) mask)
	// result: (VPMOVDWMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVDW256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVDWMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSHUFD256 [a] x) mask)
	// result: (VPSHUFDMasked256 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFD256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFDMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSLLD256const [a] x) mask)
	// result: (VPSLLDMasked256const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLD256const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLDMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSRAD256const [a] x) mask)
	// result: (VPSRADMasked256const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAD256const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRADMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked256 (VPSRLD256const [a] x) mask)
	// result: (VPSRLDMasked256const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLD256const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLDMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU32Masked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU32Masked512 (VPABSD512 x) mask)
	// result: (VPABSDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VADDPS512 x y) mask)
	// result: (VADDPSMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VADDPS512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VADDPSMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPADDD512 x y) mask)
	// result: (VPADDDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPANDD512 x y) mask)
	// result: (VPANDDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPANDD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPANDDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPANDND512 x y) mask)
	// result: (VPANDNDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPANDND512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPANDNDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VRNDSCALEPS512 [a] x) mask)
	// result: (VRNDSCALEPSMasked512 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRNDSCALEPS512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRNDSCALEPSMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VREDUCEPS512 [a] x) mask)
	// result: (VREDUCEPSMasked512 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VREDUCEPS512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VREDUCEPSMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPERMI2PS512 x y z) mask)
	// result: (VPERMI2PSMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2PS512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2PSMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPERMI2D512 x y z) mask)
	// result: (VPERMI2DMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2D512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2DMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPACKSSDW512 x y) mask)
	// result: (VPACKSSDWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPACKSSDW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPACKSSDWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPACKUSDW512 x y) mask)
	// result: (VPACKUSDWMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPACKUSDW512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPACKUSDWMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VCVTDQ2PS512 x) mask)
	// result: (VCVTDQ2PSMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTDQ2PS512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTDQ2PSMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VCVTUDQ2PS512 x) mask)
	// result: (VCVTUDQ2PSMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUDQ2PS512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUDQ2PSMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VCVTPS2PD512 x) mask)
	// result: (VCVTPS2PDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTPS2PD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTPS2PDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VCVTDQ2PD512 x) mask)
	// result: (VCVTDQ2PDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTDQ2PD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTDQ2PDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VCVTUDQ2PD512 x) mask)
	// result: (VCVTUDQ2PDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUDQ2PD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUDQ2PDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VCVTTPS2DQ512 x) mask)
	// result: (VCVTTPS2DQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPS2DQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPS2DQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VCVTTPS2QQ512 x) mask)
	// result: (VCVTTPS2QQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPS2QQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPS2QQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VCVTTPS2UDQ512 x) mask)
	// result: (VCVTTPS2UDQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPS2UDQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VCVTTPS2UQQ512 x) mask)
	// result: (VCVTTPS2UQQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPS2UQQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPS2UQQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VDIVPS512 x y) mask)
	// result: (VDIVPSMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VDIVPS512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VDIVPSMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPMOVSXDQ512 x) mask)
	// result: (VPMOVSXDQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXDQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXDQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPMOVZXDQ512 x) mask)
	// result: (VPMOVZXDQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXDQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXDQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPLZCNTD512 x) mask)
	// result: (VPLZCNTDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPLZCNTD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPLZCNTDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VMAXPS512 x y) mask)
	// result: (VMAXPSMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMAXPS512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMAXPSMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPMAXSD512 x y) mask)
	// result: (VPMAXSDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPMAXUD512 x y) mask)
	// result: (VPMAXUDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VMINPS512 x y) mask)
	// result: (VMINPSMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMINPS512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMINPSMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPMINSD512 x y) mask)
	// result: (VPMINSDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPMINUD512 x y) mask)
	// result: (VPMINUDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VFMADDSUB213PS512 x y z) mask)
	// result: (VFMADDSUB213PSMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADDSUB213PS512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADDSUB213PSMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VFMADD213PS512 x y z) mask)
	// result: (VFMADD213PSMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADD213PS512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADD213PSMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VFMSUBADD213PS512 x y z) mask)
	// result: (VFMSUBADD213PSMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMSUBADD213PS512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMSUBADD213PSMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VMULPS512 x y) mask)
	// result: (VMULPSMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMULPS512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMULPSMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPMULLD512 x y) mask)
	// result: (VPMULLDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULLD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULLDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPOPCNTD512 x) mask)
	// result: (VPOPCNTDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPORD512 x y) mask)
	// result: (VPORDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPORD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPORDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPERMPS512 x y) mask)
	// result: (VPERMPSMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMPS512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMPSMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPERMD512 x y) mask)
	// result: (VPERMDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VRCP14PS512 x) mask)
	// result: (VRCP14PSMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRCP14PS512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRCP14PSMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VRSQRT14PS512 x) mask)
	// result: (VRSQRT14PSMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRSQRT14PS512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRSQRT14PSMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPROLVD512 x y) mask)
	// result: (VPROLVDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPROLVD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPROLVDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPRORVD512 x y) mask)
	// result: (VPRORVDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPRORVD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPRORVDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPMOVSDB128_512 x) mask)
	// result: (VPMOVSDBMasked128_512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSDB128_512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSDBMasked128_512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPMOVUSDB128_512 x) mask)
	// result: (VPMOVUSDBMasked128_512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSDB128_512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSDBMasked128_512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VSCALEFPS512 x y) mask)
	// result: (VSCALEFPSMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSCALEFPS512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSCALEFPSMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSHLDD512 [a] x y) mask)
	// result: (VPSHLDDMasked512 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDD512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDDMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSLLD512 x y) mask)
	// result: (VPSLLDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSHRDD512 [a] x y) mask)
	// result: (VPSHRDDMasked512 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDD512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDDMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSRAD512 x y) mask)
	// result: (VPSRADMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRADMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSRLD512 x y) mask)
	// result: (VPSRLDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSHLDVD512 x y z) mask)
	// result: (VPSHLDVDMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDVD512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDVDMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSLLVD512 x y) mask)
	// result: (VPSLLVDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLVD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLVDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSHRDVD512 x y z) mask)
	// result: (VPSHRDVDMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDVD512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDVDMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSRAVD512 x y) mask)
	// result: (VPSRAVDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAVD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAVDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSRLVD512 x y) mask)
	// result: (VPSRLVDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLVD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLVDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VSQRTPS512 x) mask)
	// result: (VSQRTPSMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSQRTPS512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSQRTPSMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VSUBPS512 x y) mask)
	// result: (VSUBPSMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSUBPS512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSUBPSMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSUBD512 x y) mask)
	// result: (VPSUBDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPMOVDB128_512 x) mask)
	// result: (VPMOVDBMasked128_512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVDB128_512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVDBMasked128_512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPXORD512 x y) mask)
	// result: (VPXORDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPXORD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPXORDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSHUFD512 [a] x) mask)
	// result: (VPSHUFDMasked512 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFD512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFDMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSLLD512const [a] x) mask)
	// result: (VPSLLDMasked512const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLD512const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLDMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSRAD512const [a] x) mask)
	// result: (VPSRADMasked512const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAD512const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRADMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU32Masked512 (VPSRLD512const [a] x) mask)
	// result: (VPSRLDMasked512const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLD512const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLDMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU64Masked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU64Masked128 (VPABSQ128 x) mask)
	// result: (VPABSQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VADDPD128 x y) mask)
	// result: (VADDPDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VADDPD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VADDPDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPADDQ128 x y) mask)
	// result: (VPADDQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VRNDSCALEPD128 [a] x) mask)
	// result: (VRNDSCALEPDMasked128 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRNDSCALEPD128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRNDSCALEPDMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VREDUCEPD128 [a] x) mask)
	// result: (VREDUCEPDMasked128 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VREDUCEPD128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VREDUCEPDMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPERMI2PD128 x y z) mask)
	// result: (VPERMI2PDMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2PD128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2PDMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPERMI2Q128 x y z) mask)
	// result: (VPERMI2QMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2Q128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2QMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTPD2PSX128 x) mask)
	// result: (VCVTPD2PSXMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTPD2PSX128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTPD2PSXMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTPD2PSY128 x) mask)
	// result: (VCVTPD2PSYMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTPD2PSY128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTPD2PSYMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTQQ2PSX128 x) mask)
	// result: (VCVTQQ2PSXMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTQQ2PSX128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTQQ2PSXMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTQQ2PSY128 x) mask)
	// result: (VCVTQQ2PSYMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTQQ2PSY128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTQQ2PSYMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTUQQ2PSX128 x) mask)
	// result: (VCVTUQQ2PSXMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUQQ2PSX128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSXMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTUQQ2PSY128 x) mask)
	// result: (VCVTUQQ2PSYMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUQQ2PSY128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSYMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTQQ2PD128 x) mask)
	// result: (VCVTQQ2PDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTQQ2PD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTQQ2PDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTUQQ2PD128 x) mask)
	// result: (VCVTUQQ2PDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUQQ2PD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUQQ2PDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTTPD2DQX128 x) mask)
	// result: (VCVTTPD2DQXMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2DQX128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2DQXMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTTPD2DQY128 x) mask)
	// result: (VCVTTPD2DQYMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2DQY128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2DQYMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTTPD2QQ128 x) mask)
	// result: (VCVTTPD2QQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2QQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2QQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTTPD2UDQX128 x) mask)
	// result: (VCVTTPD2UDQXMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2UDQX128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQXMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTTPD2UDQY128 x) mask)
	// result: (VCVTTPD2UDQYMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2UDQY128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQYMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VCVTTPD2UQQ128 x) mask)
	// result: (VCVTTPD2UQQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2UQQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VDIVPD128 x y) mask)
	// result: (VDIVPDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VDIVPD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VDIVPDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPLZCNTQ128 x) mask)
	// result: (VPLZCNTQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPLZCNTQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPLZCNTQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VMAXPD128 x y) mask)
	// result: (VMAXPDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMAXPD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMAXPDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMAXSQ128 x y) mask)
	// result: (VPMAXSQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMAXUQ128 x y) mask)
	// result: (VPMAXUQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VMINPD128 x y) mask)
	// result: (VMINPDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMINPD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMINPDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMINSQ128 x y) mask)
	// result: (VPMINSQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMINUQ128 x y) mask)
	// result: (VPMINUQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VFMADDSUB213PD128 x y z) mask)
	// result: (VFMADDSUB213PDMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADDSUB213PD128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADDSUB213PDMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VFMADD213PD128 x y z) mask)
	// result: (VFMADD213PDMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADD213PD128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADD213PDMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VFMSUBADD213PD128 x y z) mask)
	// result: (VFMSUBADD213PDMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMSUBADD213PD128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMSUBADD213PDMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VMULPD128 x y) mask)
	// result: (VMULPDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMULPD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMULPDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMULLQ128 x y) mask)
	// result: (VPMULLQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULLQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULLQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPOPCNTQ128 x) mask)
	// result: (VPOPCNTQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VRCP14PD128 x) mask)
	// result: (VRCP14PDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRCP14PD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRCP14PDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VRSQRT14PD128 x) mask)
	// result: (VRSQRT14PDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRSQRT14PD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRSQRT14PDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPROLVQ128 x y) mask)
	// result: (VPROLVQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPROLVQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPROLVQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPRORVQ128 x y) mask)
	// result: (VPRORVQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPRORVQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPRORVQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMOVSQB128_128 x) mask)
	// result: (VPMOVSQBMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSQB128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSQBMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMOVSQW128_128 x) mask)
	// result: (VPMOVSQWMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSQW128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSQWMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMOVSQD128_128 x) mask)
	// result: (VPMOVSQDMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSQD128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSQDMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMOVUSQB128_128 x) mask)
	// result: (VPMOVUSQBMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSQB128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSQBMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMOVUSQW128_128 x) mask)
	// result: (VPMOVUSQWMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSQW128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSQWMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMOVUSQD128_128 x) mask)
	// result: (VPMOVUSQDMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSQD128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSQDMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VSCALEFPD128 x y) mask)
	// result: (VSCALEFPDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSCALEFPD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSCALEFPDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSHLDQ128 [a] x y) mask)
	// result: (VPSHLDQMasked128 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDQ128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDQMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSLLQ128 x y) mask)
	// result: (VPSLLQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSHRDQ128 [a] x y) mask)
	// result: (VPSHRDQMasked128 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDQ128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDQMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSRAQ128 x y) mask)
	// result: (VPSRAQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSRLQ128 x y) mask)
	// result: (VPSRLQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSHLDVQ128 x y z) mask)
	// result: (VPSHLDVQMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDVQ128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDVQMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSLLVQ128 x y) mask)
	// result: (VPSLLVQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLVQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLVQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSHRDVQ128 x y z) mask)
	// result: (VPSHRDVQMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDVQ128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDVQMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSRAVQ128 x y) mask)
	// result: (VPSRAVQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAVQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAVQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSRLVQ128 x y) mask)
	// result: (VPSRLVQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLVQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLVQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VSQRTPD128 x) mask)
	// result: (VSQRTPDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSQRTPD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSQRTPDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VSUBPD128 x y) mask)
	// result: (VSUBPDMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSUBPD128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSUBPDMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSUBQ128 x y) mask)
	// result: (VPSUBQMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBQ128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBQMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMOVQB128_128 x) mask)
	// result: (VPMOVQBMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVQB128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVQBMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMOVQW128_128 x) mask)
	// result: (VPMOVQWMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVQW128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVQWMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPMOVQD128_128 x) mask)
	// result: (VPMOVQDMasked128_128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVQD128_128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVQDMasked128_128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSLLQ128const [a] x) mask)
	// result: (VPSLLQMasked128const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLQ128const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLQMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSRAQ128const [a] x) mask)
	// result: (VPSRAQMasked128const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAQ128const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAQMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked128 (VPSRLQ128const [a] x) mask)
	// result: (VPSRLQMasked128const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLQ128const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLQMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU64Masked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU64Masked256 (VPABSQ256 x) mask)
	// result: (VPABSQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VADDPD256 x y) mask)
	// result: (VADDPDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VADDPD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VADDPDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPADDQ256 x y) mask)
	// result: (VPADDQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VRNDSCALEPD256 [a] x) mask)
	// result: (VRNDSCALEPDMasked256 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRNDSCALEPD256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRNDSCALEPDMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VREDUCEPD256 [a] x) mask)
	// result: (VREDUCEPDMasked256 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VREDUCEPD256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VREDUCEPDMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPERMI2PD256 x y z) mask)
	// result: (VPERMI2PDMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2PD256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2PDMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPERMI2Q256 x y z) mask)
	// result: (VPERMI2QMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2Q256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2QMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VCVTPD2PS256 x) mask)
	// result: (VCVTPD2PSMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTPD2PS256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTPD2PSMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VCVTQQ2PS256 x) mask)
	// result: (VCVTQQ2PSMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTQQ2PS256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTQQ2PSMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VCVTUQQ2PS256 x) mask)
	// result: (VCVTUQQ2PSMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUQQ2PS256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VCVTQQ2PD256 x) mask)
	// result: (VCVTQQ2PDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTQQ2PD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTQQ2PDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VCVTUQQ2PD256 x) mask)
	// result: (VCVTUQQ2PDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUQQ2PD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUQQ2PDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VCVTTPD2DQ256 x) mask)
	// result: (VCVTTPD2DQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2DQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2DQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VCVTTPD2QQ256 x) mask)
	// result: (VCVTTPD2QQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2QQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2QQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VCVTTPD2UDQ256 x) mask)
	// result: (VCVTTPD2UDQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2UDQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VCVTTPD2UQQ256 x) mask)
	// result: (VCVTTPD2UQQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2UQQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VDIVPD256 x y) mask)
	// result: (VDIVPDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VDIVPD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VDIVPDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPLZCNTQ256 x) mask)
	// result: (VPLZCNTQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPLZCNTQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPLZCNTQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VMAXPD256 x y) mask)
	// result: (VMAXPDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMAXPD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMAXPDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMAXSQ256 x y) mask)
	// result: (VPMAXSQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMAXUQ256 x y) mask)
	// result: (VPMAXUQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VMINPD256 x y) mask)
	// result: (VMINPDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMINPD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMINPDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMINSQ256 x y) mask)
	// result: (VPMINSQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMINUQ256 x y) mask)
	// result: (VPMINUQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VFMADDSUB213PD256 x y z) mask)
	// result: (VFMADDSUB213PDMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADDSUB213PD256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADDSUB213PDMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VFMADD213PD256 x y z) mask)
	// result: (VFMADD213PDMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADD213PD256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADD213PDMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VFMSUBADD213PD256 x y z) mask)
	// result: (VFMSUBADD213PDMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMSUBADD213PD256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMSUBADD213PDMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VMULPD256 x y) mask)
	// result: (VMULPDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMULPD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMULPDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMULLQ256 x y) mask)
	// result: (VPMULLQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULLQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULLQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPOPCNTQ256 x) mask)
	// result: (VPOPCNTQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPERMPD256 x y) mask)
	// result: (VPERMPDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMPD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMPDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPERMQ256 x y) mask)
	// result: (VPERMQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VRCP14PD256 x) mask)
	// result: (VRCP14PDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRCP14PD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRCP14PDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VRSQRT14PD256 x) mask)
	// result: (VRSQRT14PDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRSQRT14PD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRSQRT14PDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPROLVQ256 x y) mask)
	// result: (VPROLVQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPROLVQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPROLVQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPRORVQ256 x y) mask)
	// result: (VPRORVQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPRORVQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPRORVQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVSQB128_256 x) mask)
	// result: (VPMOVSQBMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSQB128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSQBMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVSQW128_256 x) mask)
	// result: (VPMOVSQWMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSQW128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSQWMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVSQD128_256 x) mask)
	// result: (VPMOVSQDMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSQD128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSQDMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVSQD256 x) mask)
	// result: (VPMOVSQDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSQD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSQDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVUSQB128_256 x) mask)
	// result: (VPMOVUSQBMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSQB128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSQBMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVUSQW128_256 x) mask)
	// result: (VPMOVUSQWMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSQW128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSQWMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVUSQD128_256 x) mask)
	// result: (VPMOVUSQDMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSQD128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSQDMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVUSQD256 x) mask)
	// result: (VPMOVUSQDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSQD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSQDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VSCALEFPD256 x y) mask)
	// result: (VSCALEFPDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSCALEFPD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSCALEFPDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSHLDQ256 [a] x y) mask)
	// result: (VPSHLDQMasked256 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDQ256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDQMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSLLQ256 x y) mask)
	// result: (VPSLLQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSHRDQ256 [a] x y) mask)
	// result: (VPSHRDQMasked256 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDQ256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDQMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSRAQ256 x y) mask)
	// result: (VPSRAQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSRLQ256 x y) mask)
	// result: (VPSRLQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSHLDVQ256 x y z) mask)
	// result: (VPSHLDVQMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDVQ256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDVQMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSLLVQ256 x y) mask)
	// result: (VPSLLVQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLVQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLVQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSHRDVQ256 x y z) mask)
	// result: (VPSHRDVQMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDVQ256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDVQMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSRAVQ256 x y) mask)
	// result: (VPSRAVQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAVQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAVQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSRLVQ256 x y) mask)
	// result: (VPSRLVQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLVQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLVQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VSQRTPD256 x) mask)
	// result: (VSQRTPDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSQRTPD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSQRTPDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VSUBPD256 x y) mask)
	// result: (VSUBPDMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSUBPD256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSUBPDMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSUBQ256 x y) mask)
	// result: (VPSUBQMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBQ256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBQMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVQB128_256 x) mask)
	// result: (VPMOVQBMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVQB128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVQBMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVQW128_256 x) mask)
	// result: (VPMOVQWMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVQW128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVQWMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVQD128_256 x) mask)
	// result: (VPMOVQDMasked128_256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVQD128_256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVQDMasked128_256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPMOVQD256 x) mask)
	// result: (VPMOVQDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVQD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVQDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSLLQ256const [a] x) mask)
	// result: (VPSLLQMasked256const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLQ256const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLQMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSRAQ256const [a] x) mask)
	// result: (VPSRAQMasked256const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAQ256const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAQMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked256 (VPSRLQ256const [a] x) mask)
	// result: (VPSRLQMasked256const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLQ256const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLQMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU64Masked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU64Masked512 (VPABSQ512 x) mask)
	// result: (VPABSQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VADDPD512 x y) mask)
	// result: (VADDPDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VADDPD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VADDPDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPADDQ512 x y) mask)
	// result: (VPADDQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPANDQ512 x y) mask)
	// result: (VPANDQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPANDQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPANDQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPANDNQ512 x y) mask)
	// result: (VPANDNQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPANDNQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPANDNQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VRNDSCALEPD512 [a] x) mask)
	// result: (VRNDSCALEPDMasked512 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRNDSCALEPD512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRNDSCALEPDMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VREDUCEPD512 [a] x) mask)
	// result: (VREDUCEPDMasked512 [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VREDUCEPD512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VREDUCEPDMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPERMI2PD512 x y z) mask)
	// result: (VPERMI2PDMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2PD512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2PDMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPERMI2Q512 x y z) mask)
	// result: (VPERMI2QMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2Q512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2QMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VCVTQQ2PD512 x) mask)
	// result: (VCVTQQ2PDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTQQ2PD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTQQ2PDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VCVTUQQ2PD512 x) mask)
	// result: (VCVTUQQ2PDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTUQQ2PD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTUQQ2PDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VCVTTPD2QQ512 x) mask)
	// result: (VCVTTPD2QQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2QQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2QQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VCVTTPD2UQQ512 x) mask)
	// result: (VCVTTPD2UQQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VCVTTPD2UQQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VDIVPD512 x y) mask)
	// result: (VDIVPDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VDIVPD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VDIVPDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPLZCNTQ512 x) mask)
	// result: (VPLZCNTQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPLZCNTQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPLZCNTQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VMAXPD512 x y) mask)
	// result: (VMAXPDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMAXPD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMAXPDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMAXSQ512 x y) mask)
	// result: (VPMAXSQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMAXUQ512 x y) mask)
	// result: (VPMAXUQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VMINPD512 x y) mask)
	// result: (VMINPDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMINPD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMINPDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMINSQ512 x y) mask)
	// result: (VPMINSQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMINUQ512 x y) mask)
	// result: (VPMINUQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VFMADDSUB213PD512 x y z) mask)
	// result: (VFMADDSUB213PDMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADDSUB213PD512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADDSUB213PDMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VFMADD213PD512 x y z) mask)
	// result: (VFMADD213PDMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMADD213PD512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMADD213PDMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VFMSUBADD213PD512 x y z) mask)
	// result: (VFMSUBADD213PDMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VFMSUBADD213PD512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VFMSUBADD213PDMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VMULPD512 x y) mask)
	// result: (VMULPDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VMULPD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VMULPDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMULLQ512 x y) mask)
	// result: (VPMULLQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMULLQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMULLQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPOPCNTQ512 x) mask)
	// result: (VPOPCNTQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPORQ512 x y) mask)
	// result: (VPORQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPORQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPORQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPERMPD512 x y) mask)
	// result: (VPERMPDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMPD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMPDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPERMQ512 x y) mask)
	// result: (VPERMQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VRCP14PD512 x) mask)
	// result: (VRCP14PDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRCP14PD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRCP14PDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VRSQRT14PD512 x) mask)
	// result: (VRSQRT14PDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VRSQRT14PD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VRSQRT14PDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPROLVQ512 x y) mask)
	// result: (VPROLVQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPROLVQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPROLVQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPRORVQ512 x y) mask)
	// result: (VPRORVQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPRORVQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPRORVQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMOVSQB128_512 x) mask)
	// result: (VPMOVSQBMasked128_512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSQB128_512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSQBMasked128_512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMOVSQW128_512 x) mask)
	// result: (VPMOVSQWMasked128_512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSQW128_512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSQWMasked128_512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMOVUSQB128_512 x) mask)
	// result: (VPMOVUSQBMasked128_512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSQB128_512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSQBMasked128_512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMOVUSQW128_512 x) mask)
	// result: (VPMOVUSQWMasked128_512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVUSQW128_512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVUSQWMasked128_512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VSCALEFPD512 x y) mask)
	// result: (VSCALEFPDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSCALEFPD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSCALEFPDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSHLDQ512 [a] x y) mask)
	// result: (VPSHLDQMasked512 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDQ512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDQMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSLLQ512 x y) mask)
	// result: (VPSLLQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSHRDQ512 [a] x y) mask)
	// result: (VPSHRDQMasked512 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDQ512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDQMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSRAQ512 x y) mask)
	// result: (VPSRAQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSRLQ512 x y) mask)
	// result: (VPSRLQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSHLDVQ512 x y z) mask)
	// result: (VPSHLDVQMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHLDVQ512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHLDVQMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSLLVQ512 x y) mask)
	// result: (VPSLLVQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLVQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLVQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSHRDVQ512 x y z) mask)
	// result: (VPSHRDVQMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHRDVQ512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHRDVQMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSRAVQ512 x y) mask)
	// result: (VPSRAVQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAVQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAVQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSRLVQ512 x y) mask)
	// result: (VPSRLVQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLVQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLVQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VSQRTPD512 x) mask)
	// result: (VSQRTPDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSQRTPD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSQRTPDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VSUBPD512 x y) mask)
	// result: (VSUBPDMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VSUBPD512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VSUBPDMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSUBQ512 x y) mask)
	// result: (VPSUBQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMOVQB128_512 x) mask)
	// result: (VPMOVQBMasked128_512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVQB128_512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVQBMasked128_512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPMOVQW128_512 x) mask)
	// result: (VPMOVQWMasked128_512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVQW128_512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVQWMasked128_512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPXORQ512 x y) mask)
	// result: (VPXORQMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPXORQ512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPXORQMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSLLQ512const [a] x) mask)
	// result: (VPSLLQMasked512const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSLLQ512const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSLLQMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSRAQ512const [a] x) mask)
	// result: (VPSRAQMasked512const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRAQ512const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRAQMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU64Masked512 (VPSRLQ512const [a] x) mask)
	// result: (VPSRLQMasked512const [a] x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSRLQ512const {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSRLQMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU8Masked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU8Masked128 (VPABSB128 x) mask)
	// result: (VPABSBMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSB128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSBMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPADDB128 x y) mask)
	// result: (VPADDBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPADDSB128 x y) mask)
	// result: (VPADDSBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDSB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDSBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPADDUSB128 x y) mask)
	// result: (VPADDUSBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDUSB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDUSBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPAVGB128 x y) mask)
	// result: (VPAVGBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPAVGB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPAVGBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPERMI2B128 x y z) mask)
	// result: (VPERMI2BMasked128 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2B128 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2BMasked128)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPALIGNR128 [a] x y) mask)
	// result: (VPALIGNRMasked128 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPALIGNR128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPALIGNRMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPMOVSXBQ128 x) mask)
	// result: (VPMOVSXBQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXBQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXBQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPMOVZXBQ128 x) mask)
	// result: (VPMOVZXBQMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXBQ128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXBQMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPMOVSXBD128 x) mask)
	// result: (VPMOVSXBDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXBD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXBDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPMOVZXBD128 x) mask)
	// result: (VPMOVZXBDMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXBD128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXBDMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPMOVSXBW128 x) mask)
	// result: (VPMOVSXBWMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXBW128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXBWMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPMOVZXBW128 x) mask)
	// result: (VPMOVZXBWMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXBW128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXBWMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VGF2P8AFFINEINVQB128 [a] x y) mask)
	// result: (VGF2P8AFFINEINVQBMasked128 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VGF2P8AFFINEINVQB128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEINVQBMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VGF2P8AFFINEQB128 [a] x y) mask)
	// result: (VGF2P8AFFINEQBMasked128 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VGF2P8AFFINEQB128 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEQBMasked128)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VGF2P8MULB128 x y) mask)
	// result: (VGF2P8MULBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VGF2P8MULB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VGF2P8MULBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPMAXSB128 x y) mask)
	// result: (VPMAXSBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPMAXUB128 x y) mask)
	// result: (VPMAXUBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPMINSB128 x y) mask)
	// result: (VPMINSBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPMINUB128 x y) mask)
	// result: (VPMINUBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPOPCNTB128 x) mask)
	// result: (VPOPCNTBMasked128 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTB128 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTBMasked128)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPERMB128 x y) mask)
	// result: (VPERMBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPSHUFB128 x y) mask)
	// result: (VPSHUFBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPSUBB128 x y) mask)
	// result: (VPSUBBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPSUBSB128 x y) mask)
	// result: (VPSUBSBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBSB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBSBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked128 (VPSUBUSB128 x y) mask)
	// result: (VPSUBUSBMasked128 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBUSB128 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBUSBMasked128)
		v.AddArg3(x, y, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU8Masked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU8Masked256 (VPABSB256 x) mask)
	// result: (VPABSBMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSB256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSBMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPADDB256 x y) mask)
	// result: (VPADDBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPADDSB256 x y) mask)
	// result: (VPADDSBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDSB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDSBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPADDUSB256 x y) mask)
	// result: (VPADDUSBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDUSB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDUSBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPAVGB256 x y) mask)
	// result: (VPAVGBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPAVGB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPAVGBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPERMI2B256 x y z) mask)
	// result: (VPERMI2BMasked256 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2B256 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2BMasked256)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPALIGNR256 [a] x y) mask)
	// result: (VPALIGNRMasked256 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPALIGNR256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPALIGNRMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPMOVSXBQ256 x) mask)
	// result: (VPMOVSXBQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXBQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXBQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPMOVZXBQ256 x) mask)
	// result: (VPMOVZXBQMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXBQ256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXBQMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPMOVSXBD256 x) mask)
	// result: (VPMOVSXBDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXBD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXBDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPMOVZXBD256 x) mask)
	// result: (VPMOVZXBDMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXBD256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXBDMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPMOVSXBW256 x) mask)
	// result: (VPMOVSXBWMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXBW256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXBWMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPMOVZXBW256 x) mask)
	// result: (VPMOVZXBWMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXBW256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXBWMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VGF2P8AFFINEINVQB256 [a] x y) mask)
	// result: (VGF2P8AFFINEINVQBMasked256 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VGF2P8AFFINEINVQB256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEINVQBMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VGF2P8AFFINEQB256 [a] x y) mask)
	// result: (VGF2P8AFFINEQBMasked256 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VGF2P8AFFINEQB256 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEQBMasked256)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VGF2P8MULB256 x y) mask)
	// result: (VGF2P8MULBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VGF2P8MULB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VGF2P8MULBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPMAXSB256 x y) mask)
	// result: (VPMAXSBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPMAXUB256 x y) mask)
	// result: (VPMAXUBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPMINSB256 x y) mask)
	// result: (VPMINSBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPMINUB256 x y) mask)
	// result: (VPMINUBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPOPCNTB256 x) mask)
	// result: (VPOPCNTBMasked256 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTB256 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTBMasked256)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPERMB256 x y) mask)
	// result: (VPERMBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPSHUFB256 x y) mask)
	// result: (VPSHUFBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPSUBB256 x y) mask)
	// result: (VPSUBBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPSUBSB256 x y) mask)
	// result: (VPSUBSBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBSB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBSBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked256 (VPSUBUSB256 x y) mask)
	// result: (VPSUBUSBMasked256 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBUSB256 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBUSBMasked256)
		v.AddArg3(x, y, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQU8Masked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQU8Masked512 (VPABSB512 x) mask)
	// result: (VPABSBMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPABSB512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPABSBMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPADDB512 x y) mask)
	// result: (VPADDBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPADDSB512 x y) mask)
	// result: (VPADDSBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDSB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDSBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPADDUSB512 x y) mask)
	// result: (VPADDUSBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPADDUSB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPADDUSBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPAVGB512 x y) mask)
	// result: (VPAVGBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPAVGB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPAVGBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPERMI2B512 x y z) mask)
	// result: (VPERMI2BMasked512 x y z mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMI2B512 {
			break
		}
		z := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMI2BMasked512)
		v.AddArg4(x, y, z, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPALIGNR512 [a] x y) mask)
	// result: (VPALIGNRMasked512 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPALIGNR512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPALIGNRMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPMOVSXBQ512 x) mask)
	// result: (VPMOVSXBQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXBQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXBQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPMOVZXBQ512 x) mask)
	// result: (VPMOVZXBQMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXBQ512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXBQMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPMOVSXBW512 x) mask)
	// result: (VPMOVSXBWMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXBW512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXBWMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPMOVSXBD512 x) mask)
	// result: (VPMOVSXBDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVSXBD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVSXBDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPMOVZXBW512 x) mask)
	// result: (VPMOVZXBWMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXBW512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXBWMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPMOVZXBD512 x) mask)
	// result: (VPMOVZXBDMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVZXBD512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMOVZXBDMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VGF2P8AFFINEINVQB512 [a] x y) mask)
	// result: (VGF2P8AFFINEINVQBMasked512 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VGF2P8AFFINEINVQB512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEINVQBMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VGF2P8AFFINEQB512 [a] x y) mask)
	// result: (VGF2P8AFFINEQBMasked512 [a] x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VGF2P8AFFINEQB512 {
			break
		}
		a := ssa.AuxIntToUint8(v_0.AuxInt)
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VGF2P8AFFINEQBMasked512)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VGF2P8MULB512 x y) mask)
	// result: (VGF2P8MULBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VGF2P8MULB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VGF2P8MULBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPMAXSB512 x y) mask)
	// result: (VPMAXSBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXSB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXSBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPMAXUB512 x y) mask)
	// result: (VPMAXUBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMAXUB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMAXUBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPMINSB512 x y) mask)
	// result: (VPMINSBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINSB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINSBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPMINUB512 x y) mask)
	// result: (VPMINUBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPMINUB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPMINUBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPOPCNTB512 x) mask)
	// result: (VPOPCNTBMasked512 x mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPOPCNTB512 {
			break
		}
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPOPCNTBMasked512)
		v.AddArg2(x, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPERMB512 x y) mask)
	// result: (VPERMBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPERMB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPERMBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPSHUFB512 x y) mask)
	// result: (VPSHUFBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSHUFB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSHUFBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPSUBB512 x y) mask)
	// result: (VPSUBBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPSUBSB512 x y) mask)
	// result: (VPSUBSBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBSB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBSBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	// match: (VMOVDQU8Masked512 (VPSUBUSB512 x y) mask)
	// result: (VPSUBUSBMasked512 x y mask)
	for {
		if v_0.Op != ssaop.OpAMD64VPSUBUSB512 {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		mask := v_1
		v.Reset(ssaop.OpAMD64VPSUBUSBMasked512)
		v.AddArg3(x, y, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQUload128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQUload128 [off1] {sym} x:(ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (VMOVDQUload128 [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		ptr := x.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUload128)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (VMOVDQUload128 [off1] {sym1} x:(LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (VMOVDQUload128 [off1+off2] {ssa.MergeSym(sym1, sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		sym2 := ssa.AuxToSym(x.Aux)
		base := x.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUload128)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQUload256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQUload256 [off1] {sym} x:(ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (VMOVDQUload256 [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		ptr := x.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUload256)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (VMOVDQUload256 [off1] {sym1} x:(LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (VMOVDQUload256 [off1+off2] {ssa.MergeSym(sym1, sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		sym2 := ssa.AuxToSym(x.Aux)
		base := x.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUload256)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQUload512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQUload512 [off1] {sym} x:(ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (VMOVDQUload512 [off1+off2] {sym} ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		ptr := x.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUload512)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (VMOVDQUload512 [off1] {sym1} x:(LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (VMOVDQUload512 [off1+off2] {ssa.MergeSym(sym1, sym2)} base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		sym2 := ssa.AuxToSym(x.Aux)
		base := x.Args[0]
		mem := v_1
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUload512)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQUstore128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQUstore128 [off1] {sym} x:(ADDQconst [off2] ptr) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (VMOVDQUstore128 [off1+off2] {sym} ptr val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		ptr := x.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUstore128)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (VMOVDQUstore128 [off1] {sym1} x:(LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (VMOVDQUstore128 [off1+off2] {ssa.MergeSym(sym1, sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		sym2 := ssa.AuxToSym(x.Aux)
		base := x.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUstore128)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQUstore256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQUstore256 [off1] {sym} x:(ADDQconst [off2] ptr) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (VMOVDQUstore256 [off1+off2] {sym} ptr val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		ptr := x.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUstore256)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (VMOVDQUstore256 [off1] {sym1} x:(LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (VMOVDQUstore256 [off1+off2] {ssa.MergeSym(sym1, sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		sym2 := ssa.AuxToSym(x.Aux)
		base := x.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUstore256)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVDQUstore512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMOVDQUstore512 [off1] {sym} x:(ADDQconst [off2] ptr) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (VMOVDQUstore512 [off1+off2] {sym} ptr val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		ptr := x.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUstore512)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (VMOVDQUstore512 [off1] {sym1} x:(LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (VMOVDQUstore512 [off1+off2] {ssa.MergeSym(sym1, sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		x := v_0
		if x.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(x.AuxInt)
		sym2 := ssa.AuxToSym(x.Aux)
		base := x.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUstore512)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVQ(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (VMOVQ x:(MOVQload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (VMOVQload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVQload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64VMOVQload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVSDf2v(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (VMOVSDf2v x:(MOVSDload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (VMOVSDload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVSDload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64VMOVSDload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (VMOVSDf2v x:(MOVSDconst [c] ))
	// result: (VMOVSDconst [c] )
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVSDconst {
			break
		}
		c := ssa.AuxIntToFloat64(x.AuxInt)
		v.Reset(ssaop.OpAMD64VMOVSDconst)
		v.AuxInt = ssa.Float64ToAuxInt(c)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMOVSSf2v(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (VMOVSSf2v x:(MOVSSload [off] {sym} ptr mem))
	// cond: x.Uses == 1 && ssa.Clobber(x)
	// result: @x.Block (VMOVSSload <v.Type> [off] {sym} ptr mem)
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVSSload {
			break
		}
		off := ssa.AuxIntToInt32(x.AuxInt)
		sym := ssa.AuxToSym(x.Aux)
		mem := x.Args[1]
		ptr := x.Args[0]
		if !(x.Uses == 1 && ssa.Clobber(x)) {
			break
		}
		b = x.Block
		v0 := b.NewValue0(x.Pos, ssaop.OpAMD64VMOVSSload, v.Type)
		v.CopyOf(v0)
		v0.AuxInt = ssa.Int32ToAuxInt(off)
		v0.Aux = ssa.SymToAux(sym)
		v0.AddArg2(ptr, mem)
		return true
	}
	// match: (VMOVSSf2v x:(MOVSSconst [c] ))
	// result: (VMOVSSconst [c] )
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64MOVSSconst {
			break
		}
		c := ssa.AuxIntToFloat32(x.AuxInt)
		v.Reset(ssaop.OpAMD64VMOVSSconst)
		v.AuxInt = ssa.Float32ToAuxInt(c)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VMULPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPS128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPS128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPS128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPS256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPS256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPS512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPS512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPS512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPS512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPSMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPSMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPSMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPSMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPSMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPSMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPSMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPSMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VMULPSMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VMULPSMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VMULPSMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMULPSMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPABSB128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPABSB128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSB128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSB256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPABSB256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSB256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSBMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPABSBMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSBMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSBMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSBMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPABSBMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSBMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSBMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPABSD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPABSD256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPABSD512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPABSDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPABSDMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPABSDMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPABSQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPABSQ256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPABSQ512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPABSQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPABSQMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPABSQMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSW128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPABSW128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSW128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSW256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPABSW256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSW256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSWMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPABSWMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSWMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPABSWMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPABSWMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPABSWMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKSSDW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKSSDW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKSSDW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKSSDW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKSSDW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKSSDW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKSSDW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKSSDW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKSSDW512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKSSDW512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKSSDW512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKSSDW512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKSSDWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKSSDWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKSSDWMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKSSDWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKSSDWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKSSDWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKSSDWMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKSSDWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKSSDWMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKSSDWMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKSSDWMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKSSDWMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKUSDW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKUSDW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKUSDW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKUSDW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKUSDW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKUSDW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKUSDW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKUSDW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKUSDW512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKUSDW512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKUSDW512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKUSDW512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKUSDWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKUSDWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKUSDWMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKUSDWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKUSDWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKUSDWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKUSDWMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKUSDWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPACKUSDWMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPACKUSDWMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPACKUSDWMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKUSDWMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPADDB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDB128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDB128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDB256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDB256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDBMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDBMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDBMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDBMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDQ128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDQ128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDQ256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDQ256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDQ512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDQ512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDQMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDQMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDQMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDQMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDQMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDQMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDSB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDSB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDSB128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDSB128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDSB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDSB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDSB256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDSB256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDSBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDSBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDSBMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDSBMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDSBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDSBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDSBMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDSBMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDSW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDSW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDSW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDSW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDSW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDSW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDSW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDSW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDSWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDSWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDSWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDSWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDSWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDSWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDSWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDSWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDUSB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDUSB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDUSB128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDUSB128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDUSB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDUSB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDUSB256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDUSB256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDUSBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDUSBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDUSBMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDUSBMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDUSBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDUSBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDUSBMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDUSBMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDUSW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDUSW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDUSW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDUSW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDUSW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDUSW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDUSW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDUSW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDUSWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDUSWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDUSWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDUSWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDUSWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDUSWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDUSWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDUSWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPADDWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPADDWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPADDWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPADDWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPALIGNR128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPALIGNR128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPALIGNR128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPALIGNR128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPALIGNR256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPALIGNR256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPALIGNR256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPALIGNR256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPALIGNRMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPALIGNRMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPALIGNRMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPALIGNRMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPALIGNRMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPALIGNRMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPALIGNRMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPALIGNRMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPAND128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (VPAND128 (VPMOVMToVec8x16 x) (VPMOVMToVec8x16 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec8x16 (KANDW x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x16 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x16 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec8x16)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDW, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPAND128 (VPMOVMToVec16x8 x) (VPMOVMToVec16x8 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec16x8 (KANDB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x8 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x8 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec16x8)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPAND128 (VPMOVMToVec32x4 x) (VPMOVMToVec32x4 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec32x4 (KANDB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x4 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x4 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec32x4)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPAND128 (VPMOVMToVec64x2 x) (VPMOVMToVec64x2 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec64x2 (KANDB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x2 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x2 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec64x2)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPAND128 x (VPMOVMToVec8x16 k))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMOVDQU8Masked128 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x16 {
				continue
			}
			k := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMOVDQU8Masked128)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPAND128 x (VPMOVMToVec16x8 k))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMOVDQU16Masked128 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x8 {
				continue
			}
			k := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMOVDQU16Masked128)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPAND128 x (VPMOVMToVec32x4 k))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMOVDQU32Masked128 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x4 {
				continue
			}
			k := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMOVDQU32Masked128)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPAND128 x (VPMOVMToVec64x2 k))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMOVDQU64Masked128 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x2 {
				continue
			}
			k := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMOVDQU64Masked128)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPAND128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPAND128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPAND128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPAND256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (VPAND256 (VPMOVMToVec8x32 x) (VPMOVMToVec8x32 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec8x32 (KANDD x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x32 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x32 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec8x32)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDD, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPAND256 (VPMOVMToVec16x16 x) (VPMOVMToVec16x16 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec16x16 (KANDW x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x16 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x16 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec16x16)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDW, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPAND256 (VPMOVMToVec32x8 x) (VPMOVMToVec32x8 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec32x8 (KANDB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x8 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x8 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec32x8)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPAND256 (VPMOVMToVec64x4 x) (VPMOVMToVec64x4 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec64x4 (KANDB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x4 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x4 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec64x4)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPAND256 x (VPMOVMToVec8x32 k))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMOVDQU8Masked256 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x32 {
				continue
			}
			k := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMOVDQU8Masked256)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPAND256 x (VPMOVMToVec16x16 k))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMOVDQU16Masked256 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x16 {
				continue
			}
			k := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMOVDQU16Masked256)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPAND256 x (VPMOVMToVec32x8 k))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMOVDQU32Masked256 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x8 {
				continue
			}
			k := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMOVDQU32Masked256)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPAND256 x (VPMOVMToVec64x4 k))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMOVDQU64Masked256 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x4 {
				continue
			}
			k := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VMOVDQU64Masked256)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPAND256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPAND256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPAND256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPANDD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (VPANDD512 (VPMOVMToVec8x64 x) (VPMOVMToVec8x64 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec8x64 (KANDQ x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x64 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x64 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDQ, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPANDD512 (VPMOVMToVec16x32 x) (VPMOVMToVec16x32 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec16x32 (KANDD x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x32 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x32 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDD, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPANDD512 (VPMOVMToVec32x16 x) (VPMOVMToVec32x16 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec32x16 (KANDW x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDW, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPANDD512 (VPMOVMToVec64x8 x) (VPMOVMToVec64x8 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec64x8 (KANDB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KANDB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPANDD512 x (VPMOVMToVec64x8 k))
	// result: (VMOVDQU64Masked512 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
				continue
			}
			k := v_1.Args[0]
			v.Reset(ssaop.OpAMD64VMOVDQU64Masked512)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPANDD512 x (VPMOVMToVec32x16 k))
	// result: (VMOVDQU32Masked512 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
				continue
			}
			k := v_1.Args[0]
			v.Reset(ssaop.OpAMD64VMOVDQU32Masked512)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPANDD512 x (VPMOVMToVec16x32 k))
	// result: (VMOVDQU16Masked512 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x32 {
				continue
			}
			k := v_1.Args[0]
			v.Reset(ssaop.OpAMD64VMOVDQU16Masked512)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPANDD512 x (VPMOVMToVec8x64 k))
	// result: (VMOVDQU8Masked512 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x64 {
				continue
			}
			k := v_1.Args[0]
			v.Reset(ssaop.OpAMD64VMOVDQU8Masked512)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPANDD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPANDD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPANDDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPANDDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPANDDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPANDDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPANDDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPANDDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPANDN128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDN128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDN128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPANDN128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPANDN256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDN256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDN256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPANDN256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPANDND512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDND512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDND512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPANDND512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPANDNDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDNDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDNDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPANDNDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPANDNDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDNDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDNDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPANDNDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPANDNDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDNDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDNDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPANDNDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPANDNQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDNQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDNQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPANDNQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPANDNQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDNQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDNQMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPANDNQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPANDNQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDNQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDNQMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPANDNQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPANDNQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDNQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDNQMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPANDNQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPANDQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDQ512 x (VPMOVMToVec64x8 k))
	// result: (VMOVDQU64Masked512 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
				continue
			}
			k := v_1.Args[0]
			v.Reset(ssaop.OpAMD64VMOVDQU64Masked512)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPANDQ512 x (VPMOVMToVec32x16 k))
	// result: (VMOVDQU32Masked512 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
				continue
			}
			k := v_1.Args[0]
			v.Reset(ssaop.OpAMD64VMOVDQU32Masked512)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPANDQ512 x (VPMOVMToVec16x32 k))
	// result: (VMOVDQU16Masked512 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x32 {
				continue
			}
			k := v_1.Args[0]
			v.Reset(ssaop.OpAMD64VMOVDQU16Masked512)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPANDQ512 x (VPMOVMToVec8x64 k))
	// result: (VMOVDQU8Masked512 x k)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x64 {
				continue
			}
			k := v_1.Args[0]
			v.Reset(ssaop.OpAMD64VMOVDQU8Masked512)
			v.AddArg2(x, k)
			return true
		}
		break
	}
	// match: (VPANDQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDQ512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPANDQ512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPANDQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDQMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPANDQMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPANDQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDQMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPANDQMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPANDQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPANDQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPANDQMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPANDQMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPAVGB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPAVGB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPAVGB128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPAVGB128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPAVGB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPAVGB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPAVGB256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPAVGB256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPAVGBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPAVGBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPAVGBMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPAVGBMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPAVGBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPAVGBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPAVGBMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPAVGBMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPAVGW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPAVGW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPAVGW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPAVGW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPAVGW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPAVGW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPAVGW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPAVGW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPAVGWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPAVGWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPAVGWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPAVGWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPAVGWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPAVGWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPAVGWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPAVGWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPBLENDMBMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBLENDMBMasked512 dst (VGF2P8MULB512 x y) mask)
	// result: (VGF2P8MULBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VGF2P8MULB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VGF2P8MULBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPABSB512 x) mask)
	// result: (VPABSBMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSB512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPABSBMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPADDB512 x y) mask)
	// result: (VPADDBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPADDBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPADDSB512 x y) mask)
	// result: (VPADDSBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDSB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPADDSBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPADDUSB512 x y) mask)
	// result: (VPADDUSBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDUSB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPADDUSBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPAVGB512 x y) mask)
	// result: (VPAVGBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPAVGB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPAVGBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPMAXSB512 x y) mask)
	// result: (VPMAXSBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMAXSBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPMAXUB512 x y) mask)
	// result: (VPMAXUBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMAXUBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPMINSB512 x y) mask)
	// result: (VPMINSBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMINSBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPMINUB512 x y) mask)
	// result: (VPMINUBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMINUBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPOPCNTB512 x) mask)
	// result: (VPOPCNTBMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTB512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPOPCNTBMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPSHUFB512 x y) mask)
	// result: (VPSHUFBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSHUFBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPSUBB512 x y) mask)
	// result: (VPSUBBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSUBBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPSUBSB512 x y) mask)
	// result: (VPSUBSBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBSB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSUBSBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMBMasked512 dst (VPSUBUSB512 x y) mask)
	// result: (VPSUBUSBMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBUSB512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSUBUSBMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBLENDMDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBLENDMDMasked512 dst (VADDPS512 x y) mask)
	// result: (VADDPSMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VADDPS512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VADDPSMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VCVTDQ2PS512 x) mask)
	// result: (VCVTDQ2PSMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTDQ2PS512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTDQ2PSMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VCVTTPS2DQ512 x) mask)
	// result: (VCVTTPS2DQMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPS2DQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTTPS2DQMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VCVTTPS2UDQ512 x) mask)
	// result: (VCVTTPS2UDQMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPS2UDQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VCVTUDQ2PS512 x) mask)
	// result: (VCVTUDQ2PSMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUDQ2PS512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTUDQ2PSMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VDIVPS512 x y) mask)
	// result: (VDIVPSMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VDIVPS512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VDIVPSMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VMAXPS512 x y) mask)
	// result: (VMAXPSMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMAXPS512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VMAXPSMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VMINPS512 x y) mask)
	// result: (VMINPSMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMINPS512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VMINPSMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VMULPS512 x y) mask)
	// result: (VMULPSMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMULPS512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VMULPSMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPABSD512 x) mask)
	// result: (VPABSDMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPABSDMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPACKSSDW512 x y) mask)
	// result: (VPACKSSDWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPACKSSDW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPACKSSDWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPACKUSDW512 x y) mask)
	// result: (VPACKUSDWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPACKUSDW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPACKUSDWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPADDD512 x y) mask)
	// result: (VPADDDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPADDDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPANDD512 x y) mask)
	// result: (VPANDDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPANDD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPANDDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPLZCNTD512 x) mask)
	// result: (VPLZCNTDMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPLZCNTD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPLZCNTDMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMAXSD512 x y) mask)
	// result: (VPMAXSDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMAXSDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMAXUD512 x y) mask)
	// result: (VPMAXUDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMAXUDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMINSD512 x y) mask)
	// result: (VPMINSDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMINSDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMINUD512 x y) mask)
	// result: (VPMINUDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMINUDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMOVDB128_512 x) mask)
	// result: (VPMOVDBMasked128_512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVDB128_512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVDBMasked128_512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMOVDW256 x) mask)
	// result: (VPMOVDWMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVDW256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVDWMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMOVSDB128_512 x) mask)
	// result: (VPMOVSDBMasked128_512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSDB128_512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVSDBMasked128_512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMOVSDW256 x) mask)
	// result: (VPMOVSDWMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSDW256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVSDWMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMOVUSDB128_512 x) mask)
	// result: (VPMOVUSDBMasked128_512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSDB128_512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVUSDBMasked128_512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMOVUSDW256 x) mask)
	// result: (VPMOVUSDWMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSDW256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVUSDWMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPMULLD512 x y) mask)
	// result: (VPMULLDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULLD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMULLDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPOPCNTD512 x) mask)
	// result: (VPOPCNTDMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPOPCNTDMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPORD512 x y) mask)
	// result: (VPORDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPORD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPORDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPROLVD512 x y) mask)
	// result: (VPROLVDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPROLVD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPROLVDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPRORVD512 x y) mask)
	// result: (VPRORVDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPRORVD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPRORVDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPSHUFD512 [a] x) mask)
	// result: (VPSHUFDMasked512Merging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFD512 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSHUFDMasked512Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPSLLD512const [a] x) mask)
	// result: (VPSLLDMasked512constMerging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLD512const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLDMasked512constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPSLLVD512 x y) mask)
	// result: (VPSLLVDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLVD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLVDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPSRAD512const [a] x) mask)
	// result: (VPSRADMasked512constMerging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAD512const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRADMasked512constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPSRAVD512 x y) mask)
	// result: (VPSRAVDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAVD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAVDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPSRLD512const [a] x) mask)
	// result: (VPSRLDMasked512constMerging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLD512const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLDMasked512constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPSRLVD512 x y) mask)
	// result: (VPSRLVDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLVD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLVDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPSUBD512 x y) mask)
	// result: (VPSUBDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSUBDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VPXORD512 x y) mask)
	// result: (VPXORDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPXORD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPXORDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VRCP14PS512 x) mask)
	// result: (VRCP14PSMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRCP14PS512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VRCP14PSMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VREDUCEPS512 [a] x) mask)
	// result: (VREDUCEPSMasked512Merging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VREDUCEPS512 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VREDUCEPSMasked512Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VRNDSCALEPS512 [a] x) mask)
	// result: (VRNDSCALEPSMasked512Merging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRNDSCALEPS512 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VRNDSCALEPSMasked512Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VRSQRT14PS512 x) mask)
	// result: (VRSQRT14PSMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRSQRT14PS512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VRSQRT14PSMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VSCALEFPS512 x y) mask)
	// result: (VSCALEFPSMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSCALEFPS512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VSCALEFPSMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VSQRTPS512 x) mask)
	// result: (VSQRTPSMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSQRTPS512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VSQRTPSMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 dst (VSUBPS512 x y) mask)
	// result: (VSUBPSMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSUBPS512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VSUBPSMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBLENDMDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBLENDMDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBLENDMQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBLENDMQMasked512 dst (VADDPD512 x y) mask)
	// result: (VADDPDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VADDPD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VADDPDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VCVTPD2PS256 x) mask)
	// result: (VCVTPD2PSMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTPD2PS256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTPD2PSMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VCVTQQ2PD512 x) mask)
	// result: (VCVTQQ2PDMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTQQ2PD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTQQ2PDMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VCVTQQ2PS256 x) mask)
	// result: (VCVTQQ2PSMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTQQ2PS256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTQQ2PSMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VCVTTPD2DQ256 x) mask)
	// result: (VCVTTPD2DQMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2DQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTTPD2DQMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VCVTTPD2QQ512 x) mask)
	// result: (VCVTTPD2QQMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2QQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTTPD2QQMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VCVTTPD2UDQ256 x) mask)
	// result: (VCVTTPD2UDQMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2UDQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VCVTTPD2UQQ512 x) mask)
	// result: (VCVTTPD2UQQMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2UQQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VCVTUQQ2PD512 x) mask)
	// result: (VCVTUQQ2PDMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUQQ2PD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTUQQ2PDMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VCVTUQQ2PS256 x) mask)
	// result: (VCVTUQQ2PSMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUQQ2PS256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VDIVPD512 x y) mask)
	// result: (VDIVPDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VDIVPD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VDIVPDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VMAXPD512 x y) mask)
	// result: (VMAXPDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMAXPD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VMAXPDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VMINPD512 x y) mask)
	// result: (VMINPDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMINPD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VMINPDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VMULPD512 x y) mask)
	// result: (VMULPDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMULPD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VMULPDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPABSQ512 x) mask)
	// result: (VPABSQMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPABSQMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPADDQ512 x y) mask)
	// result: (VPADDQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPADDQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPANDQ512 x y) mask)
	// result: (VPANDQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPANDQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPANDQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPLZCNTQ512 x) mask)
	// result: (VPLZCNTQMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPLZCNTQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPLZCNTQMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMAXSQ512 x y) mask)
	// result: (VPMAXSQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMAXSQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMAXUQ512 x y) mask)
	// result: (VPMAXUQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMAXUQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMINSQ512 x y) mask)
	// result: (VPMINSQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMINSQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMINUQ512 x y) mask)
	// result: (VPMINUQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMINUQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMOVQB128_512 x) mask)
	// result: (VPMOVQBMasked128_512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVQB128_512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVQBMasked128_512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMOVQD256 x) mask)
	// result: (VPMOVQDMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVQD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVQDMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMOVQW128_512 x) mask)
	// result: (VPMOVQWMasked128_512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVQW128_512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVQWMasked128_512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMOVSQB128_512 x) mask)
	// result: (VPMOVSQBMasked128_512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSQB128_512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVSQBMasked128_512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMOVSQD256 x) mask)
	// result: (VPMOVSQDMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSQD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVSQDMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMOVSQW128_512 x) mask)
	// result: (VPMOVSQWMasked128_512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSQW128_512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVSQWMasked128_512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMOVUSQB128_512 x) mask)
	// result: (VPMOVUSQBMasked128_512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSQB128_512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVUSQBMasked128_512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMOVUSQD256 x) mask)
	// result: (VPMOVUSQDMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSQD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVUSQDMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMOVUSQW128_512 x) mask)
	// result: (VPMOVUSQWMasked128_512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSQW128_512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVUSQWMasked128_512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPMULLQ512 x y) mask)
	// result: (VPMULLQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULLQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMULLQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPOPCNTQ512 x) mask)
	// result: (VPOPCNTQMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPOPCNTQMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPORQ512 x y) mask)
	// result: (VPORQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPORQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPORQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPROLVQ512 x y) mask)
	// result: (VPROLVQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPROLVQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPROLVQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPRORVQ512 x y) mask)
	// result: (VPRORVQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPRORVQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPRORVQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPSLLQ512const [a] x) mask)
	// result: (VPSLLQMasked512constMerging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLQ512const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLQMasked512constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPSLLVQ512 x y) mask)
	// result: (VPSLLVQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLVQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLVQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPSRAQ512const [a] x) mask)
	// result: (VPSRAQMasked512constMerging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAQ512const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAQMasked512constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPSRAVQ512 x y) mask)
	// result: (VPSRAVQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAVQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAVQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPSRLQ512const [a] x) mask)
	// result: (VPSRLQMasked512constMerging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLQ512const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLQMasked512constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPSRLVQ512 x y) mask)
	// result: (VPSRLVQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLVQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLVQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPSUBQ512 x y) mask)
	// result: (VPSUBQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSUBQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VPXORQ512 x y) mask)
	// result: (VPXORQMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPXORQ512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPXORQMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VRCP14PD512 x) mask)
	// result: (VRCP14PDMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRCP14PD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VRCP14PDMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VREDUCEPD512 [a] x) mask)
	// result: (VREDUCEPDMasked512Merging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VREDUCEPD512 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VREDUCEPDMasked512Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VRNDSCALEPD512 [a] x) mask)
	// result: (VRNDSCALEPDMasked512Merging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRNDSCALEPD512 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VRNDSCALEPDMasked512Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VRSQRT14PD512 x) mask)
	// result: (VRSQRT14PDMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRSQRT14PD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VRSQRT14PDMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VSCALEFPD512 x y) mask)
	// result: (VSCALEFPDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSCALEFPD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VSCALEFPDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VSQRTPD512 x) mask)
	// result: (VSQRTPDMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSQRTPD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VSQRTPDMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 dst (VSUBPD512 x y) mask)
	// result: (VSUBPDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSUBPD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VSUBPDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBLENDMQMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBLENDMQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBLENDMWMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBLENDMWMasked512 dst (VPABSW512 x) mask)
	// result: (VPABSWMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSW512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPABSWMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPADDSW512 x y) mask)
	// result: (VPADDSWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDSW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPADDSWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPADDUSW512 x y) mask)
	// result: (VPADDUSWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDUSW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPADDUSWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPADDW512 x y) mask)
	// result: (VPADDWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPADDWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPAVGW512 x y) mask)
	// result: (VPAVGWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPAVGW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPAVGWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMADDUBSW512 x y) mask)
	// result: (VPMADDUBSWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMADDUBSW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMADDUBSWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMADDWD512 x y) mask)
	// result: (VPMADDWDMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMADDWD512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMADDWDMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMAXSW512 x y) mask)
	// result: (VPMAXSWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMAXSWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMAXUW512 x y) mask)
	// result: (VPMAXUWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMAXUWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMINSW512 x y) mask)
	// result: (VPMINSWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMINSWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMINUW512 x y) mask)
	// result: (VPMINUWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMINUWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMOVSWB256 x) mask)
	// result: (VPMOVSWBMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSWB256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVSWBMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMOVUSWB256 x) mask)
	// result: (VPMOVUSWBMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSWB256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVUSWBMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMOVWB256 x) mask)
	// result: (VPMOVWBMasked256Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVWB256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMOVWBMasked256Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMULHUW512 x y) mask)
	// result: (VPMULHUWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULHUW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMULHUWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMULHW512 x y) mask)
	// result: (VPMULHWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULHW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMULHWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPMULLW512 x y) mask)
	// result: (VPMULLWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULLW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPMULLWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPOPCNTW512 x) mask)
	// result: (VPOPCNTWMasked512Merging dst x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTW512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPOPCNTWMasked512Merging)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSHUFHW512 [a] x) mask)
	// result: (VPSHUFHWMasked512Merging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFHW512 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSHUFHWMasked512Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSHUFLW512 [a] x) mask)
	// result: (VPSHUFLWMasked512Merging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFLW512 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSHUFLWMasked512Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSLLVW512 x y) mask)
	// result: (VPSLLVWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLVW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLVWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSLLW512const [a] x) mask)
	// result: (VPSLLWMasked512constMerging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLW512const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLWMasked512constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSRAVW512 x y) mask)
	// result: (VPSRAVWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAVW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAVWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSRAW512const [a] x) mask)
	// result: (VPSRAWMasked512constMerging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAW512const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAWMasked512constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSRLVW512 x y) mask)
	// result: (VPSRLVWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLVW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLVWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSRLW512const [a] x) mask)
	// result: (VPSRLWMasked512constMerging dst [a] x mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLW512const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLWMasked512constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v.AddArg3(dst, x, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSUBSW512 x y) mask)
	// result: (VPSUBSWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBSW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSUBSWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSUBUSW512 x y) mask)
	// result: (VPSUBUSWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBUSW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSUBUSWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	// match: (VPBLENDMWMasked512 dst (VPSUBW512 x y) mask)
	// result: (VPSUBWMasked512Merging dst x y mask)
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBW512 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSUBWMasked512Merging)
		v.AddArg4(dst, x, y, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBLENDVB128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (VPBLENDVB128 dst (VADDPD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VADDPDMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VADDPD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VADDPDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VADDPS128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VADDPSMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VADDPS128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VADDPSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VBROADCASTSD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VBROADCASTSDMasked256Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VBROADCASTSD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VBROADCASTSD512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VBROADCASTSDMasked512Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VBROADCASTSD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSDMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VBROADCASTSS128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VBROADCASTSSMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VBROADCASTSS128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VBROADCASTSS256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VBROADCASTSSMasked256Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VBROADCASTSS256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VBROADCASTSS512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VBROADCASTSSMasked512Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VBROADCASTSS512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VBROADCASTSSMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTDQ2PD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTDQ2PDMasked256Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTDQ2PD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTDQ2PS128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTDQ2PSMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTDQ2PS128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTPD2PSX128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTPD2PSXMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTPD2PSX128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPD2PSXMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTPS2PD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTPS2PDMasked256Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTPS2PD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPS2PDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTQQ2PD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTQQ2PDMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTQQ2PD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTQQ2PSX128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTQQ2PSXMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTQQ2PSX128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PSXMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTTPD2DQX128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPD2DQXMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2DQX128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2DQXMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTTPD2QQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPD2QQMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2QQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2QQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTTPD2UDQX128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPD2UDQXMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2UDQX128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQXMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTTPD2UQQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPD2UQQMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2UQQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTTPS2DQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPS2DQMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPS2DQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2DQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTTPS2QQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPS2QQMasked256Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPS2QQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2QQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTTPS2UDQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPS2UDQMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPS2UDQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTTPS2UQQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPS2UQQMasked256Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPS2UQQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UQQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTUDQ2PD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTUDQ2PDMasked256Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUDQ2PD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTUDQ2PS128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTUDQ2PSMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUDQ2PS128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTUQQ2PD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTUQQ2PDMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUQQ2PD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VCVTUQQ2PSX128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTUQQ2PSXMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUQQ2PSX128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSXMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VDIVPD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VDIVPDMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VDIVPD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VDIVPS128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VDIVPSMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VDIVPS128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VGF2P8MULB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VGF2P8MULBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VGF2P8MULB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8MULBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VMAXPD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMAXPDMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMAXPD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMAXPDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VMAXPS128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMAXPSMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMAXPS128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMAXPSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VMINPD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMINPDMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMINPD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMINPDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VMINPS128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMINPSMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMINPS128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMINPSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VMULPD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMULPDMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMULPD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMULPDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VMULPS128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMULPSMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMULPS128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMULPSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPABSB128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPABSBMasked128Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSB128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPABSD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPABSDMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPABSQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPABSQMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPABSW128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPABSWMasked128Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSW128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPACKSSDW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPACKSSDWMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPACKSSDW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKSSDWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPACKUSDW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPACKUSDWMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPACKUSDW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKUSDWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPADDB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPADDD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPADDQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPADDSB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDSBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDSB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDSBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPADDSW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDSWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDSW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDSWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPADDUSB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDUSBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDUSB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDUSBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPADDUSW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDUSWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDUSW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDUSWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPADDW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPAVGB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPAVGBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPAVGB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPAVGBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPAVGW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPAVGWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPAVGW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPAVGWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTB128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTBMasked128Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTB128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTB256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTBMasked256Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTB256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTB512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTBMasked512Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTB512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTDMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTDMasked256Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTD512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTDMasked512Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTQMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTQMasked256Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTQ512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTQMasked512Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTW128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTWMasked128Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTW128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTW256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTWMasked256Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTW256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPBROADCASTW512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPBROADCASTWMasked512Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPBROADCASTW512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTWMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPLZCNTD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPLZCNTDMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPLZCNTD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPLZCNTQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPLZCNTQMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPLZCNTQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMADDUBSW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMADDUBSWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMADDUBSW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDUBSWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMADDWD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMADDWDMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMADDWD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDWDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMAXSB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXSBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXSBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMAXSD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXSDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXSDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMAXSQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXSQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXSQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMAXSW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXSWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXSWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMAXUB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXUBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXUBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMAXUD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXUDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXUDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMAXUQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXUQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXUQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMAXUW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXUWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXUWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMINSB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINSBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINSBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMINSD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINSDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINSDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMINSQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINSQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINSQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMINSW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINSWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINSWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMINUB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINUBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINUBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMINUD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINUDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINUDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMINUQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINUQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINUQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMINUW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINUWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINUWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVDB128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVDBMasked128_128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVDB128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVDBMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVDW128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVDWMasked128_128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVDW128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVDWMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVQB128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVQBMasked128_128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVQB128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVQBMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVQD128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVQDMasked128_128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVQD128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVQDMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVQW128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVQWMasked128_128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVQW128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVQWMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSDB128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSDBMasked128_128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSDB128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSDBMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSDW128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSDWMasked128_128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSDW128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSDWMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSQB128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSQBMasked128_128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSQB128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSQBMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSQD128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSQDMasked128_128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSQD128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSQDMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSQW128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSQWMasked128_128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSQW128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSQWMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSWB128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSWBMasked128_128Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSWB128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSWBMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXBD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXBDMasked128Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXBD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXBD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXBDMasked256Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXBD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXBD512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXBDMasked512Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXBD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBDMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXBQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXBQMasked128Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXBQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXBQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXBQMasked256Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXBQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXBQ512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXBQMasked512Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXBQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBQMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXBW128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXBWMasked128Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXBW128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXBW256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXBWMasked256Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXBW256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXDQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXDQMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXDQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXDQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXDQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXDQMasked256Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXDQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXDQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXWD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXWDMasked128Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXWD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXWD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXWDMasked256Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXWD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXWQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXWQMasked128Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXWQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXWQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXWQMasked256Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXWQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVSXWQ512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXWQMasked512Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXWQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWQMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVUSDB128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSDBMasked128_128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSDB128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSDBMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVUSDW128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSDWMasked128_128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSDW128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSDWMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVUSQB128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSQBMasked128_128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSQB128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSQBMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVUSQD128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSQDMasked128_128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSQD128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSQDMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVUSQW128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSQWMasked128_128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSQW128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSQWMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVUSWB128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSWBMasked128_128Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSWB128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSWBMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVWB128_128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVWBMasked128_128Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVWB128_128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVWBMasked128_128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXBD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXBDMasked128Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXBD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXBD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXBDMasked256Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXBD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXBD512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXBDMasked512Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXBD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBDMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXBQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXBQMasked128Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXBQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXBQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXBQMasked256Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXBQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXBQ512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXBQMasked512Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXBQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBQMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXBW128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXBWMasked128Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXBW128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXBW256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXBWMasked256Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXBW256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXDQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXDQMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXDQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXDQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXDQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXDQMasked256Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXDQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXDQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXWD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXWDMasked128Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXWD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXWD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXWDMasked256Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXWD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXWQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXWQMasked128Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXWQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXWQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXWQMasked256Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXWQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMOVZXWQ512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXWQMasked512Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXWQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWQMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMULHUW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMULHUWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULHUW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMULHUWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMULHW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMULHWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULHW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMULHWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMULLD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMULLDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULLD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMULLDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMULLQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMULLQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULLQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMULLQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPMULLW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMULLWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULLW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMULLWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPOPCNTB128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPOPCNTBMasked128Merging dst x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTB128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPOPCNTD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPOPCNTDMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPOPCNTQ128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPOPCNTQMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTQ128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPOPCNTW128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPOPCNTWMasked128Merging dst x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTW128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPROLVD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPROLVDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPROLVD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPROLVQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPROLVQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPROLVQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPRORVD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPRORVDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPRORVD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPRORVQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPRORVQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPRORVQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSHUFB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSHUFBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSHUFD128 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSHUFDMasked128Merging dst [a] x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFD128 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFDMasked128Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSHUFHW128 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSHUFHWMasked128Merging dst [a] x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFHW128 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFHWMasked128Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSHUFLW128 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSHUFLWMasked128Merging dst [a] x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFLW128 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFLWMasked128Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSLLD128const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLDMasked128constMerging dst [a] x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLD128const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLDMasked128constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSLLQ128const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLQMasked128constMerging dst [a] x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLQ128const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLQMasked128constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSLLVD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLVDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLVD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSLLVQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLVQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLVQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSLLVW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLVWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLVW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSLLW128const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLWMasked128constMerging dst [a] x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLW128const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLWMasked128constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRAD128const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRADMasked128constMerging dst [a] x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAD128const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRADMasked128constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRAQ128const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRAQMasked128constMerging dst [a] x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAQ128const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAQMasked128constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRAVD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRAVDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAVD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRAVQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRAVQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAVQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRAVW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRAVWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAVW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRAW128const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRAWMasked128constMerging dst [a] x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAW128const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAWMasked128constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRLD128const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLDMasked128constMerging dst [a] x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLD128const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLDMasked128constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRLQ128const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLQMasked128constMerging dst [a] x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLQ128const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLQMasked128constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRLVD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLVDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLVD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRLVQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLVQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLVQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRLVW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLVWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLVW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSRLW128const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLWMasked128constMerging dst [a] x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLW128const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLWMasked128constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSUBB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSUBD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBDMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSUBQ128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBQMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBQ128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBQMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSUBSB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBSBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBSB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSUBSW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBSWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBSW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSUBUSB128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBUSBMasked128Merging dst x y (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBUSB128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSBMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSUBUSW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBUSWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBUSW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VPSUBW128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBWMasked128Merging dst x y (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBW128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBWMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VRCP14PD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VRCP14PDMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRCP14PD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VREDUCEPD128 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VREDUCEPDMasked128Merging dst [a] x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VREDUCEPD128 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPDMasked128Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VREDUCEPS128 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VREDUCEPSMasked128Merging dst [a] x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VREDUCEPS128 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPSMasked128Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VRNDSCALEPD128 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VRNDSCALEPDMasked128Merging dst [a] x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRNDSCALEPD128 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPDMasked128Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VRNDSCALEPS128 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VRNDSCALEPSMasked128Merging dst [a] x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRNDSCALEPS128 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPSMasked128Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VRSQRT14PD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VRSQRT14PDMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRSQRT14PD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VSCALEFPD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSCALEFPDMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSCALEFPD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VSCALEFPS128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSCALEFPSMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSCALEFPS128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VSQRTPD128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSQRTPDMasked128Merging dst x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSQRTPD128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VSQRTPS128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSQRTPSMasked128Merging dst x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSQRTPS128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VSUBPD128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSUBPDMasked128Merging dst x y (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSUBPD128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPDMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB128 dst (VSUBPS128 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSUBPSMasked128Merging dst x y (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSUBPS128 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPSMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBLENDVB256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (VPBLENDVB256 dst (VADDPD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VADDPDMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VADDPD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VADDPDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VADDPS256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VADDPSMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VADDPS256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VADDPSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTDQ2PD512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTDQ2PDMasked512Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTDQ2PD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PDMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTDQ2PS256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTDQ2PSMasked256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTDQ2PS256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTDQ2PSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTPD2PSY128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTPD2PSYMasked128Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTPD2PSY128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPD2PSYMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTPS2PD512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTPS2PDMasked512Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTPS2PD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTPS2PDMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTQQ2PD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTQQ2PDMasked256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTQQ2PD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTQQ2PSY128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTQQ2PSYMasked128Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTQQ2PSY128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTQQ2PSYMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTTPD2DQY128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPD2DQYMasked128Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2DQY128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2DQYMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTTPD2QQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPD2QQMasked256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2QQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2QQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTTPD2UDQY128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPD2UDQYMasked128Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2UDQY128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UDQYMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTTPD2UQQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPD2UQQMasked256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPD2UQQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPD2UQQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTTPS2DQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPS2DQMasked256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPS2DQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2DQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTTPS2QQ512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPS2QQMasked512Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPS2QQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2QQMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTTPS2UDQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPS2UDQMasked256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPS2UDQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UDQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTTPS2UQQ512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTTPS2UQQMasked512Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTTPS2UQQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTTPS2UQQMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTUDQ2PD512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTUDQ2PDMasked512Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUDQ2PD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PDMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTUDQ2PS256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTUDQ2PSMasked256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUDQ2PS256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUDQ2PSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTUQQ2PD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTUQQ2PDMasked256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUQQ2PD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VCVTUQQ2PSY128 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VCVTUQQ2PSYMasked128Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VCVTUQQ2PSY128 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VCVTUQQ2PSYMasked128Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VDIVPD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VDIVPDMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VDIVPD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VDIVPS256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VDIVPSMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VDIVPS256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VDIVPSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VGF2P8MULB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VGF2P8MULBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VGF2P8MULB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VGF2P8MULBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VMAXPD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMAXPDMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMAXPD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMAXPDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VMAXPS256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMAXPSMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMAXPS256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMAXPSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VMINPD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMINPDMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMINPD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMINPDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VMINPS256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMINPSMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMINPS256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMINPSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VMULPD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMULPDMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMULPD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMULPDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VMULPS256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VMULPSMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VMULPS256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VMULPSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPABSB256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPABSBMasked256Merging dst x (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSB256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPABSD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPABSDMasked256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPABSQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPABSQMasked256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPABSW256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPABSWMasked256Merging dst x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPABSW256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPABSWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPACKSSDW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPACKSSDWMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPACKSSDW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKSSDWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPACKUSDW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPACKUSDWMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPACKUSDW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPACKUSDWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPADDB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPADDD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPADDQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPADDSB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDSBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDSB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDSBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPADDSW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDSWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDSW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDSWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPADDUSB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDUSBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDUSB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDUSBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPADDUSW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDUSWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDUSW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDUSWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPADDW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPADDWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPADDW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPADDWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPAVGB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPAVGBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPAVGB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPAVGBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPAVGW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPAVGWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPAVGW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPAVGWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPLZCNTD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPLZCNTDMasked256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPLZCNTD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPLZCNTQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPLZCNTQMasked256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPLZCNTQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMADDUBSW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMADDUBSWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMADDUBSW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDUBSWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMADDWD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMADDWDMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMADDWD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDWDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMAXSB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXSBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXSBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMAXSD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXSDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXSDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMAXSQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXSQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXSQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMAXSW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXSWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXSW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXSWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMAXUB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXUBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXUBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMAXUD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXUDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXUDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMAXUQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXUQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXUQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMAXUW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMAXUWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMAXUW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMAXUWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMINSB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINSBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINSBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMINSD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINSDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINSDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMINSQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINSQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINSQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMINSW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINSWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINSW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINSWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMINUB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINUBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINUBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMINUD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINUDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINUDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMINUQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINUQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINUQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMINUW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMINUWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMINUW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMINUWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVDB128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVDBMasked128_256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVDB128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVDBMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVDW128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVDWMasked128_256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVDW128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVDWMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVQB128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVQBMasked128_256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVQB128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVQBMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVQD128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVQDMasked128_256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVQD128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVQDMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVQW128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVQWMasked128_256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVQW128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVQWMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVSDB128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSDBMasked128_256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSDB128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSDBMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVSDW128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSDWMasked128_256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSDW128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSDWMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVSQB128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSQBMasked128_256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSQB128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSQBMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVSQD128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSQDMasked128_256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSQD128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSQDMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVSQW128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSQWMasked128_256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSQW128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSQWMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVSWB128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSWBMasked128_256Merging dst x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSWB128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSWBMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVSXBW512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXBWMasked512Merging dst x (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXBW512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBWMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVSXDQ512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXDQMasked512Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXDQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXDQMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVSXWD512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVSXWDMasked512Merging dst x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVSXWD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWDMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVUSDB128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSDBMasked128_256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSDB128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSDBMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVUSDW128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSDWMasked128_256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSDW128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSDWMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVUSQB128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSQBMasked128_256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSQB128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSQBMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVUSQD128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSQDMasked128_256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSQD128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSQDMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVUSQW128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSQWMasked128_256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSQW128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSQWMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVUSWB128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVUSWBMasked128_256Merging dst x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVUSWB128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVUSWBMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVWB128_256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVWBMasked128_256Merging dst x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVWB128_256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVWBMasked128_256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVZXBW512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXBWMasked512Merging dst x (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXBW512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBWMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVZXDQ512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXDQMasked512Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXDQ512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXDQMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMOVZXWD512 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVZXWDMasked512Merging dst x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMOVZXWD512 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWDMasked512Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMULHUW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMULHUWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULHUW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMULHUWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMULHW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMULHWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULHW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMULHWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMULLD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMULLDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULLD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMULLDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMULLQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMULLQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULLQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMULLQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPMULLW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMULLWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPMULLW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMULLWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPOPCNTB256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPOPCNTBMasked256Merging dst x (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTB256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPOPCNTD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPOPCNTDMasked256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPOPCNTQ256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPOPCNTQMasked256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTQ256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPOPCNTW256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPOPCNTWMasked256Merging dst x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPOPCNTW256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPROLVD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPROLVDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPROLVD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPROLVQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPROLVQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPROLVQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPRORVD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPRORVDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPRORVD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPRORVQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPRORVQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPRORVQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSHUFB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSHUFBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSHUFD256 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSHUFDMasked256Merging dst [a] x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFD256 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFDMasked256Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSHUFHW256 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSHUFHWMasked256Merging dst [a] x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFHW256 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFHWMasked256Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSHUFLW256 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSHUFLWMasked256Merging dst [a] x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSHUFLW256 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFLWMasked256Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSLLD256const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLDMasked256constMerging dst [a] x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLD256const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLDMasked256constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSLLQ256const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLQMasked256constMerging dst [a] x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLQ256const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLQMasked256constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSLLVD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLVDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLVD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSLLVQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLVQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLVQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSLLVW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLVWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLVW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSLLW256const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSLLWMasked256constMerging dst [a] x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSLLW256const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLWMasked256constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRAD256const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRADMasked256constMerging dst [a] x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAD256const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRADMasked256constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRAQ256const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRAQMasked256constMerging dst [a] x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAQ256const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAQMasked256constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRAVD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRAVDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAVD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRAVQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRAVQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAVQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRAVW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRAVWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAVW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRAW256const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRAWMasked256constMerging dst [a] x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRAW256const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAWMasked256constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRLD256const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLDMasked256constMerging dst [a] x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLD256const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLDMasked256constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRLQ256const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLQMasked256constMerging dst [a] x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLQ256const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLQMasked256constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRLVD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLVDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLVD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRLVQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLVQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLVQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRLVW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLVWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLVW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSRLW256const [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSRLWMasked256constMerging dst [a] x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSRLW256const {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLWMasked256constMerging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSUBB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSUBD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBDMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSUBQ256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBQMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBQ256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBQMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSUBSB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBSBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBSB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSUBSW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBSWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBSW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSUBUSB256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBUSBMasked256Merging dst x y (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBUSB256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSBMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSUBUSW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBUSWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBUSW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VPSUBW256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPSUBWMasked256Merging dst x y (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VPSUBW256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBWMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VRCP14PD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VRCP14PDMasked256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRCP14PD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VREDUCEPD256 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VREDUCEPDMasked256Merging dst [a] x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VREDUCEPD256 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPDMasked256Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VREDUCEPS256 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VREDUCEPSMasked256Merging dst [a] x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VREDUCEPS256 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPSMasked256Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VRNDSCALEPD256 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VRNDSCALEPDMasked256Merging dst [a] x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRNDSCALEPD256 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPDMasked256Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VRNDSCALEPS256 [a] x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VRNDSCALEPSMasked256Merging dst [a] x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRNDSCALEPS256 {
			break
		}
		a := ssa.AuxIntToUint8(v_1.AuxInt)
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPSMasked256Merging)
		v.AuxInt = ssa.Uint8ToAuxInt(a)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VRSQRT14PD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VRSQRT14PDMasked256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VRSQRT14PD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VSCALEFPD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSCALEFPDMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSCALEFPD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VSCALEFPS256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSCALEFPSMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSCALEFPS256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VSQRTPD256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSQRTPDMasked256Merging dst x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSQRTPD256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VSQRTPS256 x) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSQRTPSMasked256Merging dst x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSQRTPS256 {
			break
		}
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(dst, x, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VSUBPD256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSUBPDMasked256Merging dst x y (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSUBPD256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPDMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	// match: (VPBLENDVB256 dst (VSUBPS256 x y) mask)
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VSUBPSMasked256Merging dst x y (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		dst := v_0
		if v_1.Op != ssaop.OpAMD64VSUBPS256 {
			break
		}
		y := v_1.Args[1]
		x := v_1.Args[0]
		mask := v_2
		if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPSMasked256Merging)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(dst, x, y, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTB128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (VPBROADCASTB128 x:(VPINSRB128 [0] (Zero128 <t>) y))
	// cond: x.Uses == 1
	// result: (VPBROADCASTB128 (VMOVQ <types.TypeVec128> y))
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64VPINSRB128 || ssa.AuxIntToUint8(x.AuxInt) != 0 {
			break
		}
		y := x.Args[1]
		x_0 := x.Args[0]
		if x_0.Op != ssaop.OpAMD64Zero128 {
			break
		}
		if !(x.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTB128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VMOVQ, types.TypeVec128)
		v0.AddArg(y)
		v.AddArg(v0)
		return true
	}
	// match: (VPBROADCASTB128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTB128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTB256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (VPBROADCASTB256 x:(VPINSRB128 [0] (Zero128 <t>) y))
	// cond: x.Uses == 1
	// result: (VPBROADCASTB256 (VMOVQ <types.TypeVec128> y))
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64VPINSRB128 || ssa.AuxIntToUint8(x.AuxInt) != 0 {
			break
		}
		y := x.Args[1]
		x_0 := x.Args[0]
		if x_0.Op != ssaop.OpAMD64Zero128 {
			break
		}
		if !(x.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTB256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VMOVQ, types.TypeVec128)
		v0.AddArg(y)
		v.AddArg(v0)
		return true
	}
	// match: (VPBROADCASTB256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTB256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTB512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (VPBROADCASTB512 x:(VPINSRB128 [0] (Zero128 <t>) y))
	// cond: x.Uses == 1
	// result: (VPBROADCASTB512 (VMOVQ <types.TypeVec128> y))
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64VPINSRB128 || ssa.AuxIntToUint8(x.AuxInt) != 0 {
			break
		}
		y := x.Args[1]
		x_0 := x.Args[0]
		if x_0.Op != ssaop.OpAMD64Zero128 {
			break
		}
		if !(x.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTB512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VMOVQ, types.TypeVec128)
		v0.AddArg(y)
		v.AddArg(v0)
		return true
	}
	// match: (VPBROADCASTB512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTB512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTB512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTBMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBROADCASTBMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTBMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTBMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBROADCASTBMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTBMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTBMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBROADCASTBMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTBMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPBROADCASTD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPBROADCASTD256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPBROADCASTD512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBROADCASTDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBROADCASTDMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBROADCASTDMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPBROADCASTQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPBROADCASTQ256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPBROADCASTQ512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBROADCASTQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBROADCASTQMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPBROADCASTQMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTW128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (VPBROADCASTW128 x:(VPINSRW128 [0] (Zero128 <t>) y))
	// cond: x.Uses == 1
	// result: (VPBROADCASTW128 (VMOVQ <types.TypeVec128> y))
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64VPINSRW128 || ssa.AuxIntToUint8(x.AuxInt) != 0 {
			break
		}
		y := x.Args[1]
		x_0 := x.Args[0]
		if x_0.Op != ssaop.OpAMD64Zero128 {
			break
		}
		if !(x.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTW128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VMOVQ, types.TypeVec128)
		v0.AddArg(y)
		v.AddArg(v0)
		return true
	}
	// match: (VPBROADCASTW128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTW128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTW256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (VPBROADCASTW256 x:(VPINSRW128 [0] (Zero128 <t>) y))
	// cond: x.Uses == 1
	// result: (VPBROADCASTW256 (VMOVQ <types.TypeVec128> y))
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64VPINSRW128 || ssa.AuxIntToUint8(x.AuxInt) != 0 {
			break
		}
		y := x.Args[1]
		x_0 := x.Args[0]
		if x_0.Op != ssaop.OpAMD64Zero128 {
			break
		}
		if !(x.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTW256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VMOVQ, types.TypeVec128)
		v0.AddArg(y)
		v.AddArg(v0)
		return true
	}
	// match: (VPBROADCASTW256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPBROADCASTW256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPBROADCASTW512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (VPBROADCASTW512 x:(VPINSRW128 [0] (Zero128 <t>) y))
	// cond: x.Uses == 1
	// result: (VPBROADCASTW512 (VMOVQ <types.TypeVec128> y))
	for {
		x := v_0
		if x.Op != ssaop.OpAMD64VPINSRW128 || ssa.AuxIntToUint8(x.AuxInt) != 0 {
			break
		}
		y := x.Args[1]
		x_0 := x.Args[0]
		if x_0.Op != ssaop.OpAMD64Zero128 {
			break
		}
		if !(x.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64VPBROADCASTW512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VMOVQ, types.TypeVec128)
		v0.AddArg(y)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCLMULQDQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCLMULQDQ128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCLMULQDQ128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCLMULQDQ128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCLMULQDQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCLMULQDQ256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCLMULQDQ256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCLMULQDQ256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPBMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPBMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPBMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPBMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPBMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPBMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPD512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPDMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPDMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPDMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPDMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPDMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPDMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPDMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPDMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPDMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPEQB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPEQB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPEQB128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPCMPEQB128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPCMPEQB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPEQB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPEQB256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPCMPEQB256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPCMPEQD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPEQD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPEQD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPCMPEQD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPCMPEQD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPEQD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPEQD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPCMPEQD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPCMPEQD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPEQD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPEQD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPCMPEQD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPCMPEQQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPEQQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPEQQ128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPCMPEQQ128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPCMPEQQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPEQQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPEQQ256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPCMPEQQ256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPCMPEQQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPEQQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPEQQ512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPCMPEQQ512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPCMPEQW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPEQW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPEQW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPCMPEQW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPCMPEQW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPEQW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPEQW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPCMPEQW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPCMPGTB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPGTB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPGTB128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPGTB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPGTB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPGTB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPGTB256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPGTB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPGTD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPGTD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPGTD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPGTD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPGTD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPGTD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPGTD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPGTD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPGTD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPGTD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPGTD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPGTD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPGTQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPGTQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPGTQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPGTQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPGTQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPGTQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPGTQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPGTQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPGTQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPGTQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPGTQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPGTQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPGTW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPGTW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPGTW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPGTW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPGTW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPGTW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPGTW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPGTW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPQ512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPQ512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPQ512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPQMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPQMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPQMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPQMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPQMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPQMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPQMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPQMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPQMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUBMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUBMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUBMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUBMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUBMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUBMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUD512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUDMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUDMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUDMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUDMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUDMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUDMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUDMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUDMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUDMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUQ512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUQ512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUQ512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUQMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUQMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUQMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUQMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUQMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUQMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUQMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUQMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUQMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUWMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUWMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUWMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPUWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPUWMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPUWMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPUWMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPWMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPWMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPWMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPCMPWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPCMPWMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPCMPWMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPCMPWMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPDPWSSD128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPDPWSSD128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPDPWSSD128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPDPWSSD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPDPWSSD256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPDPWSSD256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPDPWSSD256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPDPWSSD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPDPWSSD512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPDPWSSD512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPDPWSSD512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPDPWSSD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPDPWSSDMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPDPWSSDMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPDPWSSDMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPDPWSSDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPDPWSSDMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPDPWSSDMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPDPWSSDMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPDPWSSDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPDPWSSDMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPDPWSSDMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPDPWSSDMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPDPWSSDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERM2F128256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERM2F128256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERM2F128256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERM2F128256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERM2I128256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERM2I128256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERM2I128256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERM2I128256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMB128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMB256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMBMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMBMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMBMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMBMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2B128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2B128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2B128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2B128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2B256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2B256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2B256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2B256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2BMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2BMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2BMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2BMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2BMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2BMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2BMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2BMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2D128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2D128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2D128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2D128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2D256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2D256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2D256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2D256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2D512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2D512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2D512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2D512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2DMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2DMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2DMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2DMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2DMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2DMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2DMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2DMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2DMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2DMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2DMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2DMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PD128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PD128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PD128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PD256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PD256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PD256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PD512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PD512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PD512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PDMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PDMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PDMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PDMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PDMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PDMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PDMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PDMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PDMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PS128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PS128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PS128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PS256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PS256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PS256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PS512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PS512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PS512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PSMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PSMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PSMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PSMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PSMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PSMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2PSMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2PSMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2PSMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2PSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2Q128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2Q128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2Q128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2Q128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2Q256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2Q256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2Q256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2Q256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2Q512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2Q512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2Q512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2Q512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2QMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2QMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2QMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2QMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2QMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2QMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2QMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2QMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2QMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2QMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2QMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2QMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2W128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2W128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2W128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2W128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2W256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2W256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2W256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2W256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2WMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2WMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2WMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2WMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMI2WMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMI2WMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMI2WMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMI2WMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMPD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMPD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMPD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMPD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMPD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMPDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMPDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMPDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMPDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMPDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMPDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMPDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMPDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMPS256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMPS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMPS512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMPS512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMPS512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMPS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMPSMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMPSMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMPSMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMPSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMPSMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMPSMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMPSMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMPSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMQMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMQMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMWMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPERMWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPERMWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPERMWMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPERMWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPEXPANDBMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPEXPANDBMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPEXPANDBMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPEXPANDBMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPEXPANDBMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPEXPANDBMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPEXPANDBMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPEXPANDBMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPEXPANDDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPEXPANDDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPEXPANDDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPEXPANDDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPEXPANDDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPEXPANDDMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPEXPANDDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPEXPANDDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPEXPANDQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPEXPANDQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPEXPANDQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPEXPANDQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPEXPANDQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPEXPANDQMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPEXPANDQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPEXPANDQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPEXPANDWMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPEXPANDWMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPEXPANDWMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPEXPANDWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPEXPANDWMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPEXPANDWMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPEXPANDWMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPEXPANDWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHADDD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHADDD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHADDD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHADDD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHADDD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHADDD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHADDD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHADDD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHADDSW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHADDSW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHADDSW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHADDSW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHADDSW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHADDSW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHADDSW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHADDSW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHADDW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHADDW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHADDW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHADDW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHADDW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHADDW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHADDW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHADDW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHSUBD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHSUBD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHSUBD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHSUBD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHSUBD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHSUBD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHSUBD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHSUBD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHSUBSW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHSUBSW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHSUBSW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHSUBSW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHSUBSW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHSUBSW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHSUBSW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHSUBSW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHSUBW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHSUBW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHSUBW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHSUBW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPHSUBW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPHSUBW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPHSUBW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPHSUBW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPINSRD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPINSRD128 [0] (Zero128 <t>) y)
	// cond: y.Type.IsFloat()
	// result: (VMOVSSf2v <types.TypeVec128> y)
	for {
		if ssa.AuxIntToUint8(v.AuxInt) != 0 || v_0.Op != ssaop.OpAMD64Zero128 {
			break
		}
		y := v_1
		if !(y.Type.IsFloat()) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVSSf2v)
		v.Type = types.TypeVec128
		v.AddArg(y)
		return true
	}
	// match: (VPINSRD128 [0] (Zero128 <t>) y)
	// cond: !y.Type.IsFloat()
	// result: (VMOVD <types.TypeVec128> y)
	for {
		if ssa.AuxIntToUint8(v.AuxInt) != 0 || v_0.Op != ssaop.OpAMD64Zero128 {
			break
		}
		y := v_1
		if !(!y.Type.IsFloat()) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVD)
		v.Type = types.TypeVec128
		v.AddArg(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPINSRQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPINSRQ128 [0] (Zero128 <t>) y)
	// cond: y.Type.IsFloat()
	// result: (VMOVSDf2v <types.TypeVec128> y)
	for {
		if ssa.AuxIntToUint8(v.AuxInt) != 0 || v_0.Op != ssaop.OpAMD64Zero128 {
			break
		}
		y := v_1
		if !(y.Type.IsFloat()) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVSDf2v)
		v.Type = types.TypeVec128
		v.AddArg(y)
		return true
	}
	// match: (VPINSRQ128 [0] (Zero128 <t>) y)
	// cond: !y.Type.IsFloat()
	// result: (VMOVQ <types.TypeVec128> y)
	for {
		if ssa.AuxIntToUint8(v.AuxInt) != 0 || v_0.Op != ssaop.OpAMD64Zero128 {
			break
		}
		y := v_1
		if !(!y.Type.IsFloat()) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVQ)
		v.Type = types.TypeVec128
		v.AddArg(y)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPLZCNTD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPLZCNTD256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPLZCNTD512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPLZCNTDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPLZCNTDMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPLZCNTDMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPLZCNTQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPLZCNTQ256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPLZCNTQ512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPLZCNTQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPLZCNTQMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPLZCNTQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPLZCNTQMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPLZCNTQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPLZCNTQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMADDUBSW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMADDUBSW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMADDUBSW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDUBSW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMADDUBSW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMADDUBSW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMADDUBSW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDUBSW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMADDUBSWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMADDUBSWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMADDUBSWMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDUBSWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMADDUBSWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMADDUBSWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMADDUBSWMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDUBSWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMADDWD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMADDWD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMADDWD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDWD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMADDWD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMADDWD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMADDWD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDWD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMADDWDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMADDWDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMADDWDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDWDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMADDWDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMADDWDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMADDWDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMADDWDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSB128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSB128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSB256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSB256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSBMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSBMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSBMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSBMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSQ128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSQ128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSQ256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSQ256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSQ512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSQ512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSQMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSQMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSQMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSQMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSQMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSQMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXSWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXSWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXSWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXSWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUB128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUB128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUB256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUB256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUBMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUBMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUBMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUBMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUQ128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUQ128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUQ256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUQ256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUQ512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUQ512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUQMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUQMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUQMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUQMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUQMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUQMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMAXUWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMAXUWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMAXUWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMAXUWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSB128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSB128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSB256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSB256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSBMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSBMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSBMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSBMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSQ128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSQ128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSQ256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSQ256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSQ512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSQ512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSQMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSQMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSQMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSQMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSQMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSQMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINSWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINSWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINSWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINSWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUB128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUB128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUB256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUB256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUBMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUBMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUBMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUBMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUQ128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUQ128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUQ256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUQ256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUQ512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUQ512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUQMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUQMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUQMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUQMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUQMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUQMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMINUWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMINUWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMINUWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMINUWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXBD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXBD256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXBD512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXBDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXBDMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXBDMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXBQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXBQ256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXBQ512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXBQMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXBQMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBW128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXBW128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBW128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBW256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXBW256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBW256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBW512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXBW512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBW512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBW512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBWMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXBWMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBWMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBWMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXBWMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBWMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXBWMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXBWMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXBWMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXBWMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXDQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXDQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXDQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXDQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXDQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXDQ256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXDQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXDQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXDQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXDQ512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXDQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXDQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXDQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXDQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXDQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXDQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXDQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXDQMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXDQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXDQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXDQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXDQMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXDQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXDQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXWD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXWD256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXWD512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXWDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXWDMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXWDMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXWQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXWQ256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVSXWQ512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXWQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXWQMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVSXWQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVSXWQMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVSXWQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVSXWQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec16x16ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec16x16ToM (VPMOVMToVec16x16 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x16 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec16x32ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec16x32ToM (VPMOVMToVec16x32 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x32 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec16x8ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec16x8ToM (VPMOVMToVec16x8 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x8 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec32x16ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec32x16ToM (VPMOVMToVec32x16 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec32x4ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec32x4ToM (VPMOVMToVec32x4 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x4 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec32x8ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec32x8ToM (VPMOVMToVec32x8 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x8 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec64x2ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec64x2ToM (VPMOVMToVec64x2 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x2 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec64x4ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec64x4ToM (VPMOVMToVec64x4 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x4 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec64x8ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec64x8ToM (VPMOVMToVec64x8 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec8x16ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec8x16ToM (VPMOVMToVec8x16 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x16 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec8x32ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec8x32ToM (VPMOVMToVec8x32 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x32 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVVec8x64ToM(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVVec8x64ToM (VPMOVMToVec8x64 x))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x64 {
			break
		}
		x := v_0.Args[0]
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXBD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXBD256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXBD512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXBDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXBDMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXBDMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXBQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXBQ256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXBQ512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXBQMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXBQMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBW128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXBW128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBW128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBW256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXBW256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBW256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBW512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXBW512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBW512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBW512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBWMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXBWMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBWMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBWMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXBWMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBWMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXBWMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXBWMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXBWMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXBWMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXDQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXDQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXDQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXDQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXDQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXDQ256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXDQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXDQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXDQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXDQ512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXDQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXDQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXDQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXDQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXDQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXDQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXDQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXDQMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXDQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXDQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXDQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXDQMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXDQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXDQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXWD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXWD256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXWD512 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXWDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXWDMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXWDMasked512 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXWQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXWQ256 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPMOVZXWQ512 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXWQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXWQMasked256 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMOVZXWQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMOVZXWQMasked512 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMOVZXWQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMOVZXWQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPMULDQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULDQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULDQ128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULDQ128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULDQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULDQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULDQ256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULDQ256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULHUW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULHUW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULHUW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULHUW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULHUW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULHUW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULHUW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULHUW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULHUWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULHUWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULHUWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULHUWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULHUWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULHUWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULHUWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULHUWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULHW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULHW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULHW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULHW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULHW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULHW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULHW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULHW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULHWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULHWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULHWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULHWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULHWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULHWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULHWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULHWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLD128 x (VPBROADCASTD128 (VMOVD (MOVLconst [c]))))
	// cond: ssa.IsPowerOfTwo(c)
	// result: (VPSLLD128const [uint8(ssa.Log32(int32(c)))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPBROADCASTD128 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VMOVD {
				continue
			}
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1_0_0.AuxInt)
			if !(ssa.IsPowerOfTwo(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPSLLD128const)
			v.AuxInt = ssa.Uint8ToAuxInt(uint8(ssa.Log32(int32(c))))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (VPMULLD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLD128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLD128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLD256 x (VPBROADCASTD256 (VMOVD (MOVLconst [c]))))
	// cond: ssa.IsPowerOfTwo(c)
	// result: (VPSLLD256const [uint8(ssa.Log32(int32(c)))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPBROADCASTD256 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VMOVD {
				continue
			}
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1_0_0.AuxInt)
			if !(ssa.IsPowerOfTwo(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPSLLD256const)
			v.AuxInt = ssa.Uint8ToAuxInt(uint8(ssa.Log32(int32(c))))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (VPMULLD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLD256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLD256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLD512 x (VPBROADCASTD512 (VMOVD (MOVLconst [c]))))
	// cond: ssa.IsPowerOfTwo(c)
	// result: (VPSLLD512const [uint8(ssa.Log32(int32(c)))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPBROADCASTD512 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VMOVD {
				continue
			}
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1_0_0.AuxInt)
			if !(ssa.IsPowerOfTwo(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPSLLD512const)
			v.AuxInt = ssa.Uint8ToAuxInt(uint8(ssa.Log32(int32(c))))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (VPMULLD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLQ128 x (VPBROADCASTQ128 (VMOVQ (MOVQconst [c]))))
	// cond: ssa.IsPowerOfTwo(c)
	// result: (VPSLLQ128const [uint8(ssa.Log64(c))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPBROADCASTQ128 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VMOVQ {
				continue
			}
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1_0_0.AuxInt)
			if !(ssa.IsPowerOfTwo(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPSLLQ128const)
			v.AuxInt = ssa.Uint8ToAuxInt(uint8(ssa.Log64(c)))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (VPMULLQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLQ128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLQ128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLQ256 x (VPBROADCASTQ256 (VMOVQ (MOVQconst [c]))))
	// cond: ssa.IsPowerOfTwo(c)
	// result: (VPSLLQ256const [uint8(ssa.Log64(c))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPBROADCASTQ256 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VMOVQ {
				continue
			}
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1_0_0.AuxInt)
			if !(ssa.IsPowerOfTwo(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPSLLQ256const)
			v.AuxInt = ssa.Uint8ToAuxInt(uint8(ssa.Log64(c)))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (VPMULLQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLQ256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLQ256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLQ512 x (VPBROADCASTQ512 (VMOVQ (MOVQconst [c]))))
	// cond: ssa.IsPowerOfTwo(c)
	// result: (VPSLLQ512const [uint8(ssa.Log64(c))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPBROADCASTQ512 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VMOVQ {
				continue
			}
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1_0_0.AuxInt)
			if !(ssa.IsPowerOfTwo(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPSLLQ512const)
			v.AuxInt = ssa.Uint8ToAuxInt(uint8(ssa.Log64(c)))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (VPMULLQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLQ512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLQ512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLQMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLQMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLQMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLQMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLQMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLQMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLW128 x (VPBROADCASTW128 (VMOVQ (MOVLconst [c]))))
	// cond: ssa.IsPowerOfTwo(c)
	// result: (VPSLLW128const [uint8(ssa.Log16(int16(c)))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPBROADCASTW128 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VMOVQ {
				continue
			}
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1_0_0.AuxInt)
			if !(ssa.IsPowerOfTwo(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPSLLW128const)
			v.AuxInt = ssa.Uint8ToAuxInt(uint8(ssa.Log16(int16(c))))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (VPMULLW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLW128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLW128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLW256 x (VPBROADCASTW256 (VMOVQ (MOVLconst [c]))))
	// cond: ssa.IsPowerOfTwo(c)
	// result: (VPSLLW256const [uint8(ssa.Log16(int16(c)))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPBROADCASTW256 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VMOVQ {
				continue
			}
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1_0_0.AuxInt)
			if !(ssa.IsPowerOfTwo(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPSLLW256const)
			v.AuxInt = ssa.Uint8ToAuxInt(uint8(ssa.Log16(int16(c))))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (VPMULLW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLW256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLW256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLW512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLW512 x (VPBROADCASTW512 (VMOVQ (MOVLconst [c]))))
	// cond: ssa.IsPowerOfTwo(c)
	// result: (VPSLLW512const [uint8(ssa.Log16(int16(c)))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64VPBROADCASTW512 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VMOVQ {
				continue
			}
			v_1_0_0 := v_1_0.Args[0]
			if v_1_0_0.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1_0_0.AuxInt)
			if !(ssa.IsPowerOfTwo(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPSLLW512const)
			v.AuxInt = ssa.Uint8ToAuxInt(uint8(ssa.Log16(int16(c))))
			v.AddArg(x)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLWMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLWMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULLWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULLWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULLWMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULLWMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULUDQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULUDQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULUDQ128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULUDQ128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPMULUDQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPMULUDQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPMULUDQ256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMULUDQ256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTB128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPOPCNTB128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTB128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTB256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPOPCNTB256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTB256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTBMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPOPCNTBMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTBMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTBMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTBMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPOPCNTBMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTBMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTBMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPOPCNTD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPOPCNTD256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPOPCNTD512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPOPCNTDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPOPCNTDMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPOPCNTDMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPOPCNTQ128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTQ128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPOPCNTQ256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTQ256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPOPCNTQ512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTQ512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPOPCNTQMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTQMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPOPCNTQMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTQMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPOPCNTQMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTQMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTW128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPOPCNTW128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTW128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTW256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPOPCNTW256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTW256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTWMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPOPCNTWMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTWMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOPCNTWMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPOPCNTWMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOPCNTWMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPOPCNTWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPOR128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (VPOR128 (VCMPPS128 [3] x x) (VCMPPS128 [3] y y))
	// result: (VCMPPS128 [3] x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VCMPPS128 || ssa.AuxIntToUint8(v_0.AuxInt) != 3 {
				continue
			}
			x := v_0.Args[1]
			if x != v_0.Args[0] || v_1.Op != ssaop.OpAMD64VCMPPS128 || ssa.AuxIntToUint8(v_1.AuxInt) != 3 {
				continue
			}
			y := v_1.Args[1]
			if y != v_1.Args[0] {
				continue
			}
			v.Reset(ssaop.OpAMD64VCMPPS128)
			v.AuxInt = ssa.Uint8ToAuxInt(3)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (VPOR128 (VCMPPD128 [3] x x) (VCMPPD128 [3] y y))
	// result: (VCMPPD128 [3] x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VCMPPD128 || ssa.AuxIntToUint8(v_0.AuxInt) != 3 {
				continue
			}
			x := v_0.Args[1]
			if x != v_0.Args[0] || v_1.Op != ssaop.OpAMD64VCMPPD128 || ssa.AuxIntToUint8(v_1.AuxInt) != 3 {
				continue
			}
			y := v_1.Args[1]
			if y != v_1.Args[0] {
				continue
			}
			v.Reset(ssaop.OpAMD64VCMPPD128)
			v.AuxInt = ssa.Uint8ToAuxInt(3)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (VPOR128 (VPMOVMToVec8x16 x) (VPMOVMToVec8x16 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec8x16 (KORW x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x16 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x16 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec8x16)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORW, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPOR128 (VPMOVMToVec16x8 x) (VPMOVMToVec16x8 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec16x8 (KORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x8 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x8 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec16x8)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPOR128 (VPMOVMToVec32x4 x) (VPMOVMToVec32x4 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec32x4 (KORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x4 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x4 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec32x4)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPOR128 (VPMOVMToVec64x2 x) (VPMOVMToVec64x2 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec64x2 (KORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x2 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x2 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec64x2)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPOR128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOR128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPOR128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPOR256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (VPOR256 (VCMPPS256 [3] x x) (VCMPPS256 [3] y y))
	// result: (VCMPPS256 [3] x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VCMPPS256 || ssa.AuxIntToUint8(v_0.AuxInt) != 3 {
				continue
			}
			x := v_0.Args[1]
			if x != v_0.Args[0] || v_1.Op != ssaop.OpAMD64VCMPPS256 || ssa.AuxIntToUint8(v_1.AuxInt) != 3 {
				continue
			}
			y := v_1.Args[1]
			if y != v_1.Args[0] {
				continue
			}
			v.Reset(ssaop.OpAMD64VCMPPS256)
			v.AuxInt = ssa.Uint8ToAuxInt(3)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (VPOR256 (VCMPPD256 [3] x x) (VCMPPD256 [3] y y))
	// result: (VCMPPD256 [3] x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VCMPPD256 || ssa.AuxIntToUint8(v_0.AuxInt) != 3 {
				continue
			}
			x := v_0.Args[1]
			if x != v_0.Args[0] || v_1.Op != ssaop.OpAMD64VCMPPD256 || ssa.AuxIntToUint8(v_1.AuxInt) != 3 {
				continue
			}
			y := v_1.Args[1]
			if y != v_1.Args[0] {
				continue
			}
			v.Reset(ssaop.OpAMD64VCMPPD256)
			v.AuxInt = ssa.Uint8ToAuxInt(3)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (VPOR256 (VPMOVMToVec8x32 x) (VPMOVMToVec8x32 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec8x32 (KORD x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x32 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x32 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec8x32)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORD, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPOR256 (VPMOVMToVec16x16 x) (VPMOVMToVec16x16 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec16x16 (KORW x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x16 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x16 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec16x16)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORW, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPOR256 (VPMOVMToVec32x8 x) (VPMOVMToVec32x8 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec32x8 (KORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x8 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x8 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec32x8)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPOR256 (VPMOVMToVec64x4 x) (VPMOVMToVec64x4 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec64x4 (KORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x4 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x4 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec64x4)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPOR256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPOR256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPOR256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPORD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (VPORD512 (VPMOVMToVec32x16 (VCMPPS512 [3] x x)) (VPMOVMToVec32x16 (VCMPPS512 [3] y y)))
	// result: (VPMOVMToVec32x16 (VCMPPS512 [3] x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
				continue
			}
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64VCMPPS512 || ssa.AuxIntToUint8(v_0_0.AuxInt) != 3 {
				continue
			}
			x := v_0_0.Args[1]
			if x != v_0_0.Args[0] || v_1.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VCMPPS512 || ssa.AuxIntToUint8(v_1_0.AuxInt) != 3 {
				continue
			}
			y := v_1_0.Args[1]
			if y != v_1_0.Args[0] {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPS512, typ.Mask)
			v0.AuxInt = ssa.Uint8ToAuxInt(3)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPORD512 (VPMOVMToVec64x8 (VCMPPD512 [3] x x)) (VPMOVMToVec64x8 (VCMPPD512 [3] y y)))
	// result: (VPMOVMToVec64x8 (VCMPPD512 [3] x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
				continue
			}
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64VCMPPD512 || ssa.AuxIntToUint8(v_0_0.AuxInt) != 3 {
				continue
			}
			x := v_0_0.Args[1]
			if x != v_0_0.Args[0] || v_1.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
				continue
			}
			v_1_0 := v_1.Args[0]
			if v_1_0.Op != ssaop.OpAMD64VCMPPD512 || ssa.AuxIntToUint8(v_1_0.AuxInt) != 3 {
				continue
			}
			y := v_1_0.Args[1]
			if y != v_1_0.Args[0] {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPD512, typ.Mask)
			v0.AuxInt = ssa.Uint8ToAuxInt(3)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPORD512 (VPMOVMToVec8x64 x) (VPMOVMToVec8x64 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec8x64 (KORQ x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x64 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x64 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORQ, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPORD512 (VPMOVMToVec16x32 x) (VPMOVMToVec16x32 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec16x32 (KORD x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x32 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x32 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORD, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPORD512 (VPMOVMToVec32x16 x) (VPMOVMToVec32x16 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec32x16 (KORW x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORW, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPORD512 (VPMOVMToVec64x8 x) (VPMOVMToVec64x8 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec64x8 (KORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPORD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPORD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPORD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPORDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPORDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPORDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPORDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPORDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPORDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPORDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPORDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPORDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPORDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPORDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPORDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPORQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPORQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPORQ512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPORQ512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPORQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPORQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPORQMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPORQMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPORQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPORQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPORQMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPORQMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPORQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPORQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPORQMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPORQMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPROLD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPROLD128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPROLD256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPROLD512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLDMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLDMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLDMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLDMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLDMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLDMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLDMasked512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLDMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLDMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPROLQ128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLQ128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLQ128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPROLQ256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLQ256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLQ256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPROLQ512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLQ512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLQ512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLQMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLQMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLQMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLQMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLQMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLQMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLQMasked512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLQMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLQMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVQMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVQMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPROLVQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPROLVQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPROLVQMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPROLVQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPRORD128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPRORD256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPRORD512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORDMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORDMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORDMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORDMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORDMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORDMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORDMasked512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORDMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORDMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORQ128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPRORQ128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORQ128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORQ128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORQ256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPRORQ256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORQ256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORQ256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORQ512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPRORQ512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORQ512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORQ512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORQMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORQMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORQMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORQMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORQMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORQMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORQMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORQMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORQMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORQMasked512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORQMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORQMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVQMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVQMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPRORVQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPRORVQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPRORVQMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPRORVQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSADBW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSADBW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSADBW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSADBW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSADBW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSADBW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSADBW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSADBW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDD128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDD256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDD512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDDMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDDMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDDMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDDMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDDMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDDMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDDMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDDMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDDMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDQ128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDQ128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDQ128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDQ256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDQ256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDQ256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDQ512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDQ512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDQ512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDQMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDQMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDQMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDQMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDQMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDQMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDQMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDQMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDQMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVD128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVD128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVD128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVD256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVD256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVD256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVD512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVD512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVD512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVDMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVDMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVDMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVDMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVDMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVDMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVDMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVDMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVDMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVQ128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVQ128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVQ128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVQ256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVQ256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVQ256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVQ512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVQ512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVQ512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVQMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVQMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVQMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVQMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVQMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVQMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVQMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVQMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVQMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVW128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVW128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVW128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVW256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVW256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVW256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVWMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVWMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVWMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDVWMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDVWMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDVWMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDVWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDW128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDW128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDW128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDW256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDW256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDW256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDWMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDWMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDWMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHLDWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHLDWMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHLDWMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHLDWMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDD128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDD256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDD512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDDMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDDMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDDMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDDMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDDMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDDMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDDMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDDMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDDMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDQ128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDQ128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDQ128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDQ256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDQ256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDQ256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDQ512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDQ512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDQ512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDQMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDQMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDQMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDQMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDQMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDQMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDQMasked512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDQMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDQMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVD128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVD128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVD128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVD256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVD256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVD256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVD512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVD512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVD512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVDMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVDMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVDMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVDMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVDMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVDMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVDMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVDMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVDMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVQ128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVQ128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVQ128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVQ256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVQ256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVQ256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVQ512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVQ512 x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVQ512load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVQMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVQMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVQMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVQMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVQMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVQMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVQMasked512(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVQMasked512 x y l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVQMasked512load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVW128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVW128 x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVW128load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVW256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVW256 x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVW256load {sym} [off] x y ptr mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVWMasked128(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVWMasked128 x y l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVWMasked128load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDVWMasked256(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDVWMasked256 x y l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDVWMasked256load {sym} [off] x y ptr mask mem)
	for {
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_3
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDVWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg5(x, y, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDW128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDW128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDW128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDW256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDW256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDW256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDWMasked128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDWMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDWMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHRDWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHRDWMasked256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHRDWMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHRDWMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFB128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFB256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFBMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFBMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFBMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFBMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSHUFD128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSHUFD256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSHUFD512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFDMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFDMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFDMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFDMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFDMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFDMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFDMasked512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFDMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFDMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFHW128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSHUFHW128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFHW128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFHW128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFHW256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSHUFHW256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFHW256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFHW256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFHWMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFHWMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFHWMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFHWMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFHWMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFHWMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFHWMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFHWMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFLW128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSHUFLW128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFLW128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFLW128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFLW256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSHUFLW256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFLW256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFLW256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFLWMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFLWMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFLWMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFLWMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSHUFLWMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSHUFLWMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSHUFLWMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSHUFLWMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSIGNB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSIGNB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSIGNB128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSIGNB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSIGNB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSIGNB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSIGNB256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSIGNB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSIGND128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSIGND128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSIGND128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSIGND128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSIGND256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSIGND256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSIGND256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSIGND256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSIGNW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSIGNW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSIGNW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSIGNW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSIGNW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSIGNW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSIGNW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSIGNW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLD128 x (MOVQconst [c]))
	// result: (VPSLLD128const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSLLD128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLD128const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSLLD128const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLD256 x (MOVQconst [c]))
	// result: (VPSLLD256const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSLLD256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLD256const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSLLD256const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLD512 x (MOVQconst [c]))
	// result: (VPSLLD512const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSLLD512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLD512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSLLD512const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSLLD512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLD512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLD512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLDMasked128 x (MOVQconst [c]) mask)
	// result: (VPSLLDMasked128const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLDMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLDMasked128const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLDMasked128const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSLLDMasked128const [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLDMasked128constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLDMasked128constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLDMasked256 x (MOVQconst [c]) mask)
	// result: (VPSLLDMasked256const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLDMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLDMasked256const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLDMasked256const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSLLDMasked256const [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLDMasked256constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLDMasked256constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLDMasked512 x (MOVQconst [c]) mask)
	// result: (VPSLLDMasked512const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLDMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLDMasked512const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLDMasked512const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSLLDMasked512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLDMasked512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLDMasked512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLQ128 x (MOVQconst [c]))
	// result: (VPSLLQ128const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSLLQ128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQ128const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSLLQ128const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLQ256 x (MOVQconst [c]))
	// result: (VPSLLQ256const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSLLQ256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQ256const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSLLQ256const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLQ512 x (MOVQconst [c]))
	// result: (VPSLLQ512const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSLLQ512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQ512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSLLQ512const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSLLQ512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLQ512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLQ512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLQMasked128 x (MOVQconst [c]) mask)
	// result: (VPSLLQMasked128const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLQMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQMasked128const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLQMasked128const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSLLQMasked128const [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLQMasked128constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLQMasked128constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLQMasked256 x (MOVQconst [c]) mask)
	// result: (VPSLLQMasked256const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLQMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQMasked256const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLQMasked256const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSLLQMasked256const [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLQMasked256constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLQMasked256constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLQMasked512 x (MOVQconst [c]) mask)
	// result: (VPSLLQMasked512const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLQMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLQMasked512const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLQMasked512const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSLLQMasked512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLQMasked512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLQMasked512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVQMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVQMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVQMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVWMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLVWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLVWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLVWMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLVWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLW128 x (MOVQconst [c]))
	// result: (VPSLLW128const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSLLW128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLW128const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSLLW128const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLW256 x (MOVQconst [c]))
	// result: (VPSLLW256const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSLLW256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLW256const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSLLW256const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLW512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLW512 x (MOVQconst [c]))
	// result: (VPSLLW512const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSLLW512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLW512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSLLW512const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLWMasked128 x (MOVQconst [c]) mask)
	// result: (VPSLLWMasked128const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLWMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLWMasked128const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLWMasked128const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSLLWMasked128const [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLWMasked128constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLWMasked128constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLWMasked256 x (MOVQconst [c]) mask)
	// result: (VPSLLWMasked256const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLWMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLWMasked256const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLWMasked256const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSLLWMasked256const [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSLLWMasked256constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSLLWMasked256constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLWMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSLLWMasked512 x (MOVQconst [c]) mask)
	// result: (VPSLLWMasked512const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSLLWMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSLLWMasked512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSLLWMasked512const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAD128 x (MOVQconst [c]))
	// result: (VPSRAD128const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRAD128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAD128const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRAD128const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAD256 x (MOVQconst [c]))
	// result: (VPSRAD256const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRAD256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAD256const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRAD256const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAD512 x (MOVQconst [c]))
	// result: (VPSRAD512const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRAD512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAD512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRAD512const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRAD512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAD512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAD512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRADMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRADMasked128 x (MOVQconst [c]) mask)
	// result: (VPSRADMasked128const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRADMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRADMasked128const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRADMasked128const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRADMasked128const [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRADMasked128constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRADMasked128constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRADMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRADMasked256 x (MOVQconst [c]) mask)
	// result: (VPSRADMasked256const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRADMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRADMasked256const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRADMasked256const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRADMasked256const [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRADMasked256constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRADMasked256constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRADMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRADMasked512 x (MOVQconst [c]) mask)
	// result: (VPSRADMasked512const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRADMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRADMasked512const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRADMasked512const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRADMasked512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRADMasked512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRADMasked512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAQ128 x (MOVQconst [c]))
	// result: (VPSRAQ128const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRAQ128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQ128const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRAQ128const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRAQ128const [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAQ128constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAQ128constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAQ256 x (MOVQconst [c]))
	// result: (VPSRAQ256const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRAQ256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQ256const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRAQ256const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRAQ256const [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAQ256constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAQ256constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAQ512 x (MOVQconst [c]))
	// result: (VPSRAQ512const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRAQ512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQ512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRAQ512const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRAQ512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAQ512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAQ512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAQMasked128 x (MOVQconst [c]) mask)
	// result: (VPSRAQMasked128const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAQMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQMasked128const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAQMasked128const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRAQMasked128const [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAQMasked128constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAQMasked128constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAQMasked256 x (MOVQconst [c]) mask)
	// result: (VPSRAQMasked256const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAQMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQMasked256const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAQMasked256const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRAQMasked256const [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAQMasked256constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAQMasked256constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAQMasked512 x (MOVQconst [c]) mask)
	// result: (VPSRAQMasked512const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAQMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAQMasked512const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAQMasked512const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRAQMasked512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAQMasked512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAQMasked512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVQMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVQMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVQMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVWMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAVWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAVWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAVWMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAVWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAW128 x (MOVQconst [c]))
	// result: (VPSRAW128const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRAW128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAW128const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRAW128const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAW256 x (MOVQconst [c]))
	// result: (VPSRAW256const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRAW256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAW256const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRAW256const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAW512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAW512 x (MOVQconst [c]))
	// result: (VPSRAW512const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRAW512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAW512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRAW512const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAWMasked128 x (MOVQconst [c]) mask)
	// result: (VPSRAWMasked128const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAWMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAWMasked128const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAWMasked128const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRAWMasked128const [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAWMasked128constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAWMasked128constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAWMasked256 x (MOVQconst [c]) mask)
	// result: (VPSRAWMasked256const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAWMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAWMasked256const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAWMasked256const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRAWMasked256const [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRAWMasked256constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRAWMasked256constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAWMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRAWMasked512 x (MOVQconst [c]) mask)
	// result: (VPSRAWMasked512const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRAWMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRAWMasked512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRAWMasked512const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLD128 x (MOVQconst [c]))
	// result: (VPSRLD128const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRLD128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLD128const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRLD128const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLD256 x (MOVQconst [c]))
	// result: (VPSRLD256const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRLD256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLD256const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRLD256const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLD512 x (MOVQconst [c]))
	// result: (VPSRLD512const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRLD512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLD512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRLD512const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRLD512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLD512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLD512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLDMasked128 x (MOVQconst [c]) mask)
	// result: (VPSRLDMasked128const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLDMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLDMasked128const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLDMasked128const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRLDMasked128const [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLDMasked128constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLDMasked128constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLDMasked256 x (MOVQconst [c]) mask)
	// result: (VPSRLDMasked256const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLDMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLDMasked256const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLDMasked256const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRLDMasked256const [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLDMasked256constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLDMasked256constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLDMasked512 x (MOVQconst [c]) mask)
	// result: (VPSRLDMasked512const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLDMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLDMasked512const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLDMasked512const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRLDMasked512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLDMasked512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLDMasked512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLQ128 x (MOVQconst [c]))
	// result: (VPSRLQ128const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRLQ128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQ128const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRLQ128const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLQ256 x (MOVQconst [c]))
	// result: (VPSRLQ256const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRLQ256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQ256const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRLQ256const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLQ512 x (MOVQconst [c]))
	// result: (VPSRLQ512const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRLQ512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQ512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRLQ512const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRLQ512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLQ512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLQ512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLQMasked128 x (MOVQconst [c]) mask)
	// result: (VPSRLQMasked128const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLQMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQMasked128const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLQMasked128const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRLQMasked128const [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLQMasked128constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLQMasked128constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLQMasked256 x (MOVQconst [c]) mask)
	// result: (VPSRLQMasked256const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLQMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQMasked256const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLQMasked256const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRLQMasked256const [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLQMasked256constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLQMasked256constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLQMasked512 x (MOVQconst [c]) mask)
	// result: (VPSRLQMasked512const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLQMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLQMasked512const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLQMasked512const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRLQMasked512const [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLQMasked512constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLQMasked512constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVQMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVQMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVQMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVWMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLVWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLVWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLVWMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLVWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLW128 x (MOVQconst [c]))
	// result: (VPSRLW128const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRLW128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLW128const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRLW128const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLW256 x (MOVQconst [c]))
	// result: (VPSRLW256const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRLW256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLW256const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRLW256const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLW512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLW512 x (MOVQconst [c]))
	// result: (VPSRLW512const [amd64CapAVXShift(c)] x)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		v.Reset(ssaop.OpAMD64VPSRLW512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLW512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRLW512const [a] x)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLWMasked128 x (MOVQconst [c]) mask)
	// result: (VPSRLWMasked128const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLWMasked128const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLWMasked128const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLWMasked128const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRLWMasked128const [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLWMasked128constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLWMasked128constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLWMasked256 x (MOVQconst [c]) mask)
	// result: (VPSRLWMasked256const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLWMasked256const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLWMasked256const(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLWMasked256const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	// match: (VPSRLWMasked256const [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSRLWMasked256constload {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSRLWMasked256constload)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLWMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSRLWMasked512 x (MOVQconst [c]) mask)
	// result: (VPSRLWMasked512const [amd64CapAVXShift(c)] x mask)
	for {
		x := v_0
		if v_1.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		c := ssa.AuxIntToInt64(v_1.AuxInt)
		mask := v_2
		v.Reset(ssaop.OpAMD64VPSRLWMasked512const)
		v.AuxInt = ssa.Uint8ToAuxInt(amd64CapAVXShift(c))
		v.AddArg2(x, mask)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSRLWMasked512const(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VPSRLWMasked512const [a] x mask)
	// cond: a==0
	// result: x
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		if !(a == 0) {
			break
		}
		v.CopyOf(x)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBB128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBB256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBBMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBBMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBBMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBBMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBQMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBQMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBQMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBQMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBQMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBQMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBSB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBSB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBSB128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBSB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBSB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBSB256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBSBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBSBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBSBMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSBMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBSBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBSBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBSBMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSBMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBSW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBSW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBSW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBSW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBSW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBSW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBSWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBSWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBSWMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBSWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBSWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBSWMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBSWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBUSB128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBUSB128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBUSB128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSB128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBUSB256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBUSB256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBUSB256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSB256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBUSBMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBUSBMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBUSBMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSBMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBUSBMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBUSBMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBUSBMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSBMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBUSW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBUSW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBUSW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBUSW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBUSW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBUSW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBUSWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBUSWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBUSWMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBUSWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBUSWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBUSWMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBUSWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBWMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBWMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBWMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBWMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPSUBWMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPSUBWMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPSUBWMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPSUBWMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPTERNLOGD128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPTERNLOGD128 [c] x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPTERNLOGD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x y ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPTERNLOGD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPTERNLOGD256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPTERNLOGD256 [c] x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPTERNLOGD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x y ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPTERNLOGD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPTERNLOGD512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPTERNLOGD512 [c] x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPTERNLOGD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x y ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPTERNLOGD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPTERNLOGQ128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPTERNLOGQ128 [c] x y l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPTERNLOGQ128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x y ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPTERNLOGQ128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPTERNLOGQ256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPTERNLOGQ256 [c] x y l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPTERNLOGQ256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x y ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPTERNLOGQ256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPTERNLOGQ512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPTERNLOGQ512 [c] x y l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPTERNLOGQ512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x y ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		y := v_1
		l := v_2
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPTERNLOGQ512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, y, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKHBW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKHBW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKHBW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKHBW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKHBW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKHBW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKHBW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKHBW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKHDQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKHDQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKHDQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKHDQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKHDQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKHDQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKHDQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKHDQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKHDQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKHDQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKHDQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKHDQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKHQDQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKHQDQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKHQDQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKHQDQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKHQDQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKHQDQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKHQDQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKHQDQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKHQDQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKHQDQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKHQDQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKHQDQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKHWD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKHWD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKHWD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKHWD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKHWD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKHWD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKHWD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKHWD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKLBW128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKLBW128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKLBW128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKLBW128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKLBW256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKLBW256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKLBW256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKLBW256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKLDQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKLDQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKLDQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKLDQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKLDQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKLDQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKLDQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKLDQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKLDQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKLDQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKLDQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKLDQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKLQDQ128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKLQDQ128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKLQDQ128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKLQDQ128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKLQDQ256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKLQDQ256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKLQDQ256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKLQDQ256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKLQDQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKLQDQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKLQDQ512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKLQDQ512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKLWD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKLWD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKLWD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKLWD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPUNPCKLWD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPUNPCKLWD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPUNPCKLWD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VPUNPCKLWD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VPXOR128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (VPXOR128 (VPMOVMToVec8x16 x) (VPMOVMToVec8x16 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec8x16 (KXORW x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x16 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x16 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec8x16)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORW, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXOR128 (VPMOVMToVec16x8 x) (VPMOVMToVec16x8 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec16x8 (KXORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x8 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x8 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec16x8)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXOR128 (VPMOVMToVec32x4 x) (VPMOVMToVec32x4 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec32x4 (KXORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x4 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x4 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec32x4)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXOR128 (VPMOVMToVec64x2 x) (VPMOVMToVec64x2 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec64x2 (KXORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x2 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x2 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec64x2)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXOR128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPXOR128load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPXOR128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPXOR256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (VPXOR256 (VPMOVMToVec8x32 x) (VPMOVMToVec8x32 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec8x32 (KXORD x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x32 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x32 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec8x32)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORD, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXOR256 (VPMOVMToVec16x16 x) (VPMOVMToVec16x16 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec16x16 (KXORW x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x16 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x16 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec16x16)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORW, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXOR256 (VPMOVMToVec32x8 x) (VPMOVMToVec32x8 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec32x8 (KXORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x8 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x8 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec32x8)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXOR256 (VPMOVMToVec64x4 x) (VPMOVMToVec64x4 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec64x4 (KXORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x4 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x4 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec64x4)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXOR256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPXOR256load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPXOR256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPXORD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (VPXORD512 (VPMOVMToVec8x64 x) (VPMOVMToVec8x64 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec8x64 (KXORQ x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec8x64 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec8x64 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORQ, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXORD512 (VPMOVMToVec16x32 x) (VPMOVMToVec16x32 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec16x32 (KXORD x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec16x32 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec16x32 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORD, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXORD512 (VPMOVMToVec32x16 x) (VPMOVMToVec32x16 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec32x16 (KXORW x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec32x16 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORW, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXORD512 (VPMOVMToVec64x8 x) (VPMOVMToVec64x8 y))
	// cond: v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)
	// result: (VPMOVMToVec64x8 (KXORB x y))
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
				continue
			}
			x := v_0.Args[0]
			if v_1.Op != ssaop.OpAMD64VPMOVMToVec64x8 {
				continue
			}
			y := v_1.Args[0]
			if !(v.Block.CPUfeatures.HasFeature(ssa.CPUavx512)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
			v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KXORB, typ.Mask)
			v0.AddArg2(x, y)
			v.AddArg(v0)
			return true
		}
		break
	}
	// match: (VPXORD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPXORD512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPXORD512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPXORDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPXORDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPXORDMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPXORDMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPXORDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPXORDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPXORDMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPXORDMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPXORDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPXORDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPXORDMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPXORDMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPXORQ512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPXORQ512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPXORQ512load {sym} [off] x ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPXORQ512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPXORQMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPXORQMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPXORQMasked128load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload128 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPXORQMasked128load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPXORQMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPXORQMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPXORQMasked256load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload256 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPXORQMasked256load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VPXORQMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VPXORQMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VPXORQMasked512load {sym} [off] x ptr mask mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64VMOVDQUload512 {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			mask := v_2
			if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64VPXORQMasked512load)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg4(x, ptr, mask, mem)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64VRCP14PD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRCP14PD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCP14PD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCP14PD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRCP14PD256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCP14PD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCP14PD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRCP14PD512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCP14PD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCP14PDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRCP14PDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCP14PDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCP14PDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRCP14PDMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCP14PDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCP14PDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRCP14PDMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCP14PDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCP14PS512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRCP14PS512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCP14PS512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCP14PSMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRCP14PSMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCP14PSMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCP14PSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRCP14PSMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCP14PSMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCP14PSMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRCP14PSMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCP14PSMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCP14PSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCPPS128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRCPPS128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCPPS128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCPPS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRCPPS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRCPPS256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRCPPS256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRCPPS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VREDUCEPD128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VREDUCEPD256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VREDUCEPD512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VREDUCEPDMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPDMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPDMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VREDUCEPDMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPDMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPDMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VREDUCEPDMasked512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPDMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPDMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPS128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VREDUCEPS128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPS128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPS128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VREDUCEPS256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPS256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPS256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPS512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VREDUCEPS512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPS512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPS512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPSMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VREDUCEPSMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPSMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPSMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VREDUCEPSMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPSMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPSMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VREDUCEPSMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VREDUCEPSMasked512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VREDUCEPSMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VREDUCEPSMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRNDSCALEPD128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRNDSCALEPD256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRNDSCALEPD512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRNDSCALEPDMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPDMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPDMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRNDSCALEPDMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPDMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPDMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRNDSCALEPDMasked512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPDMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPDMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPS128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRNDSCALEPS128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPS128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPS128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRNDSCALEPS256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPS256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPS256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPS512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRNDSCALEPS512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPS512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPS512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPSMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRNDSCALEPSMasked128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPSMasked128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPSMasked128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRNDSCALEPSMasked256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPSMasked256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPSMasked256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRNDSCALEPSMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRNDSCALEPSMasked512 [c] l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRNDSCALEPSMasked512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mask mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRNDSCALEPSMasked512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VROUNDPD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VROUNDPD128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VROUNDPD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VROUNDPD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VROUNDPD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VROUNDPD256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VROUNDPD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VROUNDPD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VROUNDPS128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VROUNDPS128 [c] l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VROUNDPS128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VROUNDPS128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VROUNDPS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VROUNDPS256 [c] l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VROUNDPS256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VROUNDPS256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRT14PD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRSQRT14PD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRT14PD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRT14PD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRSQRT14PD256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRT14PD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRT14PD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRSQRT14PD512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRT14PD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRT14PDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRSQRT14PDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRT14PDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRT14PDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRSQRT14PDMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRT14PDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRT14PDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRSQRT14PDMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRT14PDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRT14PS512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRSQRT14PS512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRT14PS512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRT14PSMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRSQRT14PSMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRT14PSMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRT14PSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRSQRT14PSMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRT14PSMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRT14PSMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VRSQRT14PSMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRT14PSMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRT14PSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRTPS128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRSQRTPS128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRTPS128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRTPS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VRSQRTPS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VRSQRTPS256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VRSQRTPS256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VRSQRTPS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPS128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPS128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPS256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPS512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPS512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPS512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPSMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPSMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPSMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPSMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPSMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPSMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSCALEFPSMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSCALEFPSMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSCALEFPSMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSCALEFPSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSHUFPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSHUFPD128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSHUFPD128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSHUFPD128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSHUFPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSHUFPD256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSHUFPD256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSHUFPD256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSHUFPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSHUFPD512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSHUFPD512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSHUFPD512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSHUFPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSHUFPS128 [c] x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSHUFPS128load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSHUFPS128load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSHUFPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSHUFPS256 [c] x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSHUFPS256load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSHUFPS256load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSHUFPS512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSHUFPS512 [c] x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSHUFPS512load {sym} [ssa.MakeValAndOff(int32(uint8(c)),off)] x ptr mem)
	for {
		c := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSHUFPS512load)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(int32(uint8(c)), off))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPD128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VSQRTPD128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPD128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPD256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VSQRTPD256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPD256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPD512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VSQRTPD512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPD512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPDMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSQRTPDMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPDMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPDMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSQRTPDMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPDMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPDMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSQRTPDMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPDMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPS128(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VSQRTPS128 l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPS128load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPS256(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VSQRTPS256 l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPS256load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPS512(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (VSQRTPS512 l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPS512load {sym} [off] ptr mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPSMasked128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSQRTPSMasked128 l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPSMasked128load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPSMasked256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSQRTPSMasked256 l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPSMasked256load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSQRTPSMasked512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSQRTPSMasked512 l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSQRTPSMasked512load {sym} [off] ptr mask mem)
	for {
		l := v_0
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_1
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSQRTPSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPD128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPD128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPD128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPD128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPD256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPD256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPD256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPD256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPD512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPD512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPD512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPD512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPDMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPDMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPDMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPDMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPDMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPDMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPDMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPDMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPDMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPDMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPDMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPDMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPS128(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPS128 x l:(VMOVDQUload128 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPS128load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPS128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPS256(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPS256 x l:(VMOVDQUload256 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPS256load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPS256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPS512(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPS512 x l:(VMOVDQUload512 {sym} [off] ptr mem))
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPS512load {sym} [off] x ptr mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPS512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(x, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPSMasked128(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPSMasked128 x l:(VMOVDQUload128 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPSMasked128load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload128 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPSMasked128load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPSMasked256(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPSMasked256 x l:(VMOVDQUload256 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPSMasked256load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload256 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPSMasked256load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64VSUBPSMasked512(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (VSUBPSMasked512 x l:(VMOVDQUload512 {sym} [off] ptr mem) mask)
	// cond: ssa.CanMergeLoad(v, l) && ssa.Clobber(l)
	// result: (VSUBPSMasked512load {sym} [off] x ptr mask mem)
	for {
		x := v_0
		l := v_1
		if l.Op != ssaop.OpAMD64VMOVDQUload512 {
			break
		}
		off := ssa.AuxIntToInt32(l.AuxInt)
		sym := ssa.AuxToSym(l.Aux)
		mem := l.Args[1]
		ptr := l.Args[0]
		mask := v_2
		if !(ssa.CanMergeLoad(v, l) && ssa.Clobber(l)) {
			break
		}
		v.Reset(ssaop.OpAMD64VSUBPSMasked512load)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg4(x, ptr, mask, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XADDLlock(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XADDLlock [off1] {sym} val (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (XADDLlock [off1+off2] {sym} val ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		ptr := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64XADDLlock)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XADDQlock(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XADDQlock [off1] {sym} val (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (XADDQlock [off1+off2] {sym} val ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		ptr := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64XADDQlock)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XCHGL(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XCHGL [off1] {sym} val (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (XCHGL [off1+off2] {sym} val ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		ptr := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64XCHGL)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, ptr, mem)
		return true
	}
	// match: (XCHGL [off1] {sym1} val (LEAQ [off2] {sym2} ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && ptr.Op != ssaop.OpSB
	// result: (XCHGL [off1+off2] {ssa.MergeSym(sym1,sym2)} val ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		ptr := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && ptr.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64XCHGL)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XCHGQ(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XCHGQ [off1] {sym} val (ADDQconst [off2] ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (XCHGQ [off1+off2] {sym} val ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		ptr := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64XCHGQ)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, ptr, mem)
		return true
	}
	// match: (XCHGQ [off1] {sym1} val (LEAQ [off2] {sym2} ptr) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && ptr.Op != ssaop.OpSB
	// result: (XCHGQ [off1+off2] {ssa.MergeSym(sym1,sym2)} val ptr mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		ptr := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2) && ptr.Op != ssaop.OpSB) {
			break
		}
		v.Reset(ssaop.OpAMD64XCHGQ)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XORBconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XORBconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (XORBconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (XORBconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (XORBconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORBconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XORL(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XORL (SHLL (MOVLconst [1]) y) x)
	// result: (BTCL x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64SHLL {
				continue
			}
			y := v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_0_0.AuxInt) != 1 {
				continue
			}
			x := v_1
			v.Reset(ssaop.OpAMD64BTCL)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (XORL x (MOVLconst [c]))
	// result: (XORLconst [c] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVLconst {
				continue
			}
			c := ssa.AuxIntToInt32(v_1.AuxInt)
			v.Reset(ssaop.OpAMD64XORLconst)
			v.AuxInt = ssa.Int32ToAuxInt(c)
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (XORL x x)
	// result: (MOVLconst [0])
	for {
		x := v_0
		if x != v_1 {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (XORL x l:(MOVLload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (XORLload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVLload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64XORLload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	// match: (XORL x (ADDLconst [-1] x))
	// cond: buildcfg.GOAMD64 >= 3
	// result: (BLSMSKL x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64ADDLconst || ssa.AuxIntToInt32(v_1.AuxInt) != -1 || x != v_1.Args[0] || !(buildcfg.GOAMD64 >= 3) {
				continue
			}
			v.Reset(ssaop.OpAMD64BLSMSKL)
			v.AddArg(x)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64XORLconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (XORLconst [1] (SETNE x))
	// result: (SETEQ x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64SETNE {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETEQ)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [1] (SETEQ x))
	// result: (SETNE x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64SETEQ {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETNE)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [1] (SETL x))
	// result: (SETGE x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64SETL {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETGE)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [1] (SETGE x))
	// result: (SETL x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64SETGE {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETL)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [1] (SETLE x))
	// result: (SETG x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64SETLE {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETG)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [1] (SETG x))
	// result: (SETLE x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64SETG {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETLE)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [1] (SETB x))
	// result: (SETAE x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64SETB {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETAE)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [1] (SETAE x))
	// result: (SETB x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64SETAE {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETB)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [1] (SETBE x))
	// result: (SETA x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64SETBE {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETA)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [1] (SETA x))
	// result: (SETBE x)
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 1 || v_0.Op != ssaop.OpAMD64SETA {
			break
		}
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETBE)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [c] (XORLconst [d] x))
	// result: (XORLconst [c ^ d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64XORLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64XORLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c ^ d)
		v.AddArg(x)
		return true
	}
	// match: (XORLconst [0] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (XORLconst [c] (MOVLconst [d]))
	// result: (MOVLconst [c^d])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVLconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c ^ d)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XORLconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XORLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (XORLconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (XORLconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (XORLconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORLconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XORLload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (XORLload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (XORLload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64XORLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (XORLload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (XORLload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORLload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (XORLload x [off] {sym} ptr (MOVSSstore [off] {sym} ptr y _))
	// result: (XORL x (MOVLf2i y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVSSstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64XORL)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVLf2i, typ.UInt32)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XORLmodify(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XORLmodify [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (XORLmodify [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64XORLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (XORLmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (XORLmodify [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORLmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XORQ(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XORQ (SHLQ (MOVQconst [1]) y) x)
	// result: (BTCQ x y)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64SHLQ {
				continue
			}
			y := v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_0_0.AuxInt) != 1 {
				continue
			}
			x := v_1
			v.Reset(ssaop.OpAMD64BTCQ)
			v.AddArg2(x, y)
			return true
		}
		break
	}
	// match: (XORQ (MOVQconst [c]) x)
	// cond: ssa.IsPowerOfTwo(uint64(c)) && uint64(c) >= 1<<31
	// result: (BTCQconst [int8(ssa.Log64u(uint64(c)))] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			if v_0.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_0.AuxInt)
			x := v_1
			if !(ssa.IsPowerOfTwo(uint64(c)) && uint64(c) >= 1<<31) {
				continue
			}
			v.Reset(ssaop.OpAMD64BTCQconst)
			v.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log64u(uint64(c))))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (XORQ x (MOVQconst [c]))
	// cond: ssa.Is32Bit(c)
	// result: (XORQconst [int32(c)] x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64MOVQconst {
				continue
			}
			c := ssa.AuxIntToInt64(v_1.AuxInt)
			if !(ssa.Is32Bit(c)) {
				continue
			}
			v.Reset(ssaop.OpAMD64XORQconst)
			v.AuxInt = ssa.Int32ToAuxInt(int32(c))
			v.AddArg(x)
			return true
		}
		break
	}
	// match: (XORQ x x)
	// result: (MOVLconst [0])
	for {
		x := v_0
		if x != v_1 {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(0)
		return true
	}
	// match: (XORQ x l:(MOVQload [off] {sym} ptr mem))
	// cond: ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)
	// result: (XORQload x [off] {sym} ptr mem)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			l := v_1
			if l.Op != ssaop.OpAMD64MOVQload {
				continue
			}
			off := ssa.AuxIntToInt32(l.AuxInt)
			sym := ssa.AuxToSym(l.Aux)
			mem := l.Args[1]
			ptr := l.Args[0]
			if !(ssa.CanMergeLoadClobber(v, l, x) && ssa.Clobber(l)) {
				continue
			}
			v.Reset(ssaop.OpAMD64XORQload)
			v.AuxInt = ssa.Int32ToAuxInt(off)
			v.Aux = ssa.SymToAux(sym)
			v.AddArg3(x, ptr, mem)
			return true
		}
		break
	}
	// match: (XORQ x (ADDQconst [-1] x))
	// cond: buildcfg.GOAMD64 >= 3
	// result: (BLSMSKQ x)
	for {
		for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
			x := v_0
			if v_1.Op != ssaop.OpAMD64ADDQconst || ssa.AuxIntToInt32(v_1.AuxInt) != -1 || x != v_1.Args[0] || !(buildcfg.GOAMD64 >= 3) {
				continue
			}
			v.Reset(ssaop.OpAMD64BLSMSKQ)
			v.AddArg(x)
			return true
		}
		break
	}
	return false
}
func rewriteValue_OpAMD64XORQconst(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (XORQconst [c] (XORQconst [d] x))
	// result: (XORQconst [c ^ d] x)
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64XORQconst {
			break
		}
		d := ssa.AuxIntToInt32(v_0.AuxInt)
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64XORQconst)
		v.AuxInt = ssa.Int32ToAuxInt(c ^ d)
		v.AddArg(x)
		return true
	}
	// match: (XORQconst [0] x)
	// result: x
	for {
		if ssa.AuxIntToInt32(v.AuxInt) != 0 {
			break
		}
		x := v_0
		v.CopyOf(x)
		return true
	}
	// match: (XORQconst [c] (MOVQconst [d]))
	// result: (MOVQconst [int64(c)^d])
	for {
		c := ssa.AuxIntToInt32(v.AuxInt)
		if v_0.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		d := ssa.AuxIntToInt64(v_0.AuxInt)
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(int64(c) ^ d)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XORQconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XORQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (XORQconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (XORQconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (XORQconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORQconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XORQload(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (XORQload [off1] {sym} val (ADDQconst [off2] base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (XORQload [off1+off2] {sym} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64XORQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (XORQload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (XORQload [off1+off2] {ssa.MergeSym(sym1,sym2)} val base mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		val := v_0
		if v_1.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_1.AuxInt)
		sym2 := ssa.AuxToSym(v_1.Aux)
		base := v_1.Args[0]
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORQload)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(val, base, mem)
		return true
	}
	// match: (XORQload x [off] {sym} ptr (MOVSDstore [off] {sym} ptr y _))
	// result: (XORQ x (MOVQf2i y))
	for {
		off := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		x := v_0
		ptr := v_1
		if v_2.Op != ssaop.OpAMD64MOVSDstore || ssa.AuxIntToInt32(v_2.AuxInt) != off || ssa.AuxToSym(v_2.Aux) != sym {
			break
		}
		y := v_2.Args[1]
		if ptr != v_2.Args[0] {
			break
		}
		v.Reset(ssaop.OpAMD64XORQ)
		v0 := b.NewValue0(v_2.Pos, ssaop.OpAMD64MOVQf2i, typ.UInt64)
		v0.AddArg(y)
		v.AddArg2(x, v0)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XORQmodify(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XORQmodify [off1] {sym} (ADDQconst [off2] base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2))
	// result: (XORQmodify [off1+off2] {sym} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1) + int64(off2))) {
			break
		}
		v.Reset(ssaop.OpAMD64XORQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(base, val, mem)
		return true
	}
	// match: (XORQmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem)
	// cond: ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)
	// result: (XORQmodify [off1+off2] {ssa.MergeSym(sym1,sym2)} base val mem)
	for {
		off1 := ssa.AuxIntToInt32(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		val := v_1
		mem := v_2
		if !(ssa.Is32Bit(int64(off1)+int64(off2)) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORQmodify)
		v.AuxInt = ssa.Int32ToAuxInt(off1 + off2)
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg3(base, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpAMD64XORWconstmodify(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (XORWconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2)
	// result: (XORWconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {sym} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64ADDQconst {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(sym)
		v.AddArg2(base, mem)
		return true
	}
	// match: (XORWconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem)
	// cond: ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)
	// result: (XORWconstmodify [ssa.ValAndOff(valoff1).AddOffset32(off2)] {ssa.MergeSym(sym1,sym2)} base mem)
	for {
		valoff1 := ssa.AuxIntToValAndOff(v.AuxInt)
		sym1 := ssa.AuxToSym(v.Aux)
		if v_0.Op != ssaop.OpAMD64LEAQ {
			break
		}
		off2 := ssa.AuxIntToInt32(v_0.AuxInt)
		sym2 := ssa.AuxToSym(v_0.Aux)
		base := v_0.Args[0]
		mem := v_1
		if !(ssa.ValAndOff(valoff1).CanAdd32(off2) && ssa.CanMergeSym(sym1, sym2)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORWconstmodify)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.ValAndOff(valoff1).AddOffset32(off2))
		v.Aux = ssa.SymToAux(ssa.MergeSym(sym1, sym2))
		v.AddArg2(base, mem)
		return true
	}
	return false
}
func rewriteValue_OpAddr(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (Addr {sym} base)
	// result: (LEAQ {sym} base)
	for {
		sym := ssa.AuxToSym(v.Aux)
		base := v_0
		v.Reset(ssaop.OpAMD64LEAQ)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg(base)
		return true
	}
}
func rewriteValue_OpAtomicAdd32(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (AtomicAdd32 ptr val mem)
	// result: (AddTupleFirst32 val (XADDLlock val ptr mem))
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64AddTupleFirst32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64XADDLlock, types.NewTuple(typ.UInt32, types.TypeMem))
		v0.AddArg3(val, ptr, mem)
		v.AddArg2(val, v0)
		return true
	}
}
func rewriteValue_OpAtomicAdd64(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (AtomicAdd64 ptr val mem)
	// result: (AddTupleFirst64 val (XADDQlock val ptr mem))
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64AddTupleFirst64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64XADDQlock, types.NewTuple(typ.UInt64, types.TypeMem))
		v0.AddArg3(val, ptr, mem)
		v.AddArg2(val, v0)
		return true
	}
}
func rewriteValue_OpAtomicAnd32(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicAnd32 ptr val mem)
	// result: (ANDLlock ptr val mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64ANDLlock)
		v.AddArg3(ptr, val, mem)
		return true
	}
}
func rewriteValue_OpAtomicAnd32value(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicAnd32value ptr val mem)
	// result: (LoweredAtomicAnd32 ptr val mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64LoweredAtomicAnd32)
		v.AddArg3(ptr, val, mem)
		return true
	}
}
func rewriteValue_OpAtomicAnd64value(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicAnd64value ptr val mem)
	// result: (LoweredAtomicAnd64 ptr val mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64LoweredAtomicAnd64)
		v.AddArg3(ptr, val, mem)
		return true
	}
}
func rewriteValue_OpAtomicAnd8(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicAnd8 ptr val mem)
	// result: (ANDBlock ptr val mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64ANDBlock)
		v.AddArg3(ptr, val, mem)
		return true
	}
}
func rewriteValue_OpAtomicCompareAndSwap32(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicCompareAndSwap32 ptr old new_ mem)
	// result: (CMPXCHGLlock ptr old new_ mem)
	for {
		ptr := v_0
		old := v_1
		new_ := v_2
		mem := v_3
		v.Reset(ssaop.OpAMD64CMPXCHGLlock)
		v.AddArg4(ptr, old, new_, mem)
		return true
	}
}
func rewriteValue_OpAtomicCompareAndSwap64(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicCompareAndSwap64 ptr old new_ mem)
	// result: (CMPXCHGQlock ptr old new_ mem)
	for {
		ptr := v_0
		old := v_1
		new_ := v_2
		mem := v_3
		v.Reset(ssaop.OpAMD64CMPXCHGQlock)
		v.AddArg4(ptr, old, new_, mem)
		return true
	}
}
func rewriteValue_OpAtomicExchange32(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicExchange32 ptr val mem)
	// result: (XCHGL val ptr mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64XCHGL)
		v.AddArg3(val, ptr, mem)
		return true
	}
}
func rewriteValue_OpAtomicExchange64(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicExchange64 ptr val mem)
	// result: (XCHGQ val ptr mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64XCHGQ)
		v.AddArg3(val, ptr, mem)
		return true
	}
}
func rewriteValue_OpAtomicExchange8(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicExchange8 ptr val mem)
	// result: (XCHGB val ptr mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64XCHGB)
		v.AddArg3(val, ptr, mem)
		return true
	}
}
func rewriteValue_OpAtomicLoad32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicLoad32 ptr mem)
	// result: (MOVLatomicload ptr mem)
	for {
		ptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVLatomicload)
		v.AddArg2(ptr, mem)
		return true
	}
}
func rewriteValue_OpAtomicLoad64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicLoad64 ptr mem)
	// result: (MOVQatomicload ptr mem)
	for {
		ptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVQatomicload)
		v.AddArg2(ptr, mem)
		return true
	}
}
func rewriteValue_OpAtomicLoad8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicLoad8 ptr mem)
	// result: (MOVBatomicload ptr mem)
	for {
		ptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVBatomicload)
		v.AddArg2(ptr, mem)
		return true
	}
}
func rewriteValue_OpAtomicLoadPtr(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicLoadPtr ptr mem)
	// result: (MOVQatomicload ptr mem)
	for {
		ptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVQatomicload)
		v.AddArg2(ptr, mem)
		return true
	}
}
func rewriteValue_OpAtomicOr32(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicOr32 ptr val mem)
	// result: (ORLlock ptr val mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64ORLlock)
		v.AddArg3(ptr, val, mem)
		return true
	}
}
func rewriteValue_OpAtomicOr32value(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicOr32value ptr val mem)
	// result: (LoweredAtomicOr32 ptr val mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64LoweredAtomicOr32)
		v.AddArg3(ptr, val, mem)
		return true
	}
}
func rewriteValue_OpAtomicOr64value(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicOr64value ptr val mem)
	// result: (LoweredAtomicOr64 ptr val mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64LoweredAtomicOr64)
		v.AddArg3(ptr, val, mem)
		return true
	}
}
func rewriteValue_OpAtomicOr8(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (AtomicOr8 ptr val mem)
	// result: (ORBlock ptr val mem)
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64ORBlock)
		v.AddArg3(ptr, val, mem)
		return true
	}
}
func rewriteValue_OpAtomicStore32(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (AtomicStore32 ptr val mem)
	// result: (Select1 (XCHGL <types.NewTuple(typ.UInt32,types.TypeMem)> val ptr mem))
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64XCHGL, types.NewTuple(typ.UInt32, types.TypeMem))
		v0.AddArg3(val, ptr, mem)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpAtomicStore64(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (AtomicStore64 ptr val mem)
	// result: (Select1 (XCHGQ <types.NewTuple(typ.UInt64,types.TypeMem)> val ptr mem))
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64XCHGQ, types.NewTuple(typ.UInt64, types.TypeMem))
		v0.AddArg3(val, ptr, mem)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpAtomicStore8(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (AtomicStore8 ptr val mem)
	// result: (Select1 (XCHGB <types.NewTuple(typ.UInt8,types.TypeMem)> val ptr mem))
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64XCHGB, types.NewTuple(typ.UInt8, types.TypeMem))
		v0.AddArg3(val, ptr, mem)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpAtomicStorePtrNoWB(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (AtomicStorePtrNoWB ptr val mem)
	// result: (Select1 (XCHGQ <types.NewTuple(typ.BytePtr,types.TypeMem)> val ptr mem))
	for {
		ptr := v_0
		val := v_1
		mem := v_2
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64XCHGQ, types.NewTuple(typ.BytePtr, types.TypeMem))
		v0.AddArg3(val, ptr, mem)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpBitLen16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (BitLen16 x)
	// cond: buildcfg.GOAMD64 < 3
	// result: (BSRL (LEAL1 <typ.UInt32> [1] (MOVWQZX <typ.UInt32> x) (MOVWQZX <typ.UInt32> x)))
	for {
		x := v_0
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpAMD64BSRL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64LEAL1, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVWQZX, typ.UInt32)
		v1.AddArg(x)
		v0.AddArg2(v1, v1)
		v.AddArg(v0)
		return true
	}
	// match: (BitLen16 <t> x)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (NEGQ (ADDQconst <t> [-32] (LZCNTL (MOVWQZX <x.Type> x))))
	for {
		t := v.Type
		x := v_0
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64NEGQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ADDQconst, t)
		v0.AuxInt = ssa.Int32ToAuxInt(-32)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64LZCNTL, typ.UInt32)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVWQZX, x.Type)
		v2.AddArg(x)
		v1.AddArg(v2)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpBitLen32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (BitLen32 x)
	// cond: buildcfg.GOAMD64 < 3
	// result: (Select0 (BSRQ (LEAQ1 <typ.UInt64> [1] (MOVLQZX <typ.UInt64> x) (MOVLQZX <typ.UInt64> x))))
	for {
		x := v_0
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BSRQ, types.NewTuple(typ.UInt64, types.TypeFlags))
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64LEAQ1, typ.UInt64)
		v1.AuxInt = ssa.Int32ToAuxInt(1)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLQZX, typ.UInt64)
		v2.AddArg(x)
		v1.AddArg2(v2, v2)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	// match: (BitLen32 <t> x)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (NEGQ (ADDQconst <t> [-32] (LZCNTL x)))
	for {
		t := v.Type
		x := v_0
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64NEGQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ADDQconst, t)
		v0.AuxInt = ssa.Int32ToAuxInt(-32)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64LZCNTL, typ.UInt32)
		v1.AddArg(x)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpBitLen64(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (BitLen64 <t> x)
	// cond: buildcfg.GOAMD64 < 3
	// result: (ADDQconst [1] (CMOVQEQ <t> (Select0 <t> (BSRQ x)) (MOVQconst <t> [-1]) (Select1 <types.TypeFlags> (BSRQ x))))
	for {
		t := v.Type
		x := v_0
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMOVQEQ, t)
		v1 := b.NewValue0(v.Pos, ssaop.OpSelect0, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64BSRQ, types.NewTuple(typ.UInt64, types.TypeFlags))
		v2.AddArg(x)
		v1.AddArg(v2)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQconst, t)
		v3.AuxInt = ssa.Int64ToAuxInt(-1)
		v4 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v4.AddArg(v2)
		v0.AddArg3(v1, v3, v4)
		v.AddArg(v0)
		return true
	}
	// match: (BitLen64 <t> x)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (NEGQ (ADDQconst <t> [-64] (LZCNTQ x)))
	for {
		t := v.Type
		x := v_0
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64NEGQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ADDQconst, t)
		v0.AuxInt = ssa.Int32ToAuxInt(-64)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64LZCNTQ, typ.UInt64)
		v1.AddArg(x)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpBitLen8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (BitLen8 x)
	// cond: buildcfg.GOAMD64 < 3
	// result: (BSRL (LEAL1 <typ.UInt32> [1] (MOVBQZX <typ.UInt32> x) (MOVBQZX <typ.UInt32> x)))
	for {
		x := v_0
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpAMD64BSRL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64LEAL1, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(1)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBQZX, typ.UInt32)
		v1.AddArg(x)
		v0.AddArg2(v1, v1)
		v.AddArg(v0)
		return true
	}
	// match: (BitLen8 <t> x)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (NEGQ (ADDQconst <t> [-32] (LZCNTL (MOVBQZX <x.Type> x))))
	for {
		t := v.Type
		x := v_0
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64NEGQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ADDQconst, t)
		v0.AuxInt = ssa.Int32ToAuxInt(-32)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64LZCNTL, typ.UInt32)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBQZX, x.Type)
		v2.AddArg(x)
		v1.AddArg(v2)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpBswap16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (Bswap16 x)
	// result: (ROLWconst [8] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64ROLWconst)
		v.AuxInt = ssa.Int8ToAuxInt(8)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeil(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (Ceil x)
	// result: (ROUNDSD [2] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64ROUNDSD)
		v.AuxInt = ssa.Int8ToAuxInt(2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilFloat32x4 x)
	// result: (VROUNDPS128 [2] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilFloat32x8 x)
	// result: (VROUNDPS256 [2] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilFloat64x2 x)
	// result: (VROUNDPD128 [2] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilFloat64x4 x)
	// result: (VROUNDPD256 [2] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledFloat32x16 [a] x)
	// result: (VRNDSCALEPS512 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledFloat32x4 [a] x)
	// result: (VRNDSCALEPS128 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledFloat32x8 [a] x)
	// result: (VRNDSCALEPS256 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledFloat64x2 [a] x)
	// result: (VRNDSCALEPD128 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledFloat64x4 [a] x)
	// result: (VRNDSCALEPD256 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledFloat64x8 [a] x)
	// result: (VRNDSCALEPD512 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledResidueFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledResidueFloat32x16 [a] x)
	// result: (VREDUCEPS512 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledResidueFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledResidueFloat32x4 [a] x)
	// result: (VREDUCEPS128 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledResidueFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledResidueFloat32x8 [a] x)
	// result: (VREDUCEPS256 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledResidueFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledResidueFloat64x2 [a] x)
	// result: (VREDUCEPD128 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledResidueFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledResidueFloat64x4 [a] x)
	// result: (VREDUCEPD256 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCeilScaledResidueFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (CeilScaledResidueFloat64x8 [a] x)
	// result: (VREDUCEPD512 [a+2] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 2)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpCompressFloat32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressFloat32x16 x mask)
	// result: (VCOMPRESSPSMasked512 x (VPMOVVec32x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VCOMPRESSPSMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressFloat32x4 x mask)
	// result: (VCOMPRESSPSMasked128 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VCOMPRESSPSMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressFloat32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressFloat32x8 x mask)
	// result: (VCOMPRESSPSMasked256 x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VCOMPRESSPSMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressFloat64x2 x mask)
	// result: (VCOMPRESSPDMasked128 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VCOMPRESSPDMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressFloat64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressFloat64x4 x mask)
	// result: (VCOMPRESSPDMasked256 x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VCOMPRESSPDMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressFloat64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressFloat64x8 x mask)
	// result: (VCOMPRESSPDMasked512 x (VPMOVVec64x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VCOMPRESSPDMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt16x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt16x16 x mask)
	// result: (VPCOMPRESSWMasked256 x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSWMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt16x32 x mask)
	// result: (VPCOMPRESSWMasked512 x (VPMOVVec16x32ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSWMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt16x8 x mask)
	// result: (VPCOMPRESSWMasked128 x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSWMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt32x16 x mask)
	// result: (VPCOMPRESSDMasked512 x (VPMOVVec32x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSDMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt32x4 x mask)
	// result: (VPCOMPRESSDMasked128 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSDMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt32x8 x mask)
	// result: (VPCOMPRESSDMasked256 x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSDMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt64x2 x mask)
	// result: (VPCOMPRESSQMasked128 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSQMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt64x4 x mask)
	// result: (VPCOMPRESSQMasked256 x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSQMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt64x8 x mask)
	// result: (VPCOMPRESSQMasked512 x (VPMOVVec64x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSQMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt8x16 x mask)
	// result: (VPCOMPRESSBMasked128 x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSBMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt8x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt8x32 x mask)
	// result: (VPCOMPRESSBMasked256 x (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSBMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressInt8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressInt8x64 x mask)
	// result: (VPCOMPRESSBMasked512 x (VPMOVVec8x64ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSBMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x64ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint16x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint16x16 x mask)
	// result: (VPCOMPRESSWMasked256 x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSWMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint16x32 x mask)
	// result: (VPCOMPRESSWMasked512 x (VPMOVVec16x32ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSWMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint16x8 x mask)
	// result: (VPCOMPRESSWMasked128 x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSWMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint32x16 x mask)
	// result: (VPCOMPRESSDMasked512 x (VPMOVVec32x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSDMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint32x4 x mask)
	// result: (VPCOMPRESSDMasked128 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSDMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint32x8 x mask)
	// result: (VPCOMPRESSDMasked256 x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSDMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint64x2 x mask)
	// result: (VPCOMPRESSQMasked128 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSQMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint64x4 x mask)
	// result: (VPCOMPRESSQMasked256 x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSQMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint64x8 x mask)
	// result: (VPCOMPRESSQMasked512 x (VPMOVVec64x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSQMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint8x16 x mask)
	// result: (VPCOMPRESSBMasked128 x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSBMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint8x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint8x32 x mask)
	// result: (VPCOMPRESSBMasked256 x (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSBMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCompressUint8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CompressUint8x64 x mask)
	// result: (VPCOMPRESSBMasked512 x (VPMOVVec8x64ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPCOMPRESSBMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x64ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpCondSelect(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (CondSelect <t> x y (SETEQ cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQEQ y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETEQ {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQEQ)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETNE cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQNE y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETNE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQNE)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETL cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQLT y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETL {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQLT)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETG cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQGT y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETG {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQGT)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETLE cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQLE y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETLE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQLE)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETGE cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQGE y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETGE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQGE)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETA cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQHI y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETA {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQHI)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETB cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQCS y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETB {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQCS)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETAE cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQCC y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETAE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQCC)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETBE cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQLS y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETBE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQLS)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETEQF cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQEQF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETEQF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQEQF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETNEF cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQNEF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETNEF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQNEF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETGF cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQGTF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETGF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQGTF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETGEF cond))
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQGEF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETGEF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQGEF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETEQ cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLEQ y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETEQ {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLEQ)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETNE cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLNE y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETNE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLNE)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETL cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLLT y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETL {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLLT)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETG cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLGT y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETG {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLGT)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETLE cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLLE y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETLE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLLE)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETGE cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLGE y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETGE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLGE)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETA cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLHI y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETA {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLHI)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETB cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLCS y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETB {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLCS)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETAE cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLCC y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETAE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLCC)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETBE cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLLS y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETBE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLLS)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETEQF cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLEQF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETEQF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLEQF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETNEF cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLNEF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETNEF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLNEF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETGF cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLGTF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETGF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLGTF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETGEF cond))
	// cond: ssa.Is32BitInt(t)
	// result: (CMOVLGEF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETGEF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLGEF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETEQ cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWEQ y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETEQ {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWEQ)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETNE cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWNE y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETNE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWNE)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETL cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWLT y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETL {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWLT)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETG cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWGT y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETG {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWGT)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETLE cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWLE y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETLE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWLE)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETGE cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWGE y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETGE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWGE)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETA cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWHI y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETA {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWHI)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETB cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWCS y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETB {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWCS)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETAE cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWCC y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETAE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWCC)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETBE cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWLS y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETBE {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWLS)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETEQF cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWEQF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETEQF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWEQF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETNEF cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWNEF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETNEF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWNEF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETGF cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWGTF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETGF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWGTF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y (SETGEF cond))
	// cond: ssa.Is16BitInt(t)
	// result: (CMOVWGEF y x cond)
	for {
		t := v.Type
		x := v_0
		y := v_1
		if v_2.Op != ssaop.OpAMD64SETGEF {
			break
		}
		cond := v_2.Args[0]
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWGEF)
		v.AddArg3(y, x, cond)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 8 && (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQNE y x (CMPQconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 8 && (ssa.Is64BitInt(t) || ssa.IsPtr(t))) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 8 && ssa.Is32BitInt(t)
	// result: (CMOVLNE y x (CMPQconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 8 && ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 8 && ssa.Is16BitInt(t)
	// result: (CMOVWNE y x (CMPQconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 8 && ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 4 && (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQNE y x (CMPLconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 4 && (ssa.Is64BitInt(t) || ssa.IsPtr(t))) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 4 && ssa.Is32BitInt(t)
	// result: (CMOVLNE y x (CMPLconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 4 && ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 4 && ssa.Is16BitInt(t)
	// result: (CMOVWNE y x (CMPLconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 4 && ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 2 && (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQNE y x (CMPWconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 2 && (ssa.Is64BitInt(t) || ssa.IsPtr(t))) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v0.AuxInt = ssa.Int16ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 2 && ssa.Is32BitInt(t)
	// result: (CMOVLNE y x (CMPWconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 2 && ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v0.AuxInt = ssa.Int16ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 2 && ssa.Is16BitInt(t)
	// result: (CMOVWNE y x (CMPWconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 2 && ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v0.AuxInt = ssa.Int16ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 1 && (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (CMOVQNE y x (CMPBconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 1 && (ssa.Is64BitInt(t) || ssa.IsPtr(t))) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 1 && ssa.Is32BitInt(t)
	// result: (CMOVLNE y x (CMPBconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 1 && ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVLNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	// match: (CondSelect <t> x y check)
	// cond: !check.Type.IsFlags() && check.Type.Size() == 1 && ssa.Is16BitInt(t)
	// result: (CMOVWNE y x (CMPBconst [0] check))
	for {
		t := v.Type
		x := v_0
		y := v_1
		check := v_2
		if !(!check.Type.IsFlags() && check.Type.Size() == 1 && ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVWNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v0.AuxInt = ssa.Int8ToAuxInt(0)
		v0.AddArg(check)
		v.AddArg3(y, x, v0)
		return true
	}
	return false
}
func rewriteValue_OpConst16(v *ssa.Value) bool {
	// match: (Const16 [c])
	// result: (MOVLconst [int32(c)])
	for {
		c := ssa.AuxIntToInt16(v.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(int32(c))
		return true
	}
}
func rewriteValue_OpConst8(v *ssa.Value) bool {
	// match: (Const8 [c])
	// result: (MOVLconst [int32(c)])
	for {
		c := ssa.AuxIntToInt8(v.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(int32(c))
		return true
	}
}
func rewriteValue_OpConstBool(v *ssa.Value) bool {
	// match: (ConstBool [c])
	// result: (MOVLconst [ssa.B2i32(c)])
	for {
		c := ssa.AuxIntToBool(v.AuxInt)
		v.Reset(ssaop.OpAMD64MOVLconst)
		v.AuxInt = ssa.Int32ToAuxInt(ssa.B2i32(c))
		return true
	}
}
func rewriteValue_OpConstNil(v *ssa.Value) bool {
	// match: (ConstNil )
	// result: (MOVQconst [0])
	for {
		v.Reset(ssaop.OpAMD64MOVQconst)
		v.AuxInt = ssa.Int64ToAuxInt(0)
		return true
	}
}
func rewriteValue_OpCtz16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Ctz16 x)
	// result: (BSFL (ORLconst <typ.UInt32> [1<<16] x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64BSFL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORLconst, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(1 << 16)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCtz16NonZero(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (Ctz16NonZero x)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (TZCNTL x)
	for {
		x := v_0
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64TZCNTL)
		v.AddArg(x)
		return true
	}
	// match: (Ctz16NonZero x)
	// cond: buildcfg.GOAMD64 < 3
	// result: (BSFL x)
	for {
		x := v_0
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpAMD64BSFL)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpCtz32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Ctz32 x)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (TZCNTL x)
	for {
		x := v_0
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64TZCNTL)
		v.AddArg(x)
		return true
	}
	// match: (Ctz32 x)
	// cond: buildcfg.GOAMD64 < 3
	// result: (Select0 (BSFQ (BTSQconst <typ.UInt64> [32] x)))
	for {
		x := v_0
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BSFQ, types.NewTuple(typ.UInt64, types.TypeFlags))
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64BTSQconst, typ.UInt64)
		v1.AuxInt = ssa.Int8ToAuxInt(32)
		v1.AddArg(x)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpCtz32NonZero(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (Ctz32NonZero x)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (TZCNTL x)
	for {
		x := v_0
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64TZCNTL)
		v.AddArg(x)
		return true
	}
	// match: (Ctz32NonZero x)
	// cond: buildcfg.GOAMD64 < 3
	// result: (BSFL x)
	for {
		x := v_0
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpAMD64BSFL)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpCtz64(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Ctz64 x)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (TZCNTQ x)
	for {
		x := v_0
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64TZCNTQ)
		v.AddArg(x)
		return true
	}
	// match: (Ctz64 <t> x)
	// cond: buildcfg.GOAMD64 < 3
	// result: (CMOVQEQ (Select0 <t> (BSFQ x)) (MOVQconst <t> [64]) (Select1 <types.TypeFlags> (BSFQ x)))
	for {
		t := v.Type
		x := v_0
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpAMD64CMOVQEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpSelect0, t)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64BSFQ, types.NewTuple(typ.UInt64, types.TypeFlags))
		v1.AddArg(x)
		v0.AddArg(v1)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQconst, t)
		v2.AuxInt = ssa.Int64ToAuxInt(64)
		v3 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v3.AddArg(v1)
		v.AddArg3(v0, v2, v3)
		return true
	}
	return false
}
func rewriteValue_OpCtz64NonZero(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Ctz64NonZero x)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (TZCNTQ x)
	for {
		x := v_0
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64TZCNTQ)
		v.AddArg(x)
		return true
	}
	// match: (Ctz64NonZero x)
	// cond: buildcfg.GOAMD64 < 3
	// result: (Select0 (BSFQ x))
	for {
		x := v_0
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64BSFQ, types.NewTuple(typ.UInt64, types.TypeFlags))
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
	return false
}
func rewriteValue_OpCtz8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Ctz8 x)
	// result: (BSFL (ORLconst <typ.UInt32> [1<<8 ] x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64BSFL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORLconst, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(1 << 8)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCtz8NonZero(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (Ctz8NonZero x)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (TZCNTL x)
	for {
		x := v_0
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64TZCNTL)
		v.AddArg(x)
		return true
	}
	// match: (Ctz8NonZero x)
	// cond: buildcfg.GOAMD64 < 3
	// result: (BSFL x)
	for {
		x := v_0
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpAMD64BSFL)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpCvt16toMask16x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt16toMask16x16 <t> x)
	// result: (VPMOVMToVec16x16 <types.TypeVec256> (KMOVWk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x16)
		v.Type = types.TypeVec256
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVWk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt16toMask32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt16toMask32x16 <t> x)
	// result: (VPMOVMToVec32x16 <types.TypeVec512> (KMOVWk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v.Type = types.TypeVec512
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVWk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt16toMask8x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt16toMask8x16 <t> x)
	// result: (VPMOVMToVec8x16 <types.TypeVec128> (KMOVWk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x16)
		v.Type = types.TypeVec128
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVWk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt32Fto32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Cvt32Fto32 <t> x)
	// cond: base.ConvertHash.MatchPos(v.Pos, nil)
	// result: (XORL <t> y (SARLconst <t> [31] (ANDL <t> y:(CVTTSS2SL <t> x) (NOTL <typ.Int32> (MOVLf2i x)))))
	for {
		t := v.Type
		x := v_0
		if !(base.ConvertHash.MatchPos(v.Pos, nil)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORL)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SARLconst, t)
		v0.AuxInt = ssa.Int8ToAuxInt(31)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64ANDL, t)
		y := b.NewValue0(v.Pos, ssaop.OpAMD64CVTTSS2SL, t)
		y.AddArg(x)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, typ.Int32)
		v4 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLf2i, typ.UInt32)
		v4.AddArg(x)
		v3.AddArg(v4)
		v1.AddArg2(y, v3)
		v0.AddArg(v1)
		v.AddArg2(y, v0)
		return true
	}
	// match: (Cvt32Fto32 <t> x)
	// cond: !base.ConvertHash.MatchPos(v.Pos, nil)
	// result: (CVTTSS2SL <t> x)
	for {
		t := v.Type
		x := v_0
		if !(!base.ConvertHash.MatchPos(v.Pos, nil)) {
			break
		}
		v.Reset(ssaop.OpAMD64CVTTSS2SL)
		v.Type = t
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpCvt32Fto64(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Cvt32Fto64 <t> x)
	// cond: base.ConvertHash.MatchPos(v.Pos, nil)
	// result: (XORQ <t> y (SARQconst <t> [63] (ANDQ <t> y:(CVTTSS2SQ <t> x) (NOTQ <typ.Int64> (MOVQf2i (CVTSS2SD <typ.Float64> x))) )))
	for {
		t := v.Type
		x := v_0
		if !(base.ConvertHash.MatchPos(v.Pos, nil)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORQ)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SARQconst, t)
		v0.AuxInt = ssa.Int8ToAuxInt(63)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64ANDQ, t)
		y := b.NewValue0(v.Pos, ssaop.OpAMD64CVTTSS2SQ, t)
		y.AddArg(x)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTQ, typ.Int64)
		v4 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQf2i, typ.UInt64)
		v5 := b.NewValue0(v.Pos, ssaop.OpAMD64CVTSS2SD, typ.Float64)
		v5.AddArg(x)
		v4.AddArg(v5)
		v3.AddArg(v4)
		v1.AddArg2(y, v3)
		v0.AddArg(v1)
		v.AddArg2(y, v0)
		return true
	}
	// match: (Cvt32Fto64 <t> x)
	// cond: !base.ConvertHash.MatchPos(v.Pos, nil)
	// result: (CVTTSS2SQ <t> x)
	for {
		t := v.Type
		x := v_0
		if !(!base.ConvertHash.MatchPos(v.Pos, nil)) {
			break
		}
		v.Reset(ssaop.OpAMD64CVTTSS2SQ)
		v.Type = t
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpCvt32toMask16x32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt32toMask16x32 <t> x)
	// result: (VPMOVMToVec16x32 <types.TypeVec512> (KMOVDk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v.Type = types.TypeVec512
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVDk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt32toMask8x32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt32toMask8x32 <t> x)
	// result: (VPMOVMToVec8x32 <types.TypeVec256> (KMOVDk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x32)
		v.Type = types.TypeVec256
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVDk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt64Fto32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Cvt64Fto32 <t> x)
	// cond: base.ConvertHash.MatchPos(v.Pos, nil)
	// result: (XORL <t> y (SARLconst <t> [31] (ANDL <t> y:(CVTTSD2SL <t> x) (NOTL <typ.Int32> (MOVLf2i (CVTSD2SS <typ.Float32> x))))))
	for {
		t := v.Type
		x := v_0
		if !(base.ConvertHash.MatchPos(v.Pos, nil)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORL)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SARLconst, t)
		v0.AuxInt = ssa.Int8ToAuxInt(31)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64ANDL, t)
		y := b.NewValue0(v.Pos, ssaop.OpAMD64CVTTSD2SL, t)
		y.AddArg(x)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, typ.Int32)
		v4 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLf2i, typ.UInt32)
		v5 := b.NewValue0(v.Pos, ssaop.OpAMD64CVTSD2SS, typ.Float32)
		v5.AddArg(x)
		v4.AddArg(v5)
		v3.AddArg(v4)
		v1.AddArg2(y, v3)
		v0.AddArg(v1)
		v.AddArg2(y, v0)
		return true
	}
	// match: (Cvt64Fto32 <t> x)
	// cond: !base.ConvertHash.MatchPos(v.Pos, nil)
	// result: (CVTTSD2SL <t> x)
	for {
		t := v.Type
		x := v_0
		if !(!base.ConvertHash.MatchPos(v.Pos, nil)) {
			break
		}
		v.Reset(ssaop.OpAMD64CVTTSD2SL)
		v.Type = t
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpCvt64Fto64(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Cvt64Fto64 <t> x)
	// cond: base.ConvertHash.MatchPos(v.Pos, nil)
	// result: (XORQ <t> y (SARQconst <t> [63] (ANDQ <t> y:(CVTTSD2SQ <t> x) (NOTQ <typ.Int64> (MOVQf2i x)))))
	for {
		t := v.Type
		x := v_0
		if !(base.ConvertHash.MatchPos(v.Pos, nil)) {
			break
		}
		v.Reset(ssaop.OpAMD64XORQ)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SARQconst, t)
		v0.AuxInt = ssa.Int8ToAuxInt(63)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64ANDQ, t)
		y := b.NewValue0(v.Pos, ssaop.OpAMD64CVTTSD2SQ, t)
		y.AddArg(x)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTQ, typ.Int64)
		v4 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQf2i, typ.UInt64)
		v4.AddArg(x)
		v3.AddArg(v4)
		v1.AddArg2(y, v3)
		v0.AddArg(v1)
		v.AddArg2(y, v0)
		return true
	}
	// match: (Cvt64Fto64 <t> x)
	// cond: !base.ConvertHash.MatchPos(v.Pos, nil)
	// result: (CVTTSD2SQ <t> x)
	for {
		t := v.Type
		x := v_0
		if !(!base.ConvertHash.MatchPos(v.Pos, nil)) {
			break
		}
		v.Reset(ssaop.OpAMD64CVTTSD2SQ)
		v.Type = t
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpCvt64toMask8x64(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt64toMask8x64 <t> x)
	// result: (VPMOVMToVec8x64 <types.TypeVec512> (KMOVQk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v.Type = types.TypeVec512
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVQk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt8toMask16x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt8toMask16x8 <t> x)
	// result: (VPMOVMToVec16x8 <types.TypeVec128> (KMOVBk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x8)
		v.Type = types.TypeVec128
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVBk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt8toMask32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt8toMask32x4 <t> x)
	// result: (VPMOVMToVec32x4 <types.TypeVec128> (KMOVBk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x4)
		v.Type = types.TypeVec128
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVBk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt8toMask32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt8toMask32x8 <t> x)
	// result: (VPMOVMToVec32x8 <types.TypeVec256> (KMOVBk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x8)
		v.Type = types.TypeVec256
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVBk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt8toMask64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt8toMask64x2 <t> x)
	// result: (VPMOVMToVec64x2 <types.TypeVec128> (KMOVBk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x2)
		v.Type = types.TypeVec128
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVBk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt8toMask64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt8toMask64x4 <t> x)
	// result: (VPMOVMToVec64x4 <types.TypeVec256> (KMOVBk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x4)
		v.Type = types.TypeVec256
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVBk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvt8toMask64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Cvt8toMask64x8 <t> x)
	// result: (VPMOVMToVec64x8 <types.TypeVec512> (KMOVBk <t> x))
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v.Type = types.TypeVec512
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64KMOVBk, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvtMask16x16to16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (CvtMask16x16to16 x)
	// result: (KMOVWi (VPMOVVec16x16ToM <types.TypeMask> x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64KMOVWi)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvtMask16x32to32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (CvtMask16x32to32 x)
	// result: (KMOVDi (VPMOVVec16x32ToM <types.TypeMask> x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64KMOVDi)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x32ToM, types.TypeMask)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvtMask16x8to8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (CvtMask16x8to8 x)
	// result: (KMOVBi (VPMOVVec16x8ToM <types.TypeMask> x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64KMOVBi)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvtMask32x16to16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (CvtMask32x16to16 x)
	// result: (KMOVWi (VPMOVVec32x16ToM <types.TypeMask> x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64KMOVWi)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x16ToM, types.TypeMask)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvtMask64x8to8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (CvtMask64x8to8 x)
	// result: (KMOVBi (VPMOVVec64x8ToM <types.TypeMask> x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64KMOVBi)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x8ToM, types.TypeMask)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpCvtMask8x64to64(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (CvtMask8x64to64 x)
	// result: (KMOVQi (VPMOVVec8x64ToM <types.TypeMask> x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64KMOVQi)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x64ToM, types.TypeMask)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpDiv16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Div16 [a] x y)
	// result: (Select0 (DIVW [a] x y))
	for {
		a := ssa.AuxIntToBool(v.AuxInt)
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVW, types.NewTuple(typ.Int16, typ.Int16))
		v0.AuxInt = ssa.BoolToAuxInt(a)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpDiv16u(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Div16u x y)
	// result: (Select0 (DIVWU x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVWU, types.NewTuple(typ.UInt16, typ.UInt16))
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpDiv32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Div32 [a] x y)
	// result: (Select0 (DIVL [a] x y))
	for {
		a := ssa.AuxIntToBool(v.AuxInt)
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVL, types.NewTuple(typ.Int32, typ.Int32))
		v0.AuxInt = ssa.BoolToAuxInt(a)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpDiv32u(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Div32u x y)
	// result: (Select0 (DIVLU x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVLU, types.NewTuple(typ.UInt32, typ.UInt32))
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpDiv64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Div64 [a] x y)
	// result: (Select0 (DIVQ [a] x y))
	for {
		a := ssa.AuxIntToBool(v.AuxInt)
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVQ, types.NewTuple(typ.Int64, typ.Int64))
		v0.AuxInt = ssa.BoolToAuxInt(a)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpDiv64u(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Div64u x y)
	// result: (Select0 (DIVQU x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVQU, types.NewTuple(typ.UInt64, typ.UInt64))
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpDiv8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Div8 x y)
	// result: (Select0 (DIVW (SignExt8to16 x) (SignExt8to16 y)))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVW, types.NewTuple(typ.Int16, typ.Int16))
		v1 := b.NewValue0(v.Pos, ssaop.OpSignExt8to16, typ.Int16)
		v1.AddArg(x)
		v2 := b.NewValue0(v.Pos, ssaop.OpSignExt8to16, typ.Int16)
		v2.AddArg(y)
		v0.AddArg2(v1, v2)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpDiv8u(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Div8u x y)
	// result: (Select0 (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y)))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVWU, types.NewTuple(typ.UInt16, typ.UInt16))
		v1 := b.NewValue0(v.Pos, ssaop.OpZeroExt8to16, typ.UInt16)
		v1.AddArg(x)
		v2 := b.NewValue0(v.Pos, ssaop.OpZeroExt8to16, typ.UInt16)
		v2.AddArg(y)
		v0.AddArg2(v1, v2)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEq16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Eq16 x y)
	// result: (SETEQ (CMPW x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPW, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEq32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Eq32 x y)
	// result: (SETEQ (CMPL x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPL, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEq32F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Eq32F x y)
	// result: (SETEQF (UCOMISS x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETEQF)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64UCOMISS, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEq64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Eq64 x y)
	// result: (SETEQ (CMPQ x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEq64F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Eq64F x y)
	// result: (SETEQF (UCOMISD x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETEQF)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64UCOMISD, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEq8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Eq8 x y)
	// result: (SETEQ (CMPB x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPB, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqB(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (EqB x y)
	// result: (SETEQ (CMPB x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPB, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqPtr(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (EqPtr x y)
	// result: (SETEQ (CMPQ x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqualFloat32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (EqualFloat32x16 x y)
	// result: (VPMOVMToVec32x16 (VCMPPS512 [0] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPS512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(0)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqualFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (EqualFloat32x4 x y)
	// result: (VCMPPS128 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpEqualFloat32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (EqualFloat32x8 x y)
	// result: (VCMPPS256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpEqualFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (EqualFloat64x2 x y)
	// result: (VCMPPD128 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpEqualFloat64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (EqualFloat64x4 x y)
	// result: (VCMPPD256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpEqualFloat64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (EqualFloat64x8 x y)
	// result: (VPMOVMToVec64x8 (VCMPPD512 [0] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(0)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqualInt16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (EqualInt16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPEQW512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPEQW512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqualInt32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (EqualInt32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPEQD512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPEQD512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqualInt64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (EqualInt64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPEQQ512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPEQQ512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqualInt8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (EqualInt8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPEQB512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPEQB512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqualUint16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (EqualUint16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPEQW512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPEQW512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqualUint32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (EqualUint32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPEQD512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPEQD512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqualUint64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (EqualUint64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPEQQ512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPEQQ512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpEqualUint8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (EqualUint8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPEQB512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPEQB512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpExpandFloat32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandFloat32x16 x mask)
	// result: (VEXPANDPSMasked512 x (VPMOVVec32x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VEXPANDPSMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandFloat32x4 x mask)
	// result: (VEXPANDPSMasked128 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VEXPANDPSMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandFloat32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandFloat32x8 x mask)
	// result: (VEXPANDPSMasked256 x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VEXPANDPSMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandFloat64x2 x mask)
	// result: (VEXPANDPDMasked128 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VEXPANDPDMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandFloat64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandFloat64x4 x mask)
	// result: (VEXPANDPDMasked256 x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VEXPANDPDMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandFloat64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandFloat64x8 x mask)
	// result: (VEXPANDPDMasked512 x (VPMOVVec64x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VEXPANDPDMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt16x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt16x16 x mask)
	// result: (VPEXPANDWMasked256 x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDWMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt16x32 x mask)
	// result: (VPEXPANDWMasked512 x (VPMOVVec16x32ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDWMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt16x8 x mask)
	// result: (VPEXPANDWMasked128 x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDWMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt32x16 x mask)
	// result: (VPEXPANDDMasked512 x (VPMOVVec32x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDDMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt32x4 x mask)
	// result: (VPEXPANDDMasked128 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDDMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt32x8 x mask)
	// result: (VPEXPANDDMasked256 x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDDMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt64x2 x mask)
	// result: (VPEXPANDQMasked128 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDQMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt64x4 x mask)
	// result: (VPEXPANDQMasked256 x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDQMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt64x8 x mask)
	// result: (VPEXPANDQMasked512 x (VPMOVVec64x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDQMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt8x16 x mask)
	// result: (VPEXPANDBMasked128 x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDBMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt8x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt8x32 x mask)
	// result: (VPEXPANDBMasked256 x (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDBMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandInt8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandInt8x64 x mask)
	// result: (VPEXPANDBMasked512 x (VPMOVVec8x64ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDBMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x64ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint16x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint16x16 x mask)
	// result: (VPEXPANDWMasked256 x (VPMOVVec16x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDWMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint16x32 x mask)
	// result: (VPEXPANDWMasked512 x (VPMOVVec16x32ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDWMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint16x8 x mask)
	// result: (VPEXPANDWMasked128 x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDWMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint32x16 x mask)
	// result: (VPEXPANDDMasked512 x (VPMOVVec32x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDDMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint32x4 x mask)
	// result: (VPEXPANDDMasked128 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDDMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint32x8 x mask)
	// result: (VPEXPANDDMasked256 x (VPMOVVec32x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDDMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint64x2 x mask)
	// result: (VPEXPANDQMasked128 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDQMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint64x4 x mask)
	// result: (VPEXPANDQMasked256 x (VPMOVVec64x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDQMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint64x8 x mask)
	// result: (VPEXPANDQMasked512 x (VPMOVVec64x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDQMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint8x16 x mask)
	// result: (VPEXPANDBMasked128 x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDBMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint8x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint8x32 x mask)
	// result: (VPEXPANDBMasked256 x (VPMOVVec8x32ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDBMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpExpandUint8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (ExpandUint8x64 x mask)
	// result: (VPEXPANDBMasked512 x (VPMOVVec8x64ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPEXPANDBMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x64ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpFMA(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (FMA x y z)
	// result: (VFMADD231SD z x y)
	for {
		x := v_0
		y := v_1
		z := v_2
		v.Reset(ssaop.OpAMD64VFMADD231SD)
		v.AddArg3(z, x, y)
		return true
	}
}
func rewriteValue_OpFloor(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (Floor x)
	// result: (ROUNDSD [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64ROUNDSD)
		v.AuxInt = ssa.Int8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorFloat32x4 x)
	// result: (VROUNDPS128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorFloat32x8 x)
	// result: (VROUNDPS256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorFloat64x2 x)
	// result: (VROUNDPD128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorFloat64x4 x)
	// result: (VROUNDPD256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledFloat32x16 [a] x)
	// result: (VRNDSCALEPS512 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledFloat32x4 [a] x)
	// result: (VRNDSCALEPS128 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledFloat32x8 [a] x)
	// result: (VRNDSCALEPS256 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledFloat64x2 [a] x)
	// result: (VRNDSCALEPD128 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledFloat64x4 [a] x)
	// result: (VRNDSCALEPD256 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledFloat64x8 [a] x)
	// result: (VRNDSCALEPD512 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledResidueFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledResidueFloat32x16 [a] x)
	// result: (VREDUCEPS512 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledResidueFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledResidueFloat32x4 [a] x)
	// result: (VREDUCEPS128 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledResidueFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledResidueFloat32x8 [a] x)
	// result: (VREDUCEPS256 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledResidueFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledResidueFloat64x2 [a] x)
	// result: (VREDUCEPD128 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledResidueFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledResidueFloat64x4 [a] x)
	// result: (VREDUCEPD256 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpFloorScaledResidueFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (FloorScaledResidueFloat64x8 [a] x)
	// result: (VREDUCEPD512 [a+1] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetG(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetG mem)
	// cond: v.Block.Func.OwnAux.Fn.ABI() != obj.ABIInternal
	// result: (LoweredGetG mem)
	for {
		mem := v_0
		if !(v.Block.Func.OwnAux.Fn.ABI() != obj.ABIInternal) {
			break
		}
		v.Reset(ssaop.OpAMD64LoweredGetG)
		v.AddArg(mem)
		return true
	}
	return false
}
func rewriteValue_OpGetHiFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiFloat32x16 x)
	// result: (VEXTRACTF64X4256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTF64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiFloat32x8 x)
	// result: (VEXTRACTF128128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTF128128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiFloat64x4 x)
	// result: (VEXTRACTF128128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTF128128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiFloat64x8 x)
	// result: (VEXTRACTF64X4256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTF64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiInt16x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiInt16x16 x)
	// result: (VEXTRACTI128128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiInt16x32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiInt16x32 x)
	// result: (VEXTRACTI64X4256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiInt32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiInt32x16 x)
	// result: (VEXTRACTI64X4256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiInt32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiInt32x8 x)
	// result: (VEXTRACTI128128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiInt64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiInt64x4 x)
	// result: (VEXTRACTI128128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiInt64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiInt64x8 x)
	// result: (VEXTRACTI64X4256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiInt8x32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiInt8x32 x)
	// result: (VEXTRACTI128128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiInt8x64(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiInt8x64 x)
	// result: (VEXTRACTI64X4256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiUint16x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiUint16x16 x)
	// result: (VEXTRACTI128128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiUint16x32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiUint16x32 x)
	// result: (VEXTRACTI64X4256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiUint32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiUint32x16 x)
	// result: (VEXTRACTI64X4256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiUint32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiUint32x8 x)
	// result: (VEXTRACTI128128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiUint64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiUint64x4 x)
	// result: (VEXTRACTI128128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiUint64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiUint64x8 x)
	// result: (VEXTRACTI64X4256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiUint8x32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiUint8x32 x)
	// result: (VEXTRACTI128128 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetHiUint8x64(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetHiUint8x64 x)
	// result: (VEXTRACTI64X4256 [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoFloat32x16 x)
	// result: (VEXTRACTF64X4256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTF64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoFloat32x8 x)
	// result: (VEXTRACTF128128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTF128128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoFloat64x4 x)
	// result: (VEXTRACTF128128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTF128128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoFloat64x8 x)
	// result: (VEXTRACTF64X4256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTF64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoInt16x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoInt16x16 x)
	// result: (VEXTRACTI128128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoInt16x32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoInt16x32 x)
	// result: (VEXTRACTI64X4256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoInt32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoInt32x16 x)
	// result: (VEXTRACTI64X4256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoInt32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoInt32x8 x)
	// result: (VEXTRACTI128128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoInt64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoInt64x4 x)
	// result: (VEXTRACTI128128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoInt64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoInt64x8 x)
	// result: (VEXTRACTI64X4256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoInt8x32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoInt8x32 x)
	// result: (VEXTRACTI128128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoInt8x64(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoInt8x64 x)
	// result: (VEXTRACTI64X4256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoUint16x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoUint16x16 x)
	// result: (VEXTRACTI128128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoUint16x32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoUint16x32 x)
	// result: (VEXTRACTI64X4256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoUint32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoUint32x16 x)
	// result: (VEXTRACTI64X4256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoUint32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoUint32x8 x)
	// result: (VEXTRACTI128128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoUint64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoUint64x4 x)
	// result: (VEXTRACTI128128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoUint64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoUint64x8 x)
	// result: (VEXTRACTI64X4256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoUint8x32(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoUint8x32 x)
	// result: (VEXTRACTI128128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI128128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGetLoUint8x64(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (GetLoUint8x64 x)
	// result: (VEXTRACTI64X4256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VEXTRACTI64X4256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpGreaterEqualFloat32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterEqualFloat32x16 x y)
	// result: (VPMOVMToVec32x16 (VCMPPS512 [13] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPS512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(13)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterEqualFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (GreaterEqualFloat32x4 x y)
	// result: (VCMPPS128 [13] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(13)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpGreaterEqualFloat32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (GreaterEqualFloat32x8 x y)
	// result: (VCMPPS256 [13] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(13)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpGreaterEqualFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (GreaterEqualFloat64x2 x y)
	// result: (VCMPPD128 [13] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(13)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpGreaterEqualFloat64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (GreaterEqualFloat64x4 x y)
	// result: (VCMPPD256 [13] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(13)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpGreaterEqualFloat64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterEqualFloat64x8 x y)
	// result: (VPMOVMToVec64x8 (VCMPPD512 [13] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(13)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterEqualInt16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterEqualInt16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPW512 [13] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPW512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(13)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterEqualInt32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterEqualInt32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPD512 [13] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(13)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterEqualInt64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterEqualInt64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPQ512 [13] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPQ512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(13)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterEqualInt8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterEqualInt8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPB512 [13] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPB512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(13)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterEqualUint16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterEqualUint16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPUW512 [13] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUW512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(13)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterEqualUint32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterEqualUint32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPUD512 [13] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(13)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterEqualUint64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterEqualUint64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPUQ512 [13] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUQ512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(13)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterEqualUint8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterEqualUint8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPUB512 [13] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUB512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(13)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterFloat32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterFloat32x16 x y)
	// result: (VPMOVMToVec32x16 (VCMPPS512 [14] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPS512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(14)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (GreaterFloat32x4 x y)
	// result: (VCMPPS128 [14] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(14)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpGreaterFloat32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (GreaterFloat32x8 x y)
	// result: (VCMPPS256 [14] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(14)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpGreaterFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (GreaterFloat64x2 x y)
	// result: (VCMPPD128 [14] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(14)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpGreaterFloat64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (GreaterFloat64x4 x y)
	// result: (VCMPPD256 [14] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(14)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpGreaterFloat64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterFloat64x8 x y)
	// result: (VPMOVMToVec64x8 (VCMPPD512 [14] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(14)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterInt16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterInt16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPGTW512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPGTW512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterInt32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterInt32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPGTD512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPGTD512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterInt64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterInt64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPGTQ512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPGTQ512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterInt8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterInt8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPGTB512 x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPGTB512, typ.Mask)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterUint16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterUint16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPUW512 [14] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUW512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(14)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterUint32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterUint32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPUD512 [14] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(14)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterUint64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterUint64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPUQ512 [14] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUQ512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(14)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpGreaterUint8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (GreaterUint8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPUB512 [14] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUB512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(14)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpHasCPUFeature(v *ssa.Value) bool {
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (HasCPUFeature {s})
	// result: (SETNE (CMPLconst [0] (LoweredHasCPUFeature {s})))
	for {
		s := ssa.AuxToSym(v.Aux)
		v.Reset(ssaop.OpAMD64SETNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v0.AuxInt = ssa.Int32ToAuxInt(0)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64LoweredHasCPUFeature, typ.UInt64)
		v1.Aux = ssa.SymToAux(s)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpIsInBounds(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (IsInBounds idx len)
	// result: (SETB (CMPQ idx len))
	for {
		idx := v_0
		len := v_1
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(idx, len)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpIsNaNFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (IsNaNFloat32x16 x)
	// result: (VPMOVMToVec32x16 (VCMPPS512 [3] x x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPS512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(3)
		v0.AddArg2(x, x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpIsNaNFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (IsNaNFloat32x4 x)
	// result: (VCMPPS128 [3] x x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VCMPPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(3)
		v.AddArg2(x, x)
		return true
	}
}
func rewriteValue_OpIsNaNFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (IsNaNFloat32x8 x)
	// result: (VCMPPS256 [3] x x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VCMPPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(3)
		v.AddArg2(x, x)
		return true
	}
}
func rewriteValue_OpIsNaNFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (IsNaNFloat64x2 x)
	// result: (VCMPPD128 [3] x x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VCMPPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(3)
		v.AddArg2(x, x)
		return true
	}
}
func rewriteValue_OpIsNaNFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (IsNaNFloat64x4 x)
	// result: (VCMPPD256 [3] x x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VCMPPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(3)
		v.AddArg2(x, x)
		return true
	}
}
func rewriteValue_OpIsNaNFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (IsNaNFloat64x8 x)
	// result: (VPMOVMToVec64x8 (VCMPPD512 [3] x x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(3)
		v0.AddArg2(x, x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpIsNonNil(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (IsNonNil p)
	// result: (SETNE (TESTQ p p))
	for {
		p := v_0
		v.Reset(ssaop.OpAMD64SETNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64TESTQ, types.TypeFlags)
		v0.AddArg2(p, p)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpIsSliceInBounds(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (IsSliceInBounds idx len)
	// result: (SETBE (CMPQ idx len))
	for {
		idx := v_0
		len := v_1
		v.Reset(ssaop.OpAMD64SETBE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(idx, len)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpIsZeroVec(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (IsZeroVec x)
	// result: (SETEQ (VPTEST x x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64SETEQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
		v0.AddArg2(x, x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLeq16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Leq16 x y)
	// result: (SETLE (CMPW x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETLE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPW, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLeq16U(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Leq16U x y)
	// result: (SETBE (CMPW x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETBE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPW, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLeq32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Leq32 x y)
	// result: (SETLE (CMPL x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETLE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPL, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLeq32F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Leq32F x y)
	// result: (SETGEF (UCOMISS y x))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETGEF)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64UCOMISS, types.TypeFlags)
		v0.AddArg2(y, x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLeq32U(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Leq32U x y)
	// result: (SETBE (CMPL x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETBE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPL, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLeq64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Leq64 x y)
	// result: (SETLE (CMPQ x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETLE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLeq64F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Leq64F x y)
	// result: (SETGEF (UCOMISD y x))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETGEF)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64UCOMISD, types.TypeFlags)
		v0.AddArg2(y, x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLeq64U(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Leq64U x y)
	// result: (SETBE (CMPQ x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETBE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLeq8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Leq8 x y)
	// result: (SETLE (CMPB x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETLE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPB, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLeq8U(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Leq8U x y)
	// result: (SETBE (CMPB x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETBE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPB, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLess16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Less16 x y)
	// result: (SETL (CMPW x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPW, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLess16U(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Less16U x y)
	// result: (SETB (CMPW x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPW, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLess32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Less32 x y)
	// result: (SETL (CMPL x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPL, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLess32F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Less32F x y)
	// result: (SETGF (UCOMISS y x))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETGF)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64UCOMISS, types.TypeFlags)
		v0.AddArg2(y, x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLess32U(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Less32U x y)
	// result: (SETB (CMPL x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPL, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLess64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Less64 x y)
	// result: (SETL (CMPQ x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLess64F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Less64F x y)
	// result: (SETGF (UCOMISD y x))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETGF)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64UCOMISD, types.TypeFlags)
		v0.AddArg2(y, x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLess64U(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Less64U x y)
	// result: (SETB (CMPQ x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLess8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Less8 x y)
	// result: (SETL (CMPB x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPB, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLess8U(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Less8U x y)
	// result: (SETB (CMPB x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETB)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPB, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessEqualFloat32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessEqualFloat32x16 x y)
	// result: (VPMOVMToVec32x16 (VCMPPS512 [2] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPS512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(2)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessEqualFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LessEqualFloat32x4 x y)
	// result: (VCMPPS128 [2] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(2)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpLessEqualFloat32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LessEqualFloat32x8 x y)
	// result: (VCMPPS256 [2] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(2)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpLessEqualFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LessEqualFloat64x2 x y)
	// result: (VCMPPD128 [2] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(2)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpLessEqualFloat64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LessEqualFloat64x4 x y)
	// result: (VCMPPD256 [2] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(2)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpLessEqualFloat64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessEqualFloat64x8 x y)
	// result: (VPMOVMToVec64x8 (VCMPPD512 [2] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(2)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessEqualInt16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessEqualInt16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPW512 [2] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPW512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(2)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessEqualInt32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessEqualInt32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPD512 [2] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(2)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessEqualInt64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessEqualInt64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPQ512 [2] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPQ512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(2)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessEqualInt8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessEqualInt8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPB512 [2] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPB512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(2)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessEqualUint16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessEqualUint16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPUW512 [2] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUW512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(2)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessEqualUint32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessEqualUint32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPUD512 [2] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(2)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessEqualUint64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessEqualUint64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPUQ512 [2] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUQ512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(2)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessEqualUint8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessEqualUint8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPUB512 [2] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUB512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(2)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessFloat32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessFloat32x16 x y)
	// result: (VPMOVMToVec32x16 (VCMPPS512 [1] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPS512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(1)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LessFloat32x4 x y)
	// result: (VCMPPS128 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpLessFloat32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LessFloat32x8 x y)
	// result: (VCMPPS256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpLessFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LessFloat64x2 x y)
	// result: (VCMPPD128 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpLessFloat64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (LessFloat64x4 x y)
	// result: (VCMPPD256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpLessFloat64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessFloat64x8 x y)
	// result: (VPMOVMToVec64x8 (VCMPPD512 [1] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(1)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessInt16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessInt16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPW512 [1] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPW512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(1)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessInt32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessInt32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPD512 [1] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(1)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessInt64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessInt64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPQ512 [1] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPQ512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(1)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessInt8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessInt8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPB512 [1] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPB512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(1)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessUint16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessUint16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPUW512 [1] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUW512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(1)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessUint32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessUint32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPUD512 [1] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(1)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessUint64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessUint64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPUQ512 [1] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUQ512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(1)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLessUint8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LessUint8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPUB512 [1] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUB512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(1)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpLoad(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (Load <t> ptr mem)
	// cond: (ssa.Is64BitInt(t) ||ssa.IsPtr(t))
	// result: (MOVQload ptr mem)
	for {
		t := v.Type
		ptr := v_0
		mem := v_1
		if !(ssa.Is64BitInt(t) || ssa.IsPtr(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQload)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (Load <t> ptr mem)
	// cond: ssa.Is32BitInt(t)
	// result: (MOVLload ptr mem)
	for {
		t := v.Type
		ptr := v_0
		mem := v_1
		if !(ssa.Is32BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLload)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (Load <t> ptr mem)
	// cond: ssa.Is16BitInt(t)
	// result: (MOVWload ptr mem)
	for {
		t := v.Type
		ptr := v_0
		mem := v_1
		if !(ssa.Is16BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWload)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (Load <t> ptr mem)
	// cond: (t.IsBoolean() || ssa.Is8BitInt(t))
	// result: (MOVBload ptr mem)
	for {
		t := v.Type
		ptr := v_0
		mem := v_1
		if !(t.IsBoolean() || ssa.Is8BitInt(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBload)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (Load <t> ptr mem)
	// cond: ssa.Is32BitFloat(t)
	// result: (MOVSSload ptr mem)
	for {
		t := v.Type
		ptr := v_0
		mem := v_1
		if !(ssa.Is32BitFloat(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSSload)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (Load <t> ptr mem)
	// cond: ssa.Is64BitFloat(t)
	// result: (MOVSDload ptr mem)
	for {
		t := v.Type
		ptr := v_0
		mem := v_1
		if !(ssa.Is64BitFloat(t)) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSDload)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (Load <t> ptr mem)
	// cond: t.Size() == 16
	// result: (VMOVDQUload128 ptr mem)
	for {
		t := v.Type
		ptr := v_0
		mem := v_1
		if !(t.Size() == 16) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUload128)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (Load <t> ptr mem)
	// cond: t.Size() == 32
	// result: (VMOVDQUload256 ptr mem)
	for {
		t := v.Type
		ptr := v_0
		mem := v_1
		if !(t.Size() == 32) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUload256)
		v.AddArg2(ptr, mem)
		return true
	}
	// match: (Load <t> ptr mem)
	// cond: t.Size() == 64
	// result: (VMOVDQUload512 ptr mem)
	for {
		t := v.Type
		ptr := v_0
		mem := v_1
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUload512)
		v.AddArg2(ptr, mem)
		return true
	}
	return false
}
func rewriteValue_OpLoadMasked16(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (LoadMasked16 <t> ptr mask mem)
	// cond: t.Size() == 64
	// result: (VPMASK16load512 ptr (VPMOVVec16x32ToM <types.TypeMask> mask) mem)
	for {
		t := v.Type
		ptr := v_0
		mask := v_1
		mem := v_2
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK16load512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpLoadMasked32(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (LoadMasked32 <t> ptr mask mem)
	// cond: t.Size() == 16
	// result: (VPMASK32load128 ptr mask mem)
	for {
		t := v.Type
		ptr := v_0
		mask := v_1
		mem := v_2
		if !(t.Size() == 16) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK32load128)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	// match: (LoadMasked32 <t> ptr mask mem)
	// cond: t.Size() == 32
	// result: (VPMASK32load256 ptr mask mem)
	for {
		t := v.Type
		ptr := v_0
		mask := v_1
		mem := v_2
		if !(t.Size() == 32) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK32load256)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	// match: (LoadMasked32 <t> ptr mask mem)
	// cond: t.Size() == 64
	// result: (VPMASK32load512 ptr (VPMOVVec32x16ToM <types.TypeMask> mask) mem)
	for {
		t := v.Type
		ptr := v_0
		mask := v_1
		mem := v_2
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK32load512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpLoadMasked64(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (LoadMasked64 <t> ptr mask mem)
	// cond: t.Size() == 16
	// result: (VPMASK64load128 ptr mask mem)
	for {
		t := v.Type
		ptr := v_0
		mask := v_1
		mem := v_2
		if !(t.Size() == 16) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK64load128)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	// match: (LoadMasked64 <t> ptr mask mem)
	// cond: t.Size() == 32
	// result: (VPMASK64load256 ptr mask mem)
	for {
		t := v.Type
		ptr := v_0
		mask := v_1
		mem := v_2
		if !(t.Size() == 32) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK64load256)
		v.AddArg3(ptr, mask, mem)
		return true
	}
	// match: (LoadMasked64 <t> ptr mask mem)
	// cond: t.Size() == 64
	// result: (VPMASK64load512 ptr (VPMOVVec64x8ToM <types.TypeMask> mask) mem)
	for {
		t := v.Type
		ptr := v_0
		mask := v_1
		mem := v_2
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK64load512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpLoadMasked8(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (LoadMasked8 <t> ptr mask mem)
	// cond: t.Size() == 64
	// result: (VPMASK8load512 ptr (VPMOVVec8x64ToM <types.TypeMask> mask) mem)
	for {
		t := v.Type
		ptr := v_0
		mask := v_1
		mem := v_2
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK8load512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x64ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(ptr, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpLocalAddr(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (LocalAddr <t> {sym} base mem)
	// cond: t.Elem().HasPointers()
	// result: (LEAQ {sym} (SPanchored base mem))
	for {
		t := v.Type
		sym := ssa.AuxToSym(v.Aux)
		base := v_0
		mem := v_1
		if !(t.Elem().HasPointers()) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.Aux = ssa.SymToAux(sym)
		v0 := b.NewValue0(v.Pos, ssaop.OpSPanchored, typ.Uintptr)
		v0.AddArg2(base, mem)
		v.AddArg(v0)
		return true
	}
	// match: (LocalAddr <t> {sym} base _)
	// cond: !t.Elem().HasPointers()
	// result: (LEAQ {sym} base)
	for {
		t := v.Type
		sym := ssa.AuxToSym(v.Aux)
		base := v_0
		if !(!t.Elem().HasPointers()) {
			break
		}
		v.Reset(ssaop.OpAMD64LEAQ)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg(base)
		return true
	}
	return false
}
func rewriteValue_OpLsh16x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh16x16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v2.AuxInt = ssa.Int16ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh16x16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh16x32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh16x32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh16x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh16x64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPQconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh16x64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh16x8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v2.AuxInt = ssa.Int8ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh16x8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh32x16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v2.AuxInt = ssa.Int16ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh32x16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh32x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh32x32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh32x32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh32x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh32x64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPQconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh32x64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh32x8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v2.AuxInt = ssa.Int8ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh32x8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh64x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh64x16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDQ (SHLQ <t> x y) (SBBQcarrymask <t> (CMPWconst y [64])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLQ, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v2.AuxInt = ssa.Int16ToAuxInt(64)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh64x16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh64x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh64x32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDQ (SHLQ <t> x y) (SBBQcarrymask <t> (CMPLconst y [64])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLQ, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(64)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh64x32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh64x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh64x64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDQ (SHLQ <t> x y) (SBBQcarrymask <t> (CMPQconst y [64])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLQ, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(64)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh64x64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh64x8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDQ (SHLQ <t> x y) (SBBQcarrymask <t> (CMPBconst y [64])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLQ, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v2.AuxInt = ssa.Int8ToAuxInt(64)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh64x8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh8x16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v2.AuxInt = ssa.Int16ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh8x16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh8x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh8x32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh8x32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh8x64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPQconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh8x64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpLsh8x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Lsh8x8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHLL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHLL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v2.AuxInt = ssa.Int8ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Lsh8x8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHLL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHLL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpMax32F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Max32F <t> x y)
	// result: (Neg32F <t> (Min32F <t> (Neg32F <t> x) (Neg32F <t> y)))
	for {
		t := v.Type
		x := v_0
		y := v_1
		v.Reset(ssaop.OpNeg32F)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpMin32F, t)
		v1 := b.NewValue0(v.Pos, ssaop.OpNeg32F, t)
		v1.AddArg(x)
		v2 := b.NewValue0(v.Pos, ssaop.OpNeg32F, t)
		v2.AddArg(y)
		v0.AddArg2(v1, v2)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpMax64F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Max64F <t> x y)
	// result: (Neg64F <t> (Min64F <t> (Neg64F <t> x) (Neg64F <t> y)))
	for {
		t := v.Type
		x := v_0
		y := v_1
		v.Reset(ssaop.OpNeg64F)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpMin64F, t)
		v1 := b.NewValue0(v.Pos, ssaop.OpNeg64F, t)
		v1.AddArg(x)
		v2 := b.NewValue0(v.Pos, ssaop.OpNeg64F, t)
		v2.AddArg(y)
		v0.AddArg2(v1, v2)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpMin32F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Min32F <t> x y)
	// result: (POR (MINSS <t> (MINSS <t> x y) x) (MINSS <t> x y))
	for {
		t := v.Type
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64POR)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MINSS, t)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MINSS, t)
		v1.AddArg2(x, y)
		v0.AddArg2(v1, x)
		v.AddArg2(v0, v1)
		return true
	}
}
func rewriteValue_OpMin64F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Min64F <t> x y)
	// result: (POR (MINSD <t> (MINSD <t> x y) x) (MINSD <t> x y))
	for {
		t := v.Type
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64POR)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MINSD, t)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MINSD, t)
		v1.AddArg2(x, y)
		v0.AddArg2(v1, x)
		v.AddArg2(v0, v1)
		return true
	}
}
func rewriteValue_OpMod16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Mod16 [a] x y)
	// result: (Select1 (DIVW [a] x y))
	for {
		a := ssa.AuxIntToBool(v.AuxInt)
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVW, types.NewTuple(typ.Int16, typ.Int16))
		v0.AuxInt = ssa.BoolToAuxInt(a)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpMod16u(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Mod16u x y)
	// result: (Select1 (DIVWU x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVWU, types.NewTuple(typ.UInt16, typ.UInt16))
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpMod32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Mod32 [a] x y)
	// result: (Select1 (DIVL [a] x y))
	for {
		a := ssa.AuxIntToBool(v.AuxInt)
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVL, types.NewTuple(typ.Int32, typ.Int32))
		v0.AuxInt = ssa.BoolToAuxInt(a)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpMod32u(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Mod32u x y)
	// result: (Select1 (DIVLU x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVLU, types.NewTuple(typ.UInt32, typ.UInt32))
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpMod64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Mod64 [a] x y)
	// result: (Select1 (DIVQ [a] x y))
	for {
		a := ssa.AuxIntToBool(v.AuxInt)
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVQ, types.NewTuple(typ.Int64, typ.Int64))
		v0.AuxInt = ssa.BoolToAuxInt(a)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpMod64u(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Mod64u x y)
	// result: (Select1 (DIVQU x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVQU, types.NewTuple(typ.UInt64, typ.UInt64))
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpMod8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Mod8 x y)
	// result: (Select1 (DIVW (SignExt8to16 x) (SignExt8to16 y)))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVW, types.NewTuple(typ.Int16, typ.Int16))
		v1 := b.NewValue0(v.Pos, ssaop.OpSignExt8to16, typ.Int16)
		v1.AddArg(x)
		v2 := b.NewValue0(v.Pos, ssaop.OpSignExt8to16, typ.Int16)
		v2.AddArg(y)
		v0.AddArg2(v1, v2)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpMod8u(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Mod8u x y)
	// result: (Select1 (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y)))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpSelect1)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64DIVWU, types.NewTuple(typ.UInt16, typ.UInt16))
		v1 := b.NewValue0(v.Pos, ssaop.OpZeroExt8to16, typ.UInt16)
		v1.AddArg(x)
		v2 := b.NewValue0(v.Pos, ssaop.OpZeroExt8to16, typ.UInt16)
		v2.AddArg(y)
		v0.AddArg2(v1, v2)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpMove(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Move [0] _ _ mem)
	// result: mem
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 0 {
			break
		}
		mem := v_2
		v.CopyOf(mem)
		return true
	}
	// match: (Move [1] dst src mem)
	// result: (MOVBstore dst (MOVBload src mem) mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 1 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBload, typ.UInt8)
		v0.AddArg2(src, mem)
		v.AddArg3(dst, v0, mem)
		return true
	}
	// match: (Move [2] dst src mem)
	// result: (MOVWstore dst (MOVWload src mem) mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 2 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVWstore)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVWload, typ.UInt16)
		v0.AddArg2(src, mem)
		v.AddArg3(dst, v0, mem)
		return true
	}
	// match: (Move [4] dst src mem)
	// result: (MOVLstore dst (MOVLload src mem) mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 4 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVLstore)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v0.AddArg2(src, mem)
		v.AddArg3(dst, v0, mem)
		return true
	}
	// match: (Move [8] dst src mem)
	// result: (MOVQstore dst (MOVQload src mem) mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 8 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVQstore)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v0.AddArg2(src, mem)
		v.AddArg3(dst, v0, mem)
		return true
	}
	// match: (Move [16] dst src mem)
	// result: (MOVOstore dst (MOVOload src mem) mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 16 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVOstore)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVOload, types.TypeInt128)
		v0.AddArg2(src, mem)
		v.AddArg3(dst, v0, mem)
		return true
	}
	// match: (Move [3] dst src mem)
	// result: (MOVBstore [2] dst (MOVBload [2] src mem) (MOVWstore dst (MOVWload src mem) mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 3 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(2)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBload, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(2)
		v0.AddArg2(src, mem)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVWstore, types.TypeMem)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVWload, typ.UInt16)
		v2.AddArg2(src, mem)
		v1.AddArg3(dst, v2, mem)
		v.AddArg3(dst, v0, v1)
		return true
	}
	// match: (Move [5] dst src mem)
	// result: (MOVBstore [4] dst (MOVBload [4] src mem) (MOVLstore dst (MOVLload src mem) mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 5 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(4)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBload, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(4)
		v0.AddArg2(src, mem)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLstore, types.TypeMem)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v2.AddArg2(src, mem)
		v1.AddArg3(dst, v2, mem)
		v.AddArg3(dst, v0, v1)
		return true
	}
	// match: (Move [6] dst src mem)
	// result: (MOVWstore [4] dst (MOVWload [4] src mem) (MOVLstore dst (MOVLload src mem) mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 6 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVWstore)
		v.AuxInt = ssa.Int32ToAuxInt(4)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVWload, typ.UInt16)
		v0.AuxInt = ssa.Int32ToAuxInt(4)
		v0.AddArg2(src, mem)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLstore, types.TypeMem)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v2.AddArg2(src, mem)
		v1.AddArg3(dst, v2, mem)
		v.AddArg3(dst, v0, v1)
		return true
	}
	// match: (Move [7] dst src mem)
	// result: (MOVLstore [3] dst (MOVLload [3] src mem) (MOVLstore dst (MOVLload src mem) mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 7 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AuxInt = ssa.Int32ToAuxInt(3)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(3)
		v0.AddArg2(src, mem)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLstore, types.TypeMem)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v2.AddArg2(src, mem)
		v1.AddArg3(dst, v2, mem)
		v.AddArg3(dst, v0, v1)
		return true
	}
	// match: (Move [9] dst src mem)
	// result: (MOVBstore [8] dst (MOVBload [8] src mem) (MOVQstore dst (MOVQload src mem) mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 9 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AuxInt = ssa.Int32ToAuxInt(8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBload, typ.UInt8)
		v0.AuxInt = ssa.Int32ToAuxInt(8)
		v0.AddArg2(src, mem)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstore, types.TypeMem)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v2.AddArg2(src, mem)
		v1.AddArg3(dst, v2, mem)
		v.AddArg3(dst, v0, v1)
		return true
	}
	// match: (Move [10] dst src mem)
	// result: (MOVWstore [8] dst (MOVWload [8] src mem) (MOVQstore dst (MOVQload src mem) mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 10 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVWstore)
		v.AuxInt = ssa.Int32ToAuxInt(8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVWload, typ.UInt16)
		v0.AuxInt = ssa.Int32ToAuxInt(8)
		v0.AddArg2(src, mem)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstore, types.TypeMem)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v2.AddArg2(src, mem)
		v1.AddArg3(dst, v2, mem)
		v.AddArg3(dst, v0, v1)
		return true
	}
	// match: (Move [11] dst src mem)
	// result: (MOVLstore [7] dst (MOVLload [7] src mem) (MOVQstore dst (MOVQload src mem) mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 11 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AuxInt = ssa.Int32ToAuxInt(7)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(7)
		v0.AddArg2(src, mem)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstore, types.TypeMem)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v2.AddArg2(src, mem)
		v1.AddArg3(dst, v2, mem)
		v.AddArg3(dst, v0, v1)
		return true
	}
	// match: (Move [12] dst src mem)
	// result: (MOVLstore [8] dst (MOVLload [8] src mem) (MOVQstore dst (MOVQload src mem) mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 12 {
			break
		}
		dst := v_0
		src := v_1
		mem := v_2
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AuxInt = ssa.Int32ToAuxInt(8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLload, typ.UInt32)
		v0.AuxInt = ssa.Int32ToAuxInt(8)
		v0.AddArg2(src, mem)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstore, types.TypeMem)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v2.AddArg2(src, mem)
		v1.AddArg3(dst, v2, mem)
		v.AddArg3(dst, v0, v1)
		return true
	}
	// match: (Move [s] dst src mem)
	// cond: s >= 13 && s <= 15
	// result: (MOVQstore [int32(s-8)] dst (MOVQload [int32(s-8)] src mem) (MOVQstore dst (MOVQload src mem) mem))
	for {
		s := ssa.AuxIntToInt64(v.AuxInt)
		dst := v_0
		src := v_1
		mem := v_2
		if !(s >= 13 && s <= 15) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstore)
		v.AuxInt = ssa.Int32ToAuxInt(int32(s - 8))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v0.AuxInt = ssa.Int32ToAuxInt(int32(s - 8))
		v0.AddArg2(src, mem)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstore, types.TypeMem)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v2.AddArg2(src, mem)
		v1.AddArg3(dst, v2, mem)
		v.AddArg3(dst, v0, v1)
		return true
	}
	// match: (Move [s] dst src mem)
	// cond: s > 16 && s < 192 && ssa.LogLargeCopyValue(v, s)
	// result: (LoweredMove [s] dst src mem)
	for {
		s := ssa.AuxIntToInt64(v.AuxInt)
		dst := v_0
		src := v_1
		mem := v_2
		if !(s > 16 && s < 192 && ssa.LogLargeCopyValue(v, s)) {
			break
		}
		v.Reset(ssaop.OpAMD64LoweredMove)
		v.AuxInt = ssa.Int64ToAuxInt(s)
		v.AddArg3(dst, src, mem)
		return true
	}
	// match: (Move [s] dst src mem)
	// cond: s >= 192 && s <= ssa.RepMoveThreshold && ssa.LogLargeCopyValue(v, s)
	// result: (LoweredMoveLoop [s] dst src mem)
	for {
		s := ssa.AuxIntToInt64(v.AuxInt)
		dst := v_0
		src := v_1
		mem := v_2
		if !(s >= 192 && s <= ssa.RepMoveThreshold && ssa.LogLargeCopyValue(v, s)) {
			break
		}
		v.Reset(ssaop.OpAMD64LoweredMoveLoop)
		v.AuxInt = ssa.Int64ToAuxInt(s)
		v.AddArg3(dst, src, mem)
		return true
	}
	// match: (Move [s] dst src mem)
	// cond: s > ssa.RepMoveThreshold && s%8 != 0
	// result: (Move [s-s%8] (OffPtr <dst.Type> dst [s%8]) (OffPtr <src.Type> src [s%8]) (MOVQstore dst (MOVQload src mem) mem))
	for {
		s := ssa.AuxIntToInt64(v.AuxInt)
		dst := v_0
		src := v_1
		mem := v_2
		if !(s > ssa.RepMoveThreshold && s%8 != 0) {
			break
		}
		v.Reset(ssaop.OpMove)
		v.AuxInt = ssa.Int64ToAuxInt(s - s%8)
		v0 := b.NewValue0(v.Pos, ssaop.OpOffPtr, dst.Type)
		v0.AuxInt = ssa.Int64ToAuxInt(s % 8)
		v0.AddArg(dst)
		v1 := b.NewValue0(v.Pos, ssaop.OpOffPtr, src.Type)
		v1.AuxInt = ssa.Int64ToAuxInt(s % 8)
		v1.AddArg(src)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstore, types.TypeMem)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQload, typ.UInt64)
		v3.AddArg2(src, mem)
		v2.AddArg3(dst, v3, mem)
		v.AddArg3(v0, v1, v2)
		return true
	}
	// match: (Move [s] dst src mem)
	// cond: s > ssa.RepMoveThreshold && s%8 == 0 && ssa.LogLargeCopyValue(v, s)
	// result: (REPMOVSQ dst src (MOVQconst [s/8]) mem)
	for {
		s := ssa.AuxIntToInt64(v.AuxInt)
		dst := v_0
		src := v_1
		mem := v_2
		if !(s > ssa.RepMoveThreshold && s%8 == 0 && ssa.LogLargeCopyValue(v, s)) {
			break
		}
		v.Reset(ssaop.OpAMD64REPMOVSQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQconst, typ.UInt64)
		v0.AuxInt = ssa.Int64ToAuxInt(s / 8)
		v.AddArg4(dst, src, v0, mem)
		return true
	}
	return false
}
func rewriteValue_OpMul64uhilo(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (Mul64uhilo x y)
	// cond: buildcfg.GOAMD64 >= 3
	// result: (MULXQ x y)
	for {
		x := v_0
		y := v_1
		if !(buildcfg.GOAMD64 >= 3) {
			break
		}
		v.Reset(ssaop.OpAMD64MULXQ)
		v.AddArg2(x, y)
		return true
	}
	// match: (Mul64uhilo x y)
	// cond: buildcfg.GOAMD64 < 3
	// result: (MULQU2 x y)
	for {
		x := v_0
		y := v_1
		if !(buildcfg.GOAMD64 < 3) {
			break
		}
		v.Reset(ssaop.OpAMD64MULQU2)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpNeg32F(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Neg32F x)
	// result: (PXOR x (MOVSSconst <typ.Float32> [float32(math.Copysign(0, -1))]))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64PXOR)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVSSconst, typ.Float32)
		v0.AuxInt = ssa.Float32ToAuxInt(float32(math.Copysign(0, -1)))
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpNeg64F(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Neg64F x)
	// result: (PXOR x (MOVSDconst <typ.Float64> [math.Copysign(0, -1)]))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64PXOR)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVSDconst, typ.Float64)
		v0.AuxInt = ssa.Float64ToAuxInt(math.Copysign(0, -1))
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_OpNeq16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Neq16 x y)
	// result: (SETNE (CMPW x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPW, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNeq32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Neq32 x y)
	// result: (SETNE (CMPL x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPL, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNeq32F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Neq32F x y)
	// result: (SETNEF (UCOMISS x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETNEF)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64UCOMISS, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNeq64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Neq64 x y)
	// result: (SETNE (CMPQ x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNeq64F(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Neq64F x y)
	// result: (SETNEF (UCOMISD x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETNEF)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64UCOMISD, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNeq8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Neq8 x y)
	// result: (SETNE (CMPB x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPB, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNeqB(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (NeqB x y)
	// result: (SETNE (CMPB x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPB, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNeqPtr(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (NeqPtr x y)
	// result: (SETNE (CMPQ x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64SETNE)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNot(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (Not x)
	// result: (XORLconst [1] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64XORLconst)
		v.AuxInt = ssa.Int32ToAuxInt(1)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpNotEqualFloat32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (NotEqualFloat32x16 x y)
	// result: (VPMOVMToVec32x16 (VCMPPS512 [4] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPS512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(4)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNotEqualFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (NotEqualFloat32x4 x y)
	// result: (VCMPPS128 [4] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(4)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpNotEqualFloat32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (NotEqualFloat32x8 x y)
	// result: (VCMPPS256 [4] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(4)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpNotEqualFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (NotEqualFloat64x2 x y)
	// result: (VCMPPD128 [4] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(4)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpNotEqualFloat64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (NotEqualFloat64x4 x y)
	// result: (VCMPPD256 [4] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VCMPPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(4)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpNotEqualFloat64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (NotEqualFloat64x8 x y)
	// result: (VPMOVMToVec64x8 (VCMPPD512 [4] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VCMPPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(4)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNotEqualInt16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (NotEqualInt16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPW512 [4] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPW512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(4)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNotEqualInt32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (NotEqualInt32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPD512 [4] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(4)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNotEqualInt64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (NotEqualInt64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPQ512 [4] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPQ512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(4)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNotEqualInt8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (NotEqualInt8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPB512 [4] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPB512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(4)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNotEqualUint16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (NotEqualUint16x32 x y)
	// result: (VPMOVMToVec16x32 (VPCMPUW512 [4] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec16x32)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUW512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(4)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNotEqualUint32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (NotEqualUint32x16 x y)
	// result: (VPMOVMToVec32x16 (VPCMPUD512 [4] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec32x16)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUD512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(4)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNotEqualUint64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (NotEqualUint64x8 x y)
	// result: (VPMOVMToVec64x8 (VPCMPUQ512 [4] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec64x8)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUQ512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(4)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpNotEqualUint8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (NotEqualUint8x64 x y)
	// result: (VPMOVMToVec8x64 (VPCMPUB512 [4] x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VPMOVMToVec8x64)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPCMPUB512, typ.Mask)
		v0.AuxInt = ssa.Uint8ToAuxInt(4)
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpOffPtr(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (OffPtr [off] ptr)
	// cond: ssa.Is32Bit(off)
	// result: (ADDQconst [int32(off)] ptr)
	for {
		off := ssa.AuxIntToInt64(v.AuxInt)
		ptr := v_0
		if !(ssa.Is32Bit(off)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconst)
		v.AuxInt = ssa.Int32ToAuxInt(int32(off))
		v.AddArg(ptr)
		return true
	}
	// match: (OffPtr [off] ptr)
	// result: (ADDQ (MOVQconst [off]) ptr)
	for {
		off := ssa.AuxIntToInt64(v.AuxInt)
		ptr := v_0
		v.Reset(ssaop.OpAMD64ADDQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQconst, typ.UInt64)
		v0.AuxInt = ssa.Int64ToAuxInt(off)
		v.AddArg2(v0, ptr)
		return true
	}
}
func rewriteValue_OpPopCount16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (PopCount16 x)
	// result: (POPCNTL (MOVWQZX <typ.UInt32> x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64POPCNTL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVWQZX, typ.UInt32)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpPopCount8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (PopCount8 x)
	// result: (POPCNTL (MOVBQZX <typ.UInt32> x))
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64POPCNTL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVBQZX, typ.UInt32)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpRoundFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundFloat32x4 x)
	// result: (VROUNDPS128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundFloat32x8 x)
	// result: (VROUNDPS256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundFloat64x2 x)
	// result: (VROUNDPD128 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundFloat64x4 x)
	// result: (VROUNDPD256 [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledFloat32x16 [a] x)
	// result: (VRNDSCALEPS512 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledFloat32x4 [a] x)
	// result: (VRNDSCALEPS128 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledFloat32x8 [a] x)
	// result: (VRNDSCALEPS256 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledFloat64x2 [a] x)
	// result: (VRNDSCALEPD128 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledFloat64x4 [a] x)
	// result: (VRNDSCALEPD256 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledFloat64x8 [a] x)
	// result: (VRNDSCALEPD512 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledResidueFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledResidueFloat32x16 [a] x)
	// result: (VREDUCEPS512 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledResidueFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledResidueFloat32x4 [a] x)
	// result: (VREDUCEPS128 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledResidueFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledResidueFloat32x8 [a] x)
	// result: (VREDUCEPS256 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledResidueFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledResidueFloat64x2 [a] x)
	// result: (VREDUCEPD128 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledResidueFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledResidueFloat64x4 [a] x)
	// result: (VREDUCEPD256 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundScaledResidueFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundScaledResidueFloat64x8 [a] x)
	// result: (VREDUCEPD512 [a+0] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRoundToEven(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (RoundToEven x)
	// result: (ROUNDSD [0] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64ROUNDSD)
		v.AuxInt = ssa.Int8ToAuxInt(0)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpRsh16Ux16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh16Ux16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPWconst y [16])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRW, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v2.AuxInt = ssa.Int16ToAuxInt(16)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh16Ux16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRW x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRW)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh16Ux32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh16Ux32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPLconst y [16])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRW, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(16)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh16Ux32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRW x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRW)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh16Ux64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh16Ux64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPQconst y [16])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRW, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(16)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh16Ux64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRW x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRW)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh16Ux8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh16Ux8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRW <t> x y) (SBBLcarrymask <t> (CMPBconst y [16])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRW, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v2.AuxInt = ssa.Int8ToAuxInt(16)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh16Ux8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRW x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRW)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh16x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh16x16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [16])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARW)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v3.AuxInt = ssa.Int16ToAuxInt(16)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh16x16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARW x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARW)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh16x32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [16])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARW)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v3.AuxInt = ssa.Int32ToAuxInt(16)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh16x32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARW x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARW)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh16x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh16x64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARW <t> x (ORQ <y.Type> y (NOTQ <y.Type> (SBBQcarrymask <y.Type> (CMPQconst y [16])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARW)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORQ, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTQ, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v3.AuxInt = ssa.Int32ToAuxInt(16)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh16x64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARW x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARW)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh16x8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARW <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [16])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARW)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v3.AuxInt = ssa.Int8ToAuxInt(16)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh16x8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARW x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARW)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh32Ux16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh32Ux16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPWconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v2.AuxInt = ssa.Int16ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh32Ux16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh32Ux32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh32Ux32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPLconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh32Ux32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh32Ux64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh32Ux64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPQconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh32Ux64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh32Ux8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh32Ux8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRL <t> x y) (SBBLcarrymask <t> (CMPBconst y [32])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRL, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v2.AuxInt = ssa.Int8ToAuxInt(32)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh32Ux8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh32x16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [32])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v3.AuxInt = ssa.Int16ToAuxInt(32)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh32x16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh32x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh32x32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [32])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v3.AuxInt = ssa.Int32ToAuxInt(32)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh32x32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh32x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh32x64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARL <t> x (ORQ <y.Type> y (NOTQ <y.Type> (SBBQcarrymask <y.Type> (CMPQconst y [32])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORQ, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTQ, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v3.AuxInt = ssa.Int32ToAuxInt(32)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh32x64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh32x8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARL <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [32])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v3.AuxInt = ssa.Int8ToAuxInt(32)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh32x8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARL x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARL)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh64Ux16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh64Ux16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDQ (SHRQ <t> x y) (SBBQcarrymask <t> (CMPWconst y [64])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRQ, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v2.AuxInt = ssa.Int16ToAuxInt(64)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh64Ux16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh64Ux32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh64Ux32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDQ (SHRQ <t> x y) (SBBQcarrymask <t> (CMPLconst y [64])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRQ, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(64)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh64Ux32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh64Ux64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh64Ux64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDQ (SHRQ <t> x y) (SBBQcarrymask <t> (CMPQconst y [64])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRQ, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(64)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh64Ux64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh64Ux8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh64Ux8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDQ (SHRQ <t> x y) (SBBQcarrymask <t> (CMPBconst y [64])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRQ, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v2.AuxInt = ssa.Int8ToAuxInt(64)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh64Ux8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh64x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh64x16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARQ <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [64])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v3.AuxInt = ssa.Int16ToAuxInt(64)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh64x16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh64x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh64x32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARQ <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [64])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v3.AuxInt = ssa.Int32ToAuxInt(64)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh64x32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh64x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh64x64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARQ <t> x (ORQ <y.Type> y (NOTQ <y.Type> (SBBQcarrymask <y.Type> (CMPQconst y [64])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORQ, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTQ, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v3.AuxInt = ssa.Int32ToAuxInt(64)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh64x64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh64x8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARQ <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [64])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v3.AuxInt = ssa.Int8ToAuxInt(64)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh64x8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARQ x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARQ)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh8Ux16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh8Ux16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPWconst y [8])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRB, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v2.AuxInt = ssa.Int16ToAuxInt(8)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh8Ux16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRB x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRB)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh8Ux32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh8Ux32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPLconst y [8])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRB, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(8)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh8Ux32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRB x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRB)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh8Ux64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh8Ux64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPQconst y [8])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRB, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v2.AuxInt = ssa.Int32ToAuxInt(8)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh8Ux64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRB x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRB)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh8Ux8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh8Ux8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (ANDL (SHRB <t> x y) (SBBLcarrymask <t> (CMPBconst y [8])))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SHRB, t)
		v0.AddArg2(x, y)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, t)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v2.AuxInt = ssa.Int8ToAuxInt(8)
		v2.AddArg(y)
		v1.AddArg(v2)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Rsh8Ux8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SHRB x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SHRB)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh8x16 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPWconst y [8])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARB)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPWconst, types.TypeFlags)
		v3.AuxInt = ssa.Int16ToAuxInt(8)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh8x16 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARB x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARB)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh8x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh8x32 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPLconst y [8])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARB)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
		v3.AuxInt = ssa.Int32ToAuxInt(8)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh8x32 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARB x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARB)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh8x64 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARB <t> x (ORQ <y.Type> y (NOTQ <y.Type> (SBBQcarrymask <y.Type> (CMPQconst y [8])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARB)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORQ, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTQ, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
		v3.AuxInt = ssa.Int32ToAuxInt(8)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh8x64 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARB x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARB)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpRsh8x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (Rsh8x8 <t> x y)
	// cond: !ssa.ShiftIsBounded(v)
	// result: (SARB <t> x (ORL <y.Type> y (NOTL <y.Type> (SBBLcarrymask <y.Type> (CMPBconst y [8])))))
	for {
		t := v.Type
		x := v_0
		y := v_1
		if !(!ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARB)
		v.Type = t
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ORL, y.Type)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64NOTL, y.Type)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBLcarrymask, y.Type)
		v3 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPBconst, types.TypeFlags)
		v3.AuxInt = ssa.Int8ToAuxInt(8)
		v3.AddArg(y)
		v2.AddArg(v3)
		v1.AddArg(v2)
		v0.AddArg2(y, v1)
		v.AddArg2(x, v0)
		return true
	}
	// match: (Rsh8x8 x y)
	// cond: ssa.ShiftIsBounded(v)
	// result: (SARB x y)
	for {
		x := v_0
		y := v_1
		if !(ssa.ShiftIsBounded(v)) {
			break
		}
		v.Reset(ssaop.OpAMD64SARB)
		v.AddArg2(x, y)
		return true
	}
	return false
}
func rewriteValue_OpSelect0(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Select0 (Mul64uover x y))
	// result: (Select0 <typ.UInt64> (MULQU x y))
	for {
		if v_0.Op != ssaop.OpMul64uover {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		v.Reset(ssaop.OpSelect0)
		v.Type = typ.UInt64
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MULQU, types.NewTuple(typ.UInt64, types.TypeFlags))
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
	// match: (Select0 (Mul32uover x y))
	// result: (Select0 <typ.UInt32> (MULLU x y))
	for {
		if v_0.Op != ssaop.OpMul32uover {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		v.Reset(ssaop.OpSelect0)
		v.Type = typ.UInt32
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MULLU, types.NewTuple(typ.UInt32, types.TypeFlags))
		v0.AddArg2(x, y)
		v.AddArg(v0)
		return true
	}
	// match: (Select0 (Add64carry x y c))
	// result: (Select0 (ADCQ x y (Select1 <types.TypeFlags> (NEGLflags c))))
	for {
		if v_0.Op != ssaop.OpAdd64carry {
			break
		}
		c := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64ADCQ, types.NewTuple(typ.UInt64, types.TypeFlags))
		v1 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGLflags, types.NewTuple(typ.UInt32, types.TypeFlags))
		v2.AddArg(c)
		v1.AddArg(v2)
		v0.AddArg3(x, y, v1)
		v.AddArg(v0)
		return true
	}
	// match: (Select0 (Sub64borrow x y c))
	// result: (Select0 (SBBQ x y (Select1 <types.TypeFlags> (NEGLflags c))))
	for {
		if v_0.Op != ssaop.OpSub64borrow {
			break
		}
		c := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		v.Reset(ssaop.OpSelect0)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQ, types.NewTuple(typ.UInt64, types.TypeFlags))
		v1 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGLflags, types.NewTuple(typ.UInt32, types.TypeFlags))
		v2.AddArg(c)
		v1.AddArg(v2)
		v0.AddArg3(x, y, v1)
		v.AddArg(v0)
		return true
	}
	// match: (Select0 <t> (AddTupleFirst32 val tuple))
	// result: (ADDL val (Select0 <t> tuple))
	for {
		t := v.Type
		if v_0.Op != ssaop.OpAMD64AddTupleFirst32 {
			break
		}
		tuple := v_0.Args[1]
		val := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ADDL)
		v0 := b.NewValue0(v.Pos, ssaop.OpSelect0, t)
		v0.AddArg(tuple)
		v.AddArg2(val, v0)
		return true
	}
	// match: (Select0 <t> (AddTupleFirst64 val tuple))
	// result: (ADDQ val (Select0 <t> tuple))
	for {
		t := v.Type
		if v_0.Op != ssaop.OpAMD64AddTupleFirst64 {
			break
		}
		tuple := v_0.Args[1]
		val := v_0.Args[0]
		v.Reset(ssaop.OpAMD64ADDQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpSelect0, t)
		v0.AddArg(tuple)
		v.AddArg2(val, v0)
		return true
	}
	// match: (Select0 a:(ADDQconstflags [c] x))
	// cond: a.Uses == 1
	// result: (ADDQconst [c] x)
	for {
		a := v_0
		if a.Op != ssaop.OpAMD64ADDQconstflags {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		x := a.Args[0]
		if !(a.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQconst)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	// match: (Select0 a:(ADDLconstflags [c] x))
	// cond: a.Uses == 1
	// result: (ADDLconst [c] x)
	for {
		a := v_0
		if a.Op != ssaop.OpAMD64ADDLconstflags {
			break
		}
		c := ssa.AuxIntToInt32(a.AuxInt)
		x := a.Args[0]
		if !(a.Uses == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDLconst)
		v.AuxInt = ssa.Int32ToAuxInt(c)
		v.AddArg(x)
		return true
	}
	return false
}
func rewriteValue_OpSelect1(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Select1 (Mul64uover x y))
	// result: (SETO (Select1 <types.TypeFlags> (MULQU x y)))
	for {
		if v_0.Op != ssaop.OpMul64uover {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETO)
		v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MULQU, types.NewTuple(typ.UInt64, types.TypeFlags))
		v1.AddArg2(x, y)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	// match: (Select1 (Mul32uover x y))
	// result: (SETO (Select1 <types.TypeFlags> (MULLU x y)))
	for {
		if v_0.Op != ssaop.OpMul32uover {
			break
		}
		y := v_0.Args[1]
		x := v_0.Args[0]
		v.Reset(ssaop.OpAMD64SETO)
		v0 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MULLU, types.NewTuple(typ.UInt32, types.TypeFlags))
		v1.AddArg2(x, y)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	// match: (Select1 (Add64carry x y c))
	// result: (MOVBQZX (SETB <types.Types[types.TUINT8]> (Select1 <types.TypeFlags> (ADCQ x y (Select1 <types.TypeFlags> (NEGLflags c))))))
	for {
		if v_0.Op != ssaop.OpAdd64carry {
			break
		}
		c := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		v.Reset(ssaop.OpAMD64MOVBQZX)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SETB, types.Types[types.TUINT8])
		v1 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64ADCQ, types.NewTuple(typ.UInt64, types.TypeFlags))
		v3 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v4 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGLflags, types.NewTuple(typ.UInt32, types.TypeFlags))
		v4.AddArg(c)
		v3.AddArg(v4)
		v2.AddArg3(x, y, v3)
		v1.AddArg(v2)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	// match: (Select1 (Sub64borrow x y c))
	// result: (MOVBQZX (SETB <types.Types[types.TUINT8]> (Select1 <types.TypeFlags> (SBBQ x y (Select1 <types.TypeFlags> (NEGLflags c))))))
	for {
		if v_0.Op != ssaop.OpSub64borrow {
			break
		}
		c := v_0.Args[2]
		x := v_0.Args[0]
		y := v_0.Args[1]
		v.Reset(ssaop.OpAMD64MOVBQZX)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64SETB, types.Types[types.TUINT8])
		v1 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v2 := b.NewValue0(v.Pos, ssaop.OpAMD64SBBQ, types.NewTuple(typ.UInt64, types.TypeFlags))
		v3 := b.NewValue0(v.Pos, ssaop.OpSelect1, types.TypeFlags)
		v4 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGLflags, types.NewTuple(typ.UInt32, types.TypeFlags))
		v4.AddArg(c)
		v3.AddArg(v4)
		v2.AddArg3(x, y, v3)
		v1.AddArg(v2)
		v0.AddArg(v1)
		v.AddArg(v0)
		return true
	}
	// match: (Select1 (NEGLflags (MOVQconst [0])))
	// result: (FlagEQ)
	for {
		if v_0.Op != ssaop.OpAMD64NEGLflags {
			break
		}
		v_0_0 := v_0.Args[0]
		if v_0_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_0_0.AuxInt) != 0 {
			break
		}
		v.Reset(ssaop.OpAMD64FlagEQ)
		return true
	}
	// match: (Select1 (NEGLflags (MOVBQZX (SETB x))))
	// result: x
	for {
		if v_0.Op != ssaop.OpAMD64NEGLflags {
			break
		}
		v_0_0 := v_0.Args[0]
		if v_0_0.Op != ssaop.OpAMD64MOVBQZX {
			break
		}
		v_0_0_0 := v_0_0.Args[0]
		if v_0_0_0.Op != ssaop.OpAMD64SETB {
			break
		}
		x := v_0_0_0.Args[0]
		v.CopyOf(x)
		return true
	}
	// match: (Select1 (AddTupleFirst32 _ tuple))
	// result: (Select1 tuple)
	for {
		if v_0.Op != ssaop.OpAMD64AddTupleFirst32 {
			break
		}
		tuple := v_0.Args[1]
		v.Reset(ssaop.OpSelect1)
		v.AddArg(tuple)
		return true
	}
	// match: (Select1 (AddTupleFirst64 _ tuple))
	// result: (Select1 tuple)
	for {
		if v_0.Op != ssaop.OpAMD64AddTupleFirst64 {
			break
		}
		tuple := v_0.Args[1]
		v.Reset(ssaop.OpSelect1)
		v.AddArg(tuple)
		return true
	}
	// match: (Select1 xadd:(XADDLlock [off] {sym} val ptr mem))
	// cond: xadd.Uses == 1 && ssa.Clobber(xadd)
	// result: (ADDLlock [off] {sym} ptr val mem)
	for {
		xadd := v_0
		if xadd.Op != ssaop.OpAMD64XADDLlock {
			break
		}
		off := ssa.AuxIntToInt32(xadd.AuxInt)
		sym := ssa.AuxToSym(xadd.Aux)
		mem := xadd.Args[2]
		val := xadd.Args[0]
		ptr := xadd.Args[1]
		if !(xadd.Uses == 1 && ssa.Clobber(xadd)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDLlock)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Select1 xadd:(XADDQlock [off] {sym} val ptr mem))
	// cond: xadd.Uses == 1 && ssa.Clobber(xadd)
	// result: (ADDQlock [off] {sym} ptr val mem)
	for {
		xadd := v_0
		if xadd.Op != ssaop.OpAMD64XADDQlock {
			break
		}
		off := ssa.AuxIntToInt32(xadd.AuxInt)
		sym := ssa.AuxToSym(xadd.Aux)
		mem := xadd.Args[2]
		val := xadd.Args[0]
		ptr := xadd.Args[1]
		if !(xadd.Uses == 1 && ssa.Clobber(xadd)) {
			break
		}
		v.Reset(ssaop.OpAMD64ADDQlock)
		v.AuxInt = ssa.Int32ToAuxInt(off)
		v.Aux = ssa.SymToAux(sym)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Select1 a:(LoweredAtomicAnd64 ptr val mem))
	// cond: a.Uses == 1 && ssa.Clobber(a)
	// result: (ANDQlock ptr val mem)
	for {
		a := v_0
		if a.Op != ssaop.OpAMD64LoweredAtomicAnd64 {
			break
		}
		mem := a.Args[2]
		ptr := a.Args[0]
		val := a.Args[1]
		if !(a.Uses == 1 && ssa.Clobber(a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDQlock)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Select1 a:(LoweredAtomicAnd32 ptr val mem))
	// cond: a.Uses == 1 && ssa.Clobber(a)
	// result: (ANDLlock ptr val mem)
	for {
		a := v_0
		if a.Op != ssaop.OpAMD64LoweredAtomicAnd32 {
			break
		}
		mem := a.Args[2]
		ptr := a.Args[0]
		val := a.Args[1]
		if !(a.Uses == 1 && ssa.Clobber(a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ANDLlock)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Select1 a:(LoweredAtomicOr64 ptr val mem))
	// cond: a.Uses == 1 && ssa.Clobber(a)
	// result: (ORQlock ptr val mem)
	for {
		a := v_0
		if a.Op != ssaop.OpAMD64LoweredAtomicOr64 {
			break
		}
		mem := a.Args[2]
		ptr := a.Args[0]
		val := a.Args[1]
		if !(a.Uses == 1 && ssa.Clobber(a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORQlock)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Select1 a:(LoweredAtomicOr32 ptr val mem))
	// cond: a.Uses == 1 && ssa.Clobber(a)
	// result: (ORLlock ptr val mem)
	for {
		a := v_0
		if a.Op != ssaop.OpAMD64LoweredAtomicOr32 {
			break
		}
		mem := a.Args[2]
		ptr := a.Args[0]
		val := a.Args[1]
		if !(a.Uses == 1 && ssa.Clobber(a)) {
			break
		}
		v.Reset(ssaop.OpAMD64ORLlock)
		v.AddArg3(ptr, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpSelectN(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	config := b.Func.Config
	// match: (SelectN [0] call:(CALLstatic {sym} s1:(MOVQstoreconst _ [sc] s2:(MOVQstore _ src s3:(MOVQstore _ dst mem)))))
	// cond: sc.Val64() >= 0 && ssa.IsSameCall(sym, "runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && ssa.IsInlinableMemmove(dst, src, sc.Val64(), config) && ssa.Clobber(s1, s2, s3, call)
	// result: (Move [sc.Val64()] dst src mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 0 {
			break
		}
		call := v_0
		if call.Op != ssaop.OpAMD64CALLstatic || len(call.Args) != 1 {
			break
		}
		sym := ssa.AuxToCall(call.Aux)
		s1 := call.Args[0]
		if s1.Op != ssaop.OpAMD64MOVQstoreconst {
			break
		}
		sc := ssa.AuxIntToValAndOff(s1.AuxInt)
		_ = s1.Args[1]
		s2 := s1.Args[1]
		if s2.Op != ssaop.OpAMD64MOVQstore {
			break
		}
		_ = s2.Args[2]
		src := s2.Args[1]
		s3 := s2.Args[2]
		if s3.Op != ssaop.OpAMD64MOVQstore {
			break
		}
		mem := s3.Args[2]
		dst := s3.Args[1]
		if !(sc.Val64() >= 0 && ssa.IsSameCall(sym, "runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && ssa.IsInlinableMemmove(dst, src, sc.Val64(), config) && ssa.Clobber(s1, s2, s3, call)) {
			break
		}
		v.Reset(ssaop.OpMove)
		v.AuxInt = ssa.Int64ToAuxInt(sc.Val64())
		v.AddArg3(dst, src, mem)
		return true
	}
	// match: (SelectN [0] call:(CALLstatic {sym} dst src (MOVQconst [sz]) mem))
	// cond: sz >= 0 && ssa.IsSameCall(sym, "runtime.memmove") && call.Uses == 1 && ssa.IsInlinableMemmove(dst, src, sz, config) && ssa.Clobber(call)
	// result: (Move [sz] dst src mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 0 {
			break
		}
		call := v_0
		if call.Op != ssaop.OpAMD64CALLstatic || len(call.Args) != 4 {
			break
		}
		sym := ssa.AuxToCall(call.Aux)
		mem := call.Args[3]
		dst := call.Args[0]
		src := call.Args[1]
		call_2 := call.Args[2]
		if call_2.Op != ssaop.OpAMD64MOVQconst {
			break
		}
		sz := ssa.AuxIntToInt64(call_2.AuxInt)
		if !(sz >= 0 && ssa.IsSameCall(sym, "runtime.memmove") && call.Uses == 1 && ssa.IsInlinableMemmove(dst, src, sz, config) && ssa.Clobber(call)) {
			break
		}
		v.Reset(ssaop.OpMove)
		v.AuxInt = ssa.Int64ToAuxInt(sz)
		v.AddArg3(dst, src, mem)
		return true
	}
	return false
}
func rewriteValue_OpSetHiFloat32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiFloat32x16 x y)
	// result: (VINSERTF64X4512 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTF64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiFloat32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiFloat32x8 x y)
	// result: (VINSERTF128256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTF128256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiFloat64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiFloat64x4 x y)
	// result: (VINSERTF128256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTF128256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiFloat64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiFloat64x8 x y)
	// result: (VINSERTF64X4512 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTF64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiInt16x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiInt16x16 x y)
	// result: (VINSERTI128256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiInt16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiInt16x32 x y)
	// result: (VINSERTI64X4512 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiInt32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiInt32x16 x y)
	// result: (VINSERTI64X4512 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiInt32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiInt32x8 x y)
	// result: (VINSERTI128256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiInt64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiInt64x4 x y)
	// result: (VINSERTI128256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiInt64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiInt64x8 x y)
	// result: (VINSERTI64X4512 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiInt8x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiInt8x32 x y)
	// result: (VINSERTI128256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiInt8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiInt8x64 x y)
	// result: (VINSERTI64X4512 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiUint16x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiUint16x16 x y)
	// result: (VINSERTI128256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiUint16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiUint16x32 x y)
	// result: (VINSERTI64X4512 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiUint32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiUint32x16 x y)
	// result: (VINSERTI64X4512 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiUint32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiUint32x8 x y)
	// result: (VINSERTI128256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiUint64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiUint64x4 x y)
	// result: (VINSERTI128256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiUint64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiUint64x8 x y)
	// result: (VINSERTI64X4512 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiUint8x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiUint8x32 x y)
	// result: (VINSERTI128256 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetHiUint8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetHiUint8x64 x y)
	// result: (VINSERTI64X4512 [1] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(1)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoFloat32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoFloat32x16 x y)
	// result: (VINSERTF64X4512 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTF64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoFloat32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoFloat32x8 x y)
	// result: (VINSERTF128256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTF128256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoFloat64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoFloat64x4 x y)
	// result: (VINSERTF128256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTF128256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoFloat64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoFloat64x8 x y)
	// result: (VINSERTF64X4512 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTF64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoInt16x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoInt16x16 x y)
	// result: (VINSERTI128256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoInt16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoInt16x32 x y)
	// result: (VINSERTI64X4512 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoInt32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoInt32x16 x y)
	// result: (VINSERTI64X4512 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoInt32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoInt32x8 x y)
	// result: (VINSERTI128256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoInt64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoInt64x4 x y)
	// result: (VINSERTI128256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoInt64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoInt64x8 x y)
	// result: (VINSERTI64X4512 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoInt8x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoInt8x32 x y)
	// result: (VINSERTI128256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoInt8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoInt8x64 x y)
	// result: (VINSERTI64X4512 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoUint16x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoUint16x16 x y)
	// result: (VINSERTI128256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoUint16x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoUint16x32 x y)
	// result: (VINSERTI64X4512 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoUint32x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoUint32x16 x y)
	// result: (VINSERTI64X4512 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoUint32x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoUint32x8 x y)
	// result: (VINSERTI128256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoUint64x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoUint64x4 x y)
	// result: (VINSERTI128256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoUint64x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoUint64x8 x y)
	// result: (VINSERTI64X4512 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoUint8x32(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoUint8x32 x y)
	// result: (VINSERTI128256 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI128256)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSetLoUint8x64(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (SetLoUint8x64 x y)
	// result: (VINSERTI64X4512 [0] x y)
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64VINSERTI64X4512)
		v.AuxInt = ssa.Uint8ToAuxInt(0)
		v.AddArg2(x, y)
		return true
	}
}
func rewriteValue_OpSlicemask(v *ssa.Value) bool {
	v_0 := v.Args[0]
	b := v.Block
	// match: (Slicemask <t> x)
	// result: (SARQconst (NEGQ <t> x) [63])
	for {
		t := v.Type
		x := v_0
		v.Reset(ssaop.OpAMD64SARQconst)
		v.AuxInt = ssa.Int8ToAuxInt(63)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64NEGQ, t)
		v0.AddArg(x)
		v.AddArg(v0)
		return true
	}
}
func rewriteValue_OpSpectreIndex(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SpectreIndex <t> x y)
	// result: (CMOVQCC x (MOVQconst [0]) (CMPQ x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64CMOVQCC)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQconst, typ.UInt64)
		v0.AuxInt = ssa.Int64ToAuxInt(0)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v1.AddArg2(x, y)
		v.AddArg3(x, v0, v1)
		return true
	}
}
func rewriteValue_OpSpectreSliceIndex(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (SpectreSliceIndex <t> x y)
	// result: (CMOVQHI x (MOVQconst [0]) (CMPQ x y))
	for {
		x := v_0
		y := v_1
		v.Reset(ssaop.OpAMD64CMOVQHI)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQconst, typ.UInt64)
		v0.AuxInt = ssa.Int64ToAuxInt(0)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64CMPQ, types.TypeFlags)
		v1.AddArg2(x, y)
		v.AddArg3(x, v0, v1)
		return true
	}
}
func rewriteValue_OpStore(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	// match: (Store {t} ptr val mem)
	// cond: t.Size() == 8 && t.IsFloat()
	// result: (MOVSDstore ptr val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		val := v_1
		mem := v_2
		if !(t.Size() == 8 && t.IsFloat()) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSDstore)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Store {t} ptr val mem)
	// cond: t.Size() == 4 && t.IsFloat()
	// result: (MOVSSstore ptr val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		val := v_1
		mem := v_2
		if !(t.Size() == 4 && t.IsFloat()) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVSSstore)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Store {t} ptr val mem)
	// cond: t.Size() == 8 && !t.IsFloat()
	// result: (MOVQstore ptr val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		val := v_1
		mem := v_2
		if !(t.Size() == 8 && !t.IsFloat()) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstore)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Store {t} ptr val mem)
	// cond: t.Size() == 4 && !t.IsFloat()
	// result: (MOVLstore ptr val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		val := v_1
		mem := v_2
		if !(t.Size() == 4 && !t.IsFloat()) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVLstore)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Store {t} ptr val mem)
	// cond: t.Size() == 2
	// result: (MOVWstore ptr val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		val := v_1
		mem := v_2
		if !(t.Size() == 2) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVWstore)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Store {t} ptr val mem)
	// cond: t.Size() == 1
	// result: (MOVBstore ptr val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		val := v_1
		mem := v_2
		if !(t.Size() == 1) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVBstore)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Store {t} ptr val mem)
	// cond: t.Size() == 16
	// result: (VMOVDQUstore128 ptr val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		val := v_1
		mem := v_2
		if !(t.Size() == 16) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUstore128)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Store {t} ptr val mem)
	// cond: t.Size() == 32
	// result: (VMOVDQUstore256 ptr val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		val := v_1
		mem := v_2
		if !(t.Size() == 32) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUstore256)
		v.AddArg3(ptr, val, mem)
		return true
	}
	// match: (Store {t} ptr val mem)
	// cond: t.Size() == 64
	// result: (VMOVDQUstore512 ptr val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		val := v_1
		mem := v_2
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64VMOVDQUstore512)
		v.AddArg3(ptr, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpStoreMasked16(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (StoreMasked16 {t} ptr mask val mem)
	// cond: t.Size() == 64
	// result: (VPMASK16store512 ptr (VPMOVVec16x32ToM <types.TypeMask> mask) val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		mask := v_1
		val := v_2
		mem := v_3
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK16store512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(ptr, v0, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpStoreMasked32(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (StoreMasked32 {t} ptr mask val mem)
	// cond: t.Size() == 16
	// result: (VPMASK32store128 ptr mask val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		mask := v_1
		val := v_2
		mem := v_3
		if !(t.Size() == 16) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK32store128)
		v.AddArg4(ptr, mask, val, mem)
		return true
	}
	// match: (StoreMasked32 {t} ptr mask val mem)
	// cond: t.Size() == 32
	// result: (VPMASK32store256 ptr mask val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		mask := v_1
		val := v_2
		mem := v_3
		if !(t.Size() == 32) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK32store256)
		v.AddArg4(ptr, mask, val, mem)
		return true
	}
	// match: (StoreMasked32 {t} ptr mask val mem)
	// cond: t.Size() == 64
	// result: (VPMASK32store512 ptr (VPMOVVec32x16ToM <types.TypeMask> mask) val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		mask := v_1
		val := v_2
		mem := v_3
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK32store512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(ptr, v0, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpStoreMasked64(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (StoreMasked64 {t} ptr mask val mem)
	// cond: t.Size() == 16
	// result: (VPMASK64store128 ptr mask val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		mask := v_1
		val := v_2
		mem := v_3
		if !(t.Size() == 16) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK64store128)
		v.AddArg4(ptr, mask, val, mem)
		return true
	}
	// match: (StoreMasked64 {t} ptr mask val mem)
	// cond: t.Size() == 32
	// result: (VPMASK64store256 ptr mask val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		mask := v_1
		val := v_2
		mem := v_3
		if !(t.Size() == 32) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK64store256)
		v.AddArg4(ptr, mask, val, mem)
		return true
	}
	// match: (StoreMasked64 {t} ptr mask val mem)
	// cond: t.Size() == 64
	// result: (VPMASK64store512 ptr (VPMOVVec64x8ToM <types.TypeMask> mask) val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		mask := v_1
		val := v_2
		mem := v_3
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK64store512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(ptr, v0, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpStoreMasked8(v *ssa.Value) bool {
	v_3 := v.Args[3]
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (StoreMasked8 {t} ptr mask val mem)
	// cond: t.Size() == 64
	// result: (VPMASK8store512 ptr (VPMOVVec8x64ToM <types.TypeMask> mask) val mem)
	for {
		t := ssa.AuxToType(v.Aux)
		ptr := v_0
		mask := v_1
		val := v_2
		mem := v_3
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64VPMASK8store512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x64ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg4(ptr, v0, val, mem)
		return true
	}
	return false
}
func rewriteValue_OpTrunc(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (Trunc x)
	// result: (ROUNDSD [3] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64ROUNDSD)
		v.AuxInt = ssa.Int8ToAuxInt(3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncFloat32x4 x)
	// result: (VROUNDPS128 [3] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncFloat32x8 x)
	// result: (VROUNDPS256 [3] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncFloat64x2 x)
	// result: (VROUNDPD128 [3] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncFloat64x4 x)
	// result: (VROUNDPD256 [3] x)
	for {
		x := v_0
		v.Reset(ssaop.OpAMD64VROUNDPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledFloat32x16 [a] x)
	// result: (VRNDSCALEPS512 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledFloat32x4 [a] x)
	// result: (VRNDSCALEPS128 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledFloat32x8 [a] x)
	// result: (VRNDSCALEPS256 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledFloat64x2 [a] x)
	// result: (VRNDSCALEPD128 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledFloat64x4 [a] x)
	// result: (VRNDSCALEPD256 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledFloat64x8 [a] x)
	// result: (VRNDSCALEPD512 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VRNDSCALEPD512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledResidueFloat32x16(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledResidueFloat32x16 [a] x)
	// result: (VREDUCEPS512 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledResidueFloat32x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledResidueFloat32x4 [a] x)
	// result: (VREDUCEPS128 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledResidueFloat32x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledResidueFloat32x8 [a] x)
	// result: (VREDUCEPS256 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPS256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledResidueFloat64x2(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledResidueFloat64x2 [a] x)
	// result: (VREDUCEPD128 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD128)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledResidueFloat64x4(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledResidueFloat64x4 [a] x)
	// result: (VREDUCEPD256 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD256)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpTruncScaledResidueFloat64x8(v *ssa.Value) bool {
	v_0 := v.Args[0]
	// match: (TruncScaledResidueFloat64x8 [a] x)
	// result: (VREDUCEPD512 [a+3] x)
	for {
		a := ssa.AuxIntToUint8(v.AuxInt)
		x := v_0
		v.Reset(ssaop.OpAMD64VREDUCEPD512)
		v.AuxInt = ssa.Uint8ToAuxInt(a + 3)
		v.AddArg(x)
		return true
	}
}
func rewriteValue_OpZero(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	typ := &b.Func.Config.Types
	// match: (Zero [0] _ mem)
	// result: mem
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 0 {
			break
		}
		mem := v_1
		v.CopyOf(mem)
		return true
	}
	// match: (Zero [1] destptr mem)
	// result: (MOVBstoreconst [ssa.MakeValAndOff(0,0)] destptr mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 1 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVBstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v.AddArg2(destptr, mem)
		return true
	}
	// match: (Zero [2] destptr mem)
	// result: (MOVWstoreconst [ssa.MakeValAndOff(0,0)] destptr mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 2 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVWstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v.AddArg2(destptr, mem)
		return true
	}
	// match: (Zero [4] destptr mem)
	// result: (MOVLstoreconst [ssa.MakeValAndOff(0,0)] destptr mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 4 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVLstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v.AddArg2(destptr, mem)
		return true
	}
	// match: (Zero [8] destptr mem)
	// result: (MOVQstoreconst [ssa.MakeValAndOff(0,0)] destptr mem)
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 8 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVQstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v.AddArg2(destptr, mem)
		return true
	}
	// match: (Zero [3] destptr mem)
	// result: (MOVBstoreconst [ssa.MakeValAndOff(0,2)] destptr (MOVWstoreconst [ssa.MakeValAndOff(0,0)] destptr mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 3 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVBstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 2))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVWstoreconst, types.TypeMem)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v0.AddArg2(destptr, mem)
		v.AddArg2(destptr, v0)
		return true
	}
	// match: (Zero [5] destptr mem)
	// result: (MOVBstoreconst [ssa.MakeValAndOff(0,4)] destptr (MOVLstoreconst [ssa.MakeValAndOff(0,0)] destptr mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 5 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVBstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 4))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLstoreconst, types.TypeMem)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v0.AddArg2(destptr, mem)
		v.AddArg2(destptr, v0)
		return true
	}
	// match: (Zero [6] destptr mem)
	// result: (MOVWstoreconst [ssa.MakeValAndOff(0,4)] destptr (MOVLstoreconst [ssa.MakeValAndOff(0,0)] destptr mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 6 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVWstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 4))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLstoreconst, types.TypeMem)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v0.AddArg2(destptr, mem)
		v.AddArg2(destptr, v0)
		return true
	}
	// match: (Zero [7] destptr mem)
	// result: (MOVLstoreconst [ssa.MakeValAndOff(0,3)] destptr (MOVLstoreconst [ssa.MakeValAndOff(0,0)] destptr mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 7 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVLstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 3))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVLstoreconst, types.TypeMem)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v0.AddArg2(destptr, mem)
		v.AddArg2(destptr, v0)
		return true
	}
	// match: (Zero [9] destptr mem)
	// result: (MOVBstoreconst [ssa.MakeValAndOff(0,8)] destptr (MOVQstoreconst [ssa.MakeValAndOff(0,0)] destptr mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 9 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVBstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 8))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstoreconst, types.TypeMem)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v0.AddArg2(destptr, mem)
		v.AddArg2(destptr, v0)
		return true
	}
	// match: (Zero [10] destptr mem)
	// result: (MOVWstoreconst [ssa.MakeValAndOff(0,8)] destptr (MOVQstoreconst [ssa.MakeValAndOff(0,0)] destptr mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 10 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVWstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 8))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstoreconst, types.TypeMem)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v0.AddArg2(destptr, mem)
		v.AddArg2(destptr, v0)
		return true
	}
	// match: (Zero [11] destptr mem)
	// result: (MOVLstoreconst [ssa.MakeValAndOff(0,7)] destptr (MOVQstoreconst [ssa.MakeValAndOff(0,0)] destptr mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 11 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVLstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 7))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstoreconst, types.TypeMem)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v0.AddArg2(destptr, mem)
		v.AddArg2(destptr, v0)
		return true
	}
	// match: (Zero [12] destptr mem)
	// result: (MOVLstoreconst [ssa.MakeValAndOff(0,8)] destptr (MOVQstoreconst [ssa.MakeValAndOff(0,0)] destptr mem))
	for {
		if ssa.AuxIntToInt64(v.AuxInt) != 12 {
			break
		}
		destptr := v_0
		mem := v_1
		v.Reset(ssaop.OpAMD64MOVLstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 8))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstoreconst, types.TypeMem)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v0.AddArg2(destptr, mem)
		v.AddArg2(destptr, v0)
		return true
	}
	// match: (Zero [s] destptr mem)
	// cond: s > 12 && s < 16
	// result: (MOVQstoreconst [ssa.MakeValAndOff(0,int32(s-8))] destptr (MOVQstoreconst [ssa.MakeValAndOff(0,0)] destptr mem))
	for {
		s := ssa.AuxIntToInt64(v.AuxInt)
		destptr := v_0
		mem := v_1
		if !(s > 12 && s < 16) {
			break
		}
		v.Reset(ssaop.OpAMD64MOVQstoreconst)
		v.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, int32(s-8)))
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQstoreconst, types.TypeMem)
		v0.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v0.AddArg2(destptr, mem)
		v.AddArg2(destptr, v0)
		return true
	}
	// match: (Zero [s] destptr mem)
	// cond: s >= 16 && s < 192
	// result: (LoweredZero [s] destptr mem)
	for {
		s := ssa.AuxIntToInt64(v.AuxInt)
		destptr := v_0
		mem := v_1
		if !(s >= 16 && s < 192) {
			break
		}
		v.Reset(ssaop.OpAMD64LoweredZero)
		v.AuxInt = ssa.Int64ToAuxInt(s)
		v.AddArg2(destptr, mem)
		return true
	}
	// match: (Zero [s] destptr mem)
	// cond: s >= 192 && s <= ssa.RepZeroThreshold
	// result: (LoweredZeroLoop [s] destptr mem)
	for {
		s := ssa.AuxIntToInt64(v.AuxInt)
		destptr := v_0
		mem := v_1
		if !(s >= 192 && s <= ssa.RepZeroThreshold) {
			break
		}
		v.Reset(ssaop.OpAMD64LoweredZeroLoop)
		v.AuxInt = ssa.Int64ToAuxInt(s)
		v.AddArg2(destptr, mem)
		return true
	}
	// match: (Zero [s] destptr mem)
	// cond: s > ssa.RepZeroThreshold && s%8 != 0
	// result: (Zero [s-s%8] (OffPtr <destptr.Type> destptr [s%8]) (MOVOstoreconst [ssa.MakeValAndOff(0,0)] destptr mem))
	for {
		s := ssa.AuxIntToInt64(v.AuxInt)
		destptr := v_0
		mem := v_1
		if !(s > ssa.RepZeroThreshold && s%8 != 0) {
			break
		}
		v.Reset(ssaop.OpZero)
		v.AuxInt = ssa.Int64ToAuxInt(s - s%8)
		v0 := b.NewValue0(v.Pos, ssaop.OpOffPtr, destptr.Type)
		v0.AuxInt = ssa.Int64ToAuxInt(s % 8)
		v0.AddArg(destptr)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVOstoreconst, types.TypeMem)
		v1.AuxInt = ssa.ValAndOffToAuxInt(ssa.MakeValAndOff(0, 0))
		v1.AddArg2(destptr, mem)
		v.AddArg2(v0, v1)
		return true
	}
	// match: (Zero [s] destptr mem)
	// cond: s > ssa.RepZeroThreshold && s%8 == 0
	// result: (REPSTOSQ destptr (MOVQconst [s/8]) (MOVQconst [0]) mem)
	for {
		s := ssa.AuxIntToInt64(v.AuxInt)
		destptr := v_0
		mem := v_1
		if !(s > ssa.RepZeroThreshold && s%8 == 0) {
			break
		}
		v.Reset(ssaop.OpAMD64REPSTOSQ)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQconst, typ.UInt64)
		v0.AuxInt = ssa.Int64ToAuxInt(s / 8)
		v1 := b.NewValue0(v.Pos, ssaop.OpAMD64MOVQconst, typ.UInt64)
		v1.AuxInt = ssa.Int64ToAuxInt(0)
		v.AddArg4(destptr, v0, v1, mem)
		return true
	}
	return false
}
func rewriteValue_OpZeroSIMD(v *ssa.Value) bool {
	// match: (ZeroSIMD <t>)
	// cond: t.Size() == 16
	// result: (Zero128 <t>)
	for {
		t := v.Type
		if !(t.Size() == 16) {
			break
		}
		v.Reset(ssaop.OpAMD64Zero128)
		v.Type = t
		return true
	}
	// match: (ZeroSIMD <t>)
	// cond: t.Size() == 32
	// result: (Zero256 <t>)
	for {
		t := v.Type
		if !(t.Size() == 32) {
			break
		}
		v.Reset(ssaop.OpAMD64Zero256)
		v.Type = t
		return true
	}
	// match: (ZeroSIMD <t>)
	// cond: t.Size() == 64
	// result: (Zero512 <t>)
	for {
		t := v.Type
		if !(t.Size() == 64) {
			break
		}
		v.Reset(ssaop.OpAMD64Zero512)
		v.Type = t
		return true
	}
	return false
}
func rewriteValue_OpblendMaskedInt16x32(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (blendMaskedInt16x32 x y mask)
	// result: (VPBLENDMWMasked512 x y (VPMOVVec16x32ToM <types.TypeMask> mask))
	for {
		x := v_0
		y := v_1
		mask := v_2
		v.Reset(ssaop.OpAMD64VPBLENDMWMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x32ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(x, y, v0)
		return true
	}
}
func rewriteValue_OpblendMaskedInt32x16(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (blendMaskedInt32x16 x y mask)
	// result: (VPBLENDMDMasked512 x y (VPMOVVec32x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		y := v_1
		mask := v_2
		v.Reset(ssaop.OpAMD64VPBLENDMDMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(x, y, v0)
		return true
	}
}
func rewriteValue_OpblendMaskedInt64x8(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (blendMaskedInt64x8 x y mask)
	// result: (VPBLENDMQMasked512 x y (VPMOVVec64x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		y := v_1
		mask := v_2
		v.Reset(ssaop.OpAMD64VPBLENDMQMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(x, y, v0)
		return true
	}
}
func rewriteValue_OpblendMaskedInt8x64(v *ssa.Value) bool {
	v_2 := v.Args[2]
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (blendMaskedInt8x64 x y mask)
	// result: (VPBLENDMBMasked512 x y (VPMOVVec8x64ToM <types.TypeMask> mask))
	for {
		x := v_0
		y := v_1
		mask := v_2
		v.Reset(ssaop.OpAMD64VPBLENDMBMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x64ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg3(x, y, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To16MaskedFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To16MaskedFloat32x4 x mask)
	// result: (VBROADCASTSSMasked512 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VBROADCASTSSMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To16MaskedInt16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To16MaskedInt16x8 x mask)
	// result: (VPBROADCASTWMasked256 x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTWMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To16MaskedInt32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To16MaskedInt32x4 x mask)
	// result: (VPBROADCASTDMasked512 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To16MaskedInt8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To16MaskedInt8x16 x mask)
	// result: (VPBROADCASTBMasked128 x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To16MaskedUint16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To16MaskedUint16x8 x mask)
	// result: (VPBROADCASTWMasked256 x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTWMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To16MaskedUint32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To16MaskedUint32x4 x mask)
	// result: (VPBROADCASTDMasked512 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To16MaskedUint8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To16MaskedUint8x16 x mask)
	// result: (VPBROADCASTBMasked128 x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To2MaskedFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To2MaskedFloat64x2 x mask)
	// result: (VPBROADCASTQMasked128 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To2MaskedInt64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To2MaskedInt64x2 x mask)
	// result: (VPBROADCASTQMasked128 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To2MaskedUint64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To2MaskedUint64x2 x mask)
	// result: (VPBROADCASTQMasked128 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To32MaskedInt16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To32MaskedInt16x8 x mask)
	// result: (VPBROADCASTWMasked512 x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTWMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To32MaskedInt8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To32MaskedInt8x16 x mask)
	// result: (VPBROADCASTBMasked256 x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To32MaskedUint16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To32MaskedUint16x8 x mask)
	// result: (VPBROADCASTWMasked512 x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTWMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To32MaskedUint8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To32MaskedUint8x16 x mask)
	// result: (VPBROADCASTBMasked256 x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To4MaskedFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To4MaskedFloat32x4 x mask)
	// result: (VBROADCASTSSMasked128 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VBROADCASTSSMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To4MaskedFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To4MaskedFloat64x2 x mask)
	// result: (VBROADCASTSDMasked256 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VBROADCASTSDMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To4MaskedInt32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To4MaskedInt32x4 x mask)
	// result: (VPBROADCASTDMasked128 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To4MaskedInt64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To4MaskedInt64x2 x mask)
	// result: (VPBROADCASTQMasked256 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To4MaskedUint32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To4MaskedUint32x4 x mask)
	// result: (VPBROADCASTDMasked128 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To4MaskedUint64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To4MaskedUint64x2 x mask)
	// result: (VPBROADCASTQMasked256 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To64MaskedInt8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To64MaskedInt8x16 x mask)
	// result: (VPBROADCASTBMasked512 x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To64MaskedUint8x16(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To64MaskedUint8x16 x mask)
	// result: (VPBROADCASTBMasked512 x (VPMOVVec8x16ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTBMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec8x16ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To8MaskedFloat32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To8MaskedFloat32x4 x mask)
	// result: (VBROADCASTSSMasked256 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VBROADCASTSSMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To8MaskedFloat64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To8MaskedFloat64x2 x mask)
	// result: (VBROADCASTSDMasked512 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VBROADCASTSDMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To8MaskedInt16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To8MaskedInt16x8 x mask)
	// result: (VPBROADCASTWMasked128 x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTWMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To8MaskedInt32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To8MaskedInt32x4 x mask)
	// result: (VPBROADCASTDMasked256 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To8MaskedInt64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To8MaskedInt64x2 x mask)
	// result: (VPBROADCASTQMasked512 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To8MaskedUint16x8(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To8MaskedUint16x8 x mask)
	// result: (VPBROADCASTWMasked128 x (VPMOVVec16x8ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTWMasked128)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec16x8ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To8MaskedUint32x4(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To8MaskedUint32x4 x mask)
	// result: (VPBROADCASTDMasked256 x (VPMOVVec32x4ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTDMasked256)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec32x4ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func rewriteValue_Opbroadcast1To8MaskedUint64x2(v *ssa.Value) bool {
	v_1 := v.Args[1]
	v_0 := v.Args[0]
	b := v.Block
	// match: (broadcast1To8MaskedUint64x2 x mask)
	// result: (VPBROADCASTQMasked512 x (VPMOVVec64x2ToM <types.TypeMask> mask))
	for {
		x := v_0
		mask := v_1
		v.Reset(ssaop.OpAMD64VPBROADCASTQMasked512)
		v0 := b.NewValue0(v.Pos, ssaop.OpAMD64VPMOVVec64x2ToM, types.TypeMask)
		v0.AddArg(mask)
		v.AddArg2(x, v0)
		return true
	}
}
func RewriteBlock(b *ssa.Block) bool {
	typ := &b.Func.Config.Types
	switch b.Kind {
	case block.BlockAMD64EQ:
		// match: (EQ (TESTL (SHLL (MOVLconst [1]) x) y))
		// result: (UGE (BTL x y))
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				if v_0_0.Op != ssaop.OpAMD64SHLL {
					continue
				}
				x := v_0_0.Args[1]
				v_0_0_0 := v_0_0.Args[0]
				if v_0_0_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_0_0_0.AuxInt) != 1 {
					continue
				}
				y := v_0_1
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTL, types.TypeFlags)
				v0.AddArg2(x, y)
				b.ResetWithControl(block.BlockAMD64UGE, v0)
				return true
			}
			break
		}
		// match: (EQ (TESTQ (SHLQ (MOVQconst [1]) x) y))
		// result: (UGE (BTQ x y))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				if v_0_0.Op != ssaop.OpAMD64SHLQ {
					continue
				}
				x := v_0_0.Args[1]
				v_0_0_0 := v_0_0.Args[0]
				if v_0_0_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_0_0_0.AuxInt) != 1 {
					continue
				}
				y := v_0_1
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQ, types.TypeFlags)
				v0.AddArg2(x, y)
				b.ResetWithControl(block.BlockAMD64UGE, v0)
				return true
			}
			break
		}
		// match: (EQ (TESTLconst [c] x))
		// cond: ssa.IsPowerOfTwo(uint32(c))
		// result: (UGE (BTLconst [int8(ssa.Log32u(uint32(c)))] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTLconst {
			v_0 := b.Controls[0]
			c := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_0.Args[0]
			if !(ssa.IsPowerOfTwo(uint32(c))) {
				break
			}
			v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
			v0.AddArg(x)
			b.ResetWithControl(block.BlockAMD64UGE, v0)
			return true
		}
		// match: (EQ (TESTQconst [c] x))
		// cond: ssa.IsPowerOfTwo(uint64(c))
		// result: (UGE (BTQconst [int8(ssa.Log32u(uint32(c)))] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQconst {
			v_0 := b.Controls[0]
			c := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_0.Args[0]
			if !(ssa.IsPowerOfTwo(uint64(c))) {
				break
			}
			v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
			v0.AddArg(x)
			b.ResetWithControl(block.BlockAMD64UGE, v0)
			return true
		}
		// match: (EQ (TESTQ (MOVQconst [c]) x))
		// cond: ssa.IsPowerOfTwo(uint64(c))
		// result: (UGE (BTQconst [int8(ssa.Log64u(uint64(c)))] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				if v_0_0.Op != ssaop.OpAMD64MOVQconst {
					continue
				}
				c := ssa.AuxIntToInt64(v_0_0.AuxInt)
				x := v_0_1
				if !(ssa.IsPowerOfTwo(uint64(c))) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log64u(uint64(c))))
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64UGE, v0)
				return true
			}
			break
		}
		// match: (EQ (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2))
		// cond: z1==z2
		// result: (UGE (BTQconst [63] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
					continue
				}
				z1_0 := z1.Args[0]
				if z1_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
					continue
				}
				x := z1_0.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(63)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64UGE, v0)
				return true
			}
			break
		}
		// match: (EQ (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2))
		// cond: z1==z2
		// result: (UGE (BTQconst [31] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
					continue
				}
				z1_0 := z1.Args[0]
				if z1_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
					continue
				}
				x := z1_0.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(31)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64UGE, v0)
				return true
			}
			break
		}
		// match: (EQ (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2))
		// cond: z1==z2
		// result: (UGE (BTQconst [0] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
					continue
				}
				z1_0 := z1.Args[0]
				if z1_0.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
					continue
				}
				x := z1_0.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(0)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64UGE, v0)
				return true
			}
			break
		}
		// match: (EQ (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2))
		// cond: z1==z2
		// result: (UGE (BTLconst [0] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
					continue
				}
				z1_0 := z1.Args[0]
				if z1_0.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
					continue
				}
				x := z1_0.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(0)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64UGE, v0)
				return true
			}
			break
		}
		// match: (EQ (TESTQ z1:(SHRQconst [63] x) z2))
		// cond: z1==z2
		// result: (UGE (BTQconst [63] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
					continue
				}
				x := z1.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(63)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64UGE, v0)
				return true
			}
			break
		}
		// match: (EQ (TESTL z1:(SHRLconst [31] x) z2))
		// cond: z1==z2
		// result: (UGE (BTLconst [31] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
					continue
				}
				x := z1.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(31)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64UGE, v0)
				return true
			}
			break
		}
		// match: (EQ (InvertFlags cmp) yes no)
		// result: (EQ cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64InvertFlags {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64EQ, cmp)
			return true
		}
		// match: (EQ (FlagEQ) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagEQ {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (EQ (FlagLT_ULT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_ULT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (EQ (FlagLT_UGT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_UGT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (EQ (FlagGT_ULT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_ULT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (EQ (FlagGT_UGT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_UGT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (EQ (TESTQ s:(Select0 blsr:(BLSRQ _)) s) yes no)
		// result: (EQ (Select1 <types.TypeFlags> blsr) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				s := v_0_0
				if s.Op != ssaop.OpSelect0 {
					continue
				}
				blsr := s.Args[0]
				if blsr.Op != ssaop.OpAMD64BLSRQ || s != v_0_1 {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpSelect1, types.TypeFlags)
				v0.AddArg(blsr)
				b.ResetWithControl(block.BlockAMD64EQ, v0)
				return true
			}
			break
		}
		// match: (EQ (TESTL s:(Select0 blsr:(BLSRL _)) s) yes no)
		// result: (EQ (Select1 <types.TypeFlags> blsr) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				s := v_0_0
				if s.Op != ssaop.OpSelect0 {
					continue
				}
				blsr := s.Args[0]
				if blsr.Op != ssaop.OpAMD64BLSRL || s != v_0_1 {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpSelect1, types.TypeFlags)
				v0.AddArg(blsr)
				b.ResetWithControl(block.BlockAMD64EQ, v0)
				return true
			}
			break
		}
		// match: (EQ t:(TESTQ a:(ADDQconst [c] x) a))
		// cond: t.Uses == 1 && flagify(a)
		// result: (EQ (Select1 <types.TypeFlags> a.Args[0]))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				a := t_0
				if a.Op != ssaop.OpAMD64ADDQconst {
					continue
				}
				if a != t_1 || !(t.Uses == 1 && flagify(a)) {
					continue
				}
				v0 := b.NewValue0(t.Pos, ssaop.OpSelect1, types.TypeFlags)
				v0.AddArg(a.Args[0])
				b.ResetWithControl(block.BlockAMD64EQ, v0)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL a:(ADDLconst [c] x) a))
		// cond: t.Uses == 1 && flagify(a)
		// result: (EQ (Select1 <types.TypeFlags> a.Args[0]))
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				a := t_0
				if a.Op != ssaop.OpAMD64ADDLconst {
					continue
				}
				if a != t_1 || !(t.Uses == 1 && flagify(a)) {
					continue
				}
				v0 := b.NewValue0(t.Pos, ssaop.OpSelect1, types.TypeFlags)
				v0.AddArg(a.Args[0])
				b.ResetWithControl(block.BlockAMD64EQ, v0)
				return true
			}
			break
		}
		// match: (EQ (VPTEST x:(VPAND128 j k) y) yes no)
		// cond: x == y && x.Uses == 2
		// result: (EQ (VPTEST j k) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64VPTEST {
			v_0 := b.Controls[0]
			y := v_0.Args[1]
			x := v_0.Args[0]
			if x.Op != ssaop.OpAMD64VPAND128 {
				break
			}
			_ = x.Args[1]
			x_0 := x.Args[0]
			x_1 := x.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, x_0, x_1 = _i0+1, x_1, x_0 {
				j := x_0
				k := x_1
				if !(x == y && x.Uses == 2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
				v0.AddArg2(j, k)
				b.ResetWithControl(block.BlockAMD64EQ, v0)
				return true
			}
			break
		}
		// match: (EQ (VPTEST x:(VPAND256 j k) y) yes no)
		// cond: x == y && x.Uses == 2
		// result: (EQ (VPTEST j k) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64VPTEST {
			v_0 := b.Controls[0]
			y := v_0.Args[1]
			x := v_0.Args[0]
			if x.Op != ssaop.OpAMD64VPAND256 {
				break
			}
			_ = x.Args[1]
			x_0 := x.Args[0]
			x_1 := x.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, x_0, x_1 = _i0+1, x_1, x_0 {
				j := x_0
				k := x_1
				if !(x == y && x.Uses == 2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
				v0.AddArg2(j, k)
				b.ResetWithControl(block.BlockAMD64EQ, v0)
				return true
			}
			break
		}
		// match: (EQ (VPTEST x:(VPANDD512 j k) y) yes no)
		// cond: x == y && x.Uses == 2
		// result: (EQ (VPTEST j k) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64VPTEST {
			v_0 := b.Controls[0]
			y := v_0.Args[1]
			x := v_0.Args[0]
			if x.Op != ssaop.OpAMD64VPANDD512 {
				break
			}
			_ = x.Args[1]
			x_0 := x.Args[0]
			x_1 := x.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, x_0, x_1 = _i0+1, x_1, x_0 {
				j := x_0
				k := x_1
				if !(x == y && x.Uses == 2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
				v0.AddArg2(j, k)
				b.ResetWithControl(block.BlockAMD64EQ, v0)
				return true
			}
			break
		}
		// match: (EQ (VPTEST x:(VPANDQ512 j k) y) yes no)
		// cond: x == y && x.Uses == 2
		// result: (EQ (VPTEST j k) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64VPTEST {
			v_0 := b.Controls[0]
			y := v_0.Args[1]
			x := v_0.Args[0]
			if x.Op != ssaop.OpAMD64VPANDQ512 {
				break
			}
			_ = x.Args[1]
			x_0 := x.Args[0]
			x_1 := x.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, x_0, x_1 = _i0+1, x_1, x_0 {
				j := x_0
				k := x_1
				if !(x == y && x.Uses == 2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
				v0.AddArg2(j, k)
				b.ResetWithControl(block.BlockAMD64EQ, v0)
				return true
			}
			break
		}
		// match: (EQ (VPTEST x:(VPANDN128 j k) y) yes no)
		// cond: x == y && x.Uses == 2
		// result: (ULT (VPTEST k j) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64VPTEST {
			v_0 := b.Controls[0]
			y := v_0.Args[1]
			x := v_0.Args[0]
			if x.Op != ssaop.OpAMD64VPANDN128 {
				break
			}
			k := x.Args[1]
			j := x.Args[0]
			if !(x == y && x.Uses == 2) {
				break
			}
			v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
			v0.AddArg2(k, j)
			b.ResetWithControl(block.BlockAMD64ULT, v0)
			return true
		}
		// match: (EQ (VPTEST x:(VPANDN256 j k) y) yes no)
		// cond: x == y && x.Uses == 2
		// result: (ULT (VPTEST k j) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64VPTEST {
			v_0 := b.Controls[0]
			y := v_0.Args[1]
			x := v_0.Args[0]
			if x.Op != ssaop.OpAMD64VPANDN256 {
				break
			}
			k := x.Args[1]
			j := x.Args[0]
			if !(x == y && x.Uses == 2) {
				break
			}
			v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
			v0.AddArg2(k, j)
			b.ResetWithControl(block.BlockAMD64ULT, v0)
			return true
		}
		// match: (EQ (VPTEST x:(VPANDND512 j k) y) yes no)
		// cond: x == y && x.Uses == 2
		// result: (ULT (VPTEST k j) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64VPTEST {
			v_0 := b.Controls[0]
			y := v_0.Args[1]
			x := v_0.Args[0]
			if x.Op != ssaop.OpAMD64VPANDND512 {
				break
			}
			k := x.Args[1]
			j := x.Args[0]
			if !(x == y && x.Uses == 2) {
				break
			}
			v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
			v0.AddArg2(k, j)
			b.ResetWithControl(block.BlockAMD64ULT, v0)
			return true
		}
		// match: (EQ (VPTEST x:(VPANDNQ512 j k) y) yes no)
		// cond: x == y && x.Uses == 2
		// result: (ULT (VPTEST k j) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64VPTEST {
			v_0 := b.Controls[0]
			y := v_0.Args[1]
			x := v_0.Args[0]
			if x.Op != ssaop.OpAMD64VPANDNQ512 {
				break
			}
			k := x.Args[1]
			j := x.Args[0]
			if !(x == y && x.Uses == 2) {
				break
			}
			v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64VPTEST, types.TypeFlags)
			v0.AddArg2(k, j)
			b.ResetWithControl(block.BlockAMD64ULT, v0)
			return true
		}
		// match: (EQ t:(TESTQ x:(MOVBQZX s:(SETEQ flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (NE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETEQ {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTQ x:(MOVBQZX s:(SETNE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (EQ flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETNE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQ, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTQ x:(MOVBQZX s:(SETL flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETL {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTQ x:(MOVBQZX s:(SETG flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETG {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTQ x:(MOVBQZX s:(SETLE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETLE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTQ x:(MOVBQZX s:(SETGE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTQ x:(MOVBQZX s:(SETA flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETA {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTQ x:(MOVBQZX s:(SETB flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETB {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTQ x:(MOVBQZX s:(SETAE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETAE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTQ x:(MOVBQZX s:(SETBE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETBE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL x:(MOVBQZX s:(SETEQ flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (NE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETEQ {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL x:(MOVBQZX s:(SETNE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (EQ flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETNE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQ, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL x:(MOVBQZX s:(SETL flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETL {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL x:(MOVBQZX s:(SETG flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETG {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL x:(MOVBQZX s:(SETLE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETLE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL x:(MOVBQZX s:(SETGE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL x:(MOVBQZX s:(SETA flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETA {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL x:(MOVBQZX s:(SETB flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETB {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL x:(MOVBQZX s:(SETAE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETAE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTL x:(MOVBQZX s:(SETBE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETBE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTW x:(MOVBQZX s:(SETEQ flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (NE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETEQ {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTW x:(MOVBQZX s:(SETNE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (EQ flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETNE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQ, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTW x:(MOVBQZX s:(SETL flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETL {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTW x:(MOVBQZX s:(SETG flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETG {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTW x:(MOVBQZX s:(SETLE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETLE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTW x:(MOVBQZX s:(SETGE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTW x:(MOVBQZX s:(SETA flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETA {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTW x:(MOVBQZX s:(SETB flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETB {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTW x:(MOVBQZX s:(SETAE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETAE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTW x:(MOVBQZX s:(SETBE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETBE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTB s:(SETEQ flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (NE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETEQ {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTB s:(SETNE flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (EQ flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETNE {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQ, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTB s:(SETL flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (GE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETL {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTB s:(SETG flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (LE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETG {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTB s:(SETLE flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (GT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETLE {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTB s:(SETGE flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (LT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETGE {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTB s:(SETA flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (ULE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETA {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTB s:(SETB flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETB {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTB s:(SETAE flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (ULT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETAE {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULT, flags)
				return true
			}
			break
		}
		// match: (EQ t:(TESTB s:(SETBE flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETBE {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
	case block.BlockAMD64GE:
		// match: (GE c:(CMPQconst [128] z) yes no)
		// cond: c.Uses == 1
		// result: (GT (CMPQconst [127] z) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64CMPQconst {
			c := b.Controls[0]
			if ssa.AuxIntToInt32(c.AuxInt) != 128 {
				break
			}
			z := c.Args[0]
			if !(c.Uses == 1) {
				break
			}
			v0 := b.NewValue0(c.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int32ToAuxInt(127)
			v0.AddArg(z)
			b.ResetWithControl(block.BlockAMD64GT, v0)
			return true
		}
		// match: (GE c:(CMPLconst [128] z) yes no)
		// cond: c.Uses == 1
		// result: (GT (CMPLconst [127] z) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64CMPLconst {
			c := b.Controls[0]
			if ssa.AuxIntToInt32(c.AuxInt) != 128 {
				break
			}
			z := c.Args[0]
			if !(c.Uses == 1) {
				break
			}
			v0 := b.NewValue0(c.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int32ToAuxInt(127)
			v0.AddArg(z)
			b.ResetWithControl(block.BlockAMD64GT, v0)
			return true
		}
		// match: (GE (InvertFlags cmp) yes no)
		// result: (LE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64InvertFlags {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64LE, cmp)
			return true
		}
		// match: (GE (FlagEQ) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagEQ {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (GE (FlagLT_ULT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_ULT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (GE (FlagLT_UGT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_UGT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (GE (FlagGT_ULT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_ULT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (GE (FlagGT_UGT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_UGT {
			b.Reset(block.BlockFirst)
			return true
		}
	case block.BlockAMD64GT:
		// match: (GT (InvertFlags cmp) yes no)
		// result: (LT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64InvertFlags {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64LT, cmp)
			return true
		}
		// match: (GT (FlagEQ) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagEQ {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (GT (FlagLT_ULT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_ULT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (GT (FlagLT_UGT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_UGT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (GT (FlagGT_ULT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_ULT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (GT (FlagGT_UGT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_UGT {
			b.Reset(block.BlockFirst)
			return true
		}
	case block.BlockIf:
		// match: (If (SETL cmp) yes no)
		// result: (LT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETL {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64LT, cmp)
			return true
		}
		// match: (If (SETLE cmp) yes no)
		// result: (LE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETLE {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64LE, cmp)
			return true
		}
		// match: (If (SETG cmp) yes no)
		// result: (GT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETG {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64GT, cmp)
			return true
		}
		// match: (If (SETGE cmp) yes no)
		// result: (GE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETGE {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64GE, cmp)
			return true
		}
		// match: (If (SETEQ cmp) yes no)
		// result: (EQ cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETEQ {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64EQ, cmp)
			return true
		}
		// match: (If (SETNE cmp) yes no)
		// result: (NE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETNE {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64NE, cmp)
			return true
		}
		// match: (If (SETB cmp) yes no)
		// result: (ULT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETB {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64ULT, cmp)
			return true
		}
		// match: (If (SETBE cmp) yes no)
		// result: (ULE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETBE {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64ULE, cmp)
			return true
		}
		// match: (If (SETA cmp) yes no)
		// result: (UGT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETA {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64UGT, cmp)
			return true
		}
		// match: (If (SETAE cmp) yes no)
		// result: (UGE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETAE {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64UGE, cmp)
			return true
		}
		// match: (If (SETO cmp) yes no)
		// result: (OS cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETO {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64OS, cmp)
			return true
		}
		// match: (If (SETGF cmp) yes no)
		// result: (UGT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETGF {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64UGT, cmp)
			return true
		}
		// match: (If (SETGEF cmp) yes no)
		// result: (UGE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETGEF {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64UGE, cmp)
			return true
		}
		// match: (If (SETEQF cmp) yes no)
		// result: (EQF cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETEQF {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64EQF, cmp)
			return true
		}
		// match: (If (SETNEF cmp) yes no)
		// result: (NEF cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64SETNEF {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64NEF, cmp)
			return true
		}
		// match: (If cond yes no)
		// result: (NE (TESTB cond cond) yes no)
		for {
			cond := b.Controls[0]
			v0 := b.NewValue0(cond.Pos, ssaop.OpAMD64TESTB, types.TypeFlags)
			v0.AddArg2(cond, cond)
			b.ResetWithControl(block.BlockAMD64NE, v0)
			return true
		}
	case block.BlockJumpTable:
		// match: (JumpTable idx)
		// result: (JUMPTABLE {ssa.MakeJumpTableSym(b)} idx (LEAQ <typ.Uintptr> {ssa.MakeJumpTableSym(b)} (SB)))
		for {
			idx := b.Controls[0]
			v0 := b.NewValue0(b.Pos, ssaop.OpAMD64LEAQ, typ.Uintptr)
			v0.Aux = ssa.SymToAux(ssa.MakeJumpTableSym(b))
			v1 := b.NewValue0(b.Pos, ssaop.OpSB, typ.Uintptr)
			v0.AddArg(v1)
			b.ResetWithControl2(block.BlockAMD64JUMPTABLE, idx, v0)
			b.Aux = ssa.SymToAux(ssa.MakeJumpTableSym(b))
			return true
		}
	case block.BlockAMD64LE:
		// match: (LE (InvertFlags cmp) yes no)
		// result: (GE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64InvertFlags {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64GE, cmp)
			return true
		}
		// match: (LE (FlagEQ) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagEQ {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (LE (FlagLT_ULT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_ULT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (LE (FlagLT_UGT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_UGT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (LE (FlagGT_ULT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_ULT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (LE (FlagGT_UGT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_UGT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
	case block.BlockAMD64LT:
		// match: (LT c:(CMPQconst [128] z) yes no)
		// cond: c.Uses == 1
		// result: (LE (CMPQconst [127] z) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64CMPQconst {
			c := b.Controls[0]
			if ssa.AuxIntToInt32(c.AuxInt) != 128 {
				break
			}
			z := c.Args[0]
			if !(c.Uses == 1) {
				break
			}
			v0 := b.NewValue0(c.Pos, ssaop.OpAMD64CMPQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int32ToAuxInt(127)
			v0.AddArg(z)
			b.ResetWithControl(block.BlockAMD64LE, v0)
			return true
		}
		// match: (LT c:(CMPLconst [128] z) yes no)
		// cond: c.Uses == 1
		// result: (LE (CMPLconst [127] z) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64CMPLconst {
			c := b.Controls[0]
			if ssa.AuxIntToInt32(c.AuxInt) != 128 {
				break
			}
			z := c.Args[0]
			if !(c.Uses == 1) {
				break
			}
			v0 := b.NewValue0(c.Pos, ssaop.OpAMD64CMPLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int32ToAuxInt(127)
			v0.AddArg(z)
			b.ResetWithControl(block.BlockAMD64LE, v0)
			return true
		}
		// match: (LT (InvertFlags cmp) yes no)
		// result: (GT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64InvertFlags {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64GT, cmp)
			return true
		}
		// match: (LT (FlagEQ) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagEQ {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (LT (FlagLT_ULT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_ULT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (LT (FlagLT_UGT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_UGT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (LT (FlagGT_ULT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_ULT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (LT (FlagGT_UGT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_UGT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
	case block.BlockAMD64NE:
		// match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no)
		// result: (LT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETL {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETL || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64LT, cmp)
			return true
		}
		// match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no)
		// result: (LE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETLE {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETLE || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64LE, cmp)
			return true
		}
		// match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no)
		// result: (GT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETG {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETG || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64GT, cmp)
			return true
		}
		// match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no)
		// result: (GE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETGE {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETGE || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64GE, cmp)
			return true
		}
		// match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no)
		// result: (EQ cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETEQ {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETEQ || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64EQ, cmp)
			return true
		}
		// match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no)
		// result: (NE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETNE {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETNE || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64NE, cmp)
			return true
		}
		// match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no)
		// result: (ULT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETB {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETB || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64ULT, cmp)
			return true
		}
		// match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no)
		// result: (ULE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETBE {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETBE || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64ULE, cmp)
			return true
		}
		// match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no)
		// result: (UGT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETA {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETA || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64UGT, cmp)
			return true
		}
		// match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no)
		// result: (UGE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETAE {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETAE || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64UGE, cmp)
			return true
		}
		// match: (NE (TESTB (SETO cmp) (SETO cmp)) yes no)
		// result: (OS cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETO {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETO || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64OS, cmp)
			return true
		}
		// match: (NE (TESTL (SHLL (MOVLconst [1]) x) y))
		// result: (ULT (BTL x y))
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				if v_0_0.Op != ssaop.OpAMD64SHLL {
					continue
				}
				x := v_0_0.Args[1]
				v_0_0_0 := v_0_0.Args[0]
				if v_0_0_0.Op != ssaop.OpAMD64MOVLconst || ssa.AuxIntToInt32(v_0_0_0.AuxInt) != 1 {
					continue
				}
				y := v_0_1
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTL, types.TypeFlags)
				v0.AddArg2(x, y)
				b.ResetWithControl(block.BlockAMD64ULT, v0)
				return true
			}
			break
		}
		// match: (NE (TESTQ (SHLQ (MOVQconst [1]) x) y))
		// result: (ULT (BTQ x y))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				if v_0_0.Op != ssaop.OpAMD64SHLQ {
					continue
				}
				x := v_0_0.Args[1]
				v_0_0_0 := v_0_0.Args[0]
				if v_0_0_0.Op != ssaop.OpAMD64MOVQconst || ssa.AuxIntToInt64(v_0_0_0.AuxInt) != 1 {
					continue
				}
				y := v_0_1
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQ, types.TypeFlags)
				v0.AddArg2(x, y)
				b.ResetWithControl(block.BlockAMD64ULT, v0)
				return true
			}
			break
		}
		// match: (NE (TESTLconst [c] x))
		// cond: ssa.IsPowerOfTwo(uint32(c))
		// result: (ULT (BTLconst [int8(ssa.Log32u(uint32(c)))] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTLconst {
			v_0 := b.Controls[0]
			c := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_0.Args[0]
			if !(ssa.IsPowerOfTwo(uint32(c))) {
				break
			}
			v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
			v0.AddArg(x)
			b.ResetWithControl(block.BlockAMD64ULT, v0)
			return true
		}
		// match: (NE (TESTQconst [c] x))
		// cond: ssa.IsPowerOfTwo(uint64(c))
		// result: (ULT (BTQconst [int8(ssa.Log32u(uint32(c)))] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQconst {
			v_0 := b.Controls[0]
			c := ssa.AuxIntToInt32(v_0.AuxInt)
			x := v_0.Args[0]
			if !(ssa.IsPowerOfTwo(uint64(c))) {
				break
			}
			v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
			v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log32u(uint32(c))))
			v0.AddArg(x)
			b.ResetWithControl(block.BlockAMD64ULT, v0)
			return true
		}
		// match: (NE (TESTQ (MOVQconst [c]) x))
		// cond: ssa.IsPowerOfTwo(uint64(c))
		// result: (ULT (BTQconst [int8(ssa.Log64u(uint64(c)))] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				if v_0_0.Op != ssaop.OpAMD64MOVQconst {
					continue
				}
				c := ssa.AuxIntToInt64(v_0_0.AuxInt)
				x := v_0_1
				if !(ssa.IsPowerOfTwo(uint64(c))) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(int8(ssa.Log64u(uint64(c))))
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64ULT, v0)
				return true
			}
			break
		}
		// match: (NE (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2))
		// cond: z1==z2
		// result: (ULT (BTQconst [63] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
					continue
				}
				z1_0 := z1.Args[0]
				if z1_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
					continue
				}
				x := z1_0.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(63)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64ULT, v0)
				return true
			}
			break
		}
		// match: (NE (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2))
		// cond: z1==z2
		// result: (ULT (BTQconst [31] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
					continue
				}
				z1_0 := z1.Args[0]
				if z1_0.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
					continue
				}
				x := z1_0.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(31)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64ULT, v0)
				return true
			}
			break
		}
		// match: (NE (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2))
		// cond: z1==z2
		// result: (ULT (BTQconst [0] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
					continue
				}
				z1_0 := z1.Args[0]
				if z1_0.Op != ssaop.OpAMD64SHLQconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 63 {
					continue
				}
				x := z1_0.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(0)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64ULT, v0)
				return true
			}
			break
		}
		// match: (NE (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2))
		// cond: z1==z2
		// result: (ULT (BTLconst [0] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
					continue
				}
				z1_0 := z1.Args[0]
				if z1_0.Op != ssaop.OpAMD64SHLLconst || ssa.AuxIntToInt8(z1_0.AuxInt) != 31 {
					continue
				}
				x := z1_0.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(0)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64ULT, v0)
				return true
			}
			break
		}
		// match: (NE (TESTQ z1:(SHRQconst [63] x) z2))
		// cond: z1==z2
		// result: (ULT (BTQconst [63] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHRQconst || ssa.AuxIntToInt8(z1.AuxInt) != 63 {
					continue
				}
				x := z1.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTQconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(63)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64ULT, v0)
				return true
			}
			break
		}
		// match: (NE (TESTL z1:(SHRLconst [31] x) z2))
		// cond: z1==z2
		// result: (ULT (BTLconst [31] x))
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				z1 := v_0_0
				if z1.Op != ssaop.OpAMD64SHRLconst || ssa.AuxIntToInt8(z1.AuxInt) != 31 {
					continue
				}
				x := z1.Args[0]
				z2 := v_0_1
				if !(z1 == z2) {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpAMD64BTLconst, types.TypeFlags)
				v0.AuxInt = ssa.Int8ToAuxInt(31)
				v0.AddArg(x)
				b.ResetWithControl(block.BlockAMD64ULT, v0)
				return true
			}
			break
		}
		// match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no)
		// result: (UGT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETGF {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETGF || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64UGT, cmp)
			return true
		}
		// match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no)
		// result: (UGE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETGEF {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETGEF || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64UGE, cmp)
			return true
		}
		// match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no)
		// result: (EQF cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETEQF {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETEQF || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64EQF, cmp)
			return true
		}
		// match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no)
		// result: (NEF cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			if v_0_0.Op != ssaop.OpAMD64SETNEF {
				break
			}
			cmp := v_0_0.Args[0]
			v_0_1 := v_0.Args[1]
			if v_0_1.Op != ssaop.OpAMD64SETNEF || cmp != v_0_1.Args[0] {
				break
			}
			b.ResetWithControl(block.BlockAMD64NEF, cmp)
			return true
		}
		// match: (NE (InvertFlags cmp) yes no)
		// result: (NE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64InvertFlags {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64NE, cmp)
			return true
		}
		// match: (NE (FlagEQ) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagEQ {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (NE (FlagLT_ULT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_ULT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (NE (FlagLT_UGT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_UGT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (NE (FlagGT_ULT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_ULT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (NE (FlagGT_UGT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_UGT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (NE (TESTQ s:(Select0 blsr:(BLSRQ _)) s) yes no)
		// result: (NE (Select1 <types.TypeFlags> blsr) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				s := v_0_0
				if s.Op != ssaop.OpSelect0 {
					continue
				}
				blsr := s.Args[0]
				if blsr.Op != ssaop.OpAMD64BLSRQ || s != v_0_1 {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpSelect1, types.TypeFlags)
				v0.AddArg(blsr)
				b.ResetWithControl(block.BlockAMD64NE, v0)
				return true
			}
			break
		}
		// match: (NE (TESTL s:(Select0 blsr:(BLSRL _)) s) yes no)
		// result: (NE (Select1 <types.TypeFlags> blsr) yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			_ = v_0.Args[1]
			v_0_0 := v_0.Args[0]
			v_0_1 := v_0.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
				s := v_0_0
				if s.Op != ssaop.OpSelect0 {
					continue
				}
				blsr := s.Args[0]
				if blsr.Op != ssaop.OpAMD64BLSRL || s != v_0_1 {
					continue
				}
				v0 := b.NewValue0(v_0.Pos, ssaop.OpSelect1, types.TypeFlags)
				v0.AddArg(blsr)
				b.ResetWithControl(block.BlockAMD64NE, v0)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ a:(ADDQconst [c] x) a))
		// cond: t.Uses == 1 && flagify(a)
		// result: (NE (Select1 <types.TypeFlags> a.Args[0]))
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				a := t_0
				if a.Op != ssaop.OpAMD64ADDQconst {
					continue
				}
				if a != t_1 || !(t.Uses == 1 && flagify(a)) {
					continue
				}
				v0 := b.NewValue0(t.Pos, ssaop.OpSelect1, types.TypeFlags)
				v0.AddArg(a.Args[0])
				b.ResetWithControl(block.BlockAMD64NE, v0)
				return true
			}
			break
		}
		// match: (NE t:(TESTL a:(ADDLconst [c] x) a))
		// cond: t.Uses == 1 && flagify(a)
		// result: (NE (Select1 <types.TypeFlags> a.Args[0]))
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				a := t_0
				if a.Op != ssaop.OpAMD64ADDLconst {
					continue
				}
				if a != t_1 || !(t.Uses == 1 && flagify(a)) {
					continue
				}
				v0 := b.NewValue0(t.Pos, ssaop.OpSelect1, types.TypeFlags)
				v0.AddArg(a.Args[0])
				b.ResetWithControl(block.BlockAMD64NE, v0)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETEQ flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (EQ flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETEQ {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQ, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETNE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (NE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETNE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETL flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETL {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETG flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETG {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETLE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETLE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETGE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETA flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETA {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETB flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETB {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETAE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETAE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETBE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETBE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETEQF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (EQF flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETEQF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQF, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETNEF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (NEF flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETNEF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NEF, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETGF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTQ x:(MOVBQZX s:(SETGEF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGEF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETEQ flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (EQ flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETEQ {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQ, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETNE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (NE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETNE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETL flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETL {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETG flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETG {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETLE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETLE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETGE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETA flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETA {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETB flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETB {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETAE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETAE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETBE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETBE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETEQF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (EQF flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETEQF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQF, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETNEF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (NEF flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETNEF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NEF, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETGF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTL x:(MOVBQZX s:(SETGEF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGEF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETEQ flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (EQ flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETEQ {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQ, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETNE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (NE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETNE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETL flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETL {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETG flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETG {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETLE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (LE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETLE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETGE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (GE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETA flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETA {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETB flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETB {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETAE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETAE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETBE flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (ULE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETBE {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETEQF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (EQF flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETEQF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQF, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETNEF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (NEF flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETNEF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NEF, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETGF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTW x:(MOVBQZX s:(SETGEF flags)) x) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				x := t_0
				if x.Op != ssaop.OpAMD64MOVBQZX {
					continue
				}
				s := x.Args[0]
				if s.Op != ssaop.OpAMD64SETGEF {
					continue
				}
				flags := s.Args[0]
				if x != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETEQ flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (EQ flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETEQ {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQ, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETNE flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (NE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETNE {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETL flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (LT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETL {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETG flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (GT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETG {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETLE flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (LE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETLE {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64LE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETGE flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (GE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETGE {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64GE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETA flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETA {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETB flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (ULT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETB {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETAE flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETAE {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETBE flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (ULE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETBE {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64ULE, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETEQF flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (EQF flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETEQF {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64EQF, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETNEF flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (NEF flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETNEF {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64NEF, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETGF flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (UGT flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETGF {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGT, flags)
				return true
			}
			break
		}
		// match: (NE t:(TESTB s:(SETGEF flags) s) yes no)
		// cond: t.Block == s.Block
		// result: (UGE flags yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			t := b.Controls[0]
			_ = t.Args[1]
			t_0 := t.Args[0]
			t_1 := t.Args[1]
			for _i0 := 0; _i0 <= 1; _i0, t_0, t_1 = _i0+1, t_1, t_0 {
				s := t_0
				if s.Op != ssaop.OpAMD64SETGEF {
					continue
				}
				flags := s.Args[0]
				if s != t_1 || !(t.Block == s.Block) {
					continue
				}
				b.ResetWithControl(block.BlockAMD64UGE, flags)
				return true
			}
			break
		}
	case block.BlockAMD64UGE:
		// match: (UGE (TESTQ x x) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			x := v_0.Args[1]
			if x != v_0.Args[0] {
				break
			}
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (UGE (TESTL x x) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			x := v_0.Args[1]
			if x != v_0.Args[0] {
				break
			}
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (UGE (TESTW x x) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			v_0 := b.Controls[0]
			x := v_0.Args[1]
			if x != v_0.Args[0] {
				break
			}
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (UGE (TESTB x x) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			x := v_0.Args[1]
			if x != v_0.Args[0] {
				break
			}
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (UGE (InvertFlags cmp) yes no)
		// result: (ULE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64InvertFlags {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64ULE, cmp)
			return true
		}
		// match: (UGE (FlagEQ) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagEQ {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (UGE (FlagLT_ULT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_ULT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (UGE (FlagLT_UGT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_UGT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (UGE (FlagGT_ULT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_ULT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (UGE (FlagGT_UGT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_UGT {
			b.Reset(block.BlockFirst)
			return true
		}
	case block.BlockAMD64UGT:
		// match: (UGT (InvertFlags cmp) yes no)
		// result: (ULT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64InvertFlags {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64ULT, cmp)
			return true
		}
		// match: (UGT (FlagEQ) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagEQ {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (UGT (FlagLT_ULT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_ULT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (UGT (FlagLT_UGT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_UGT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (UGT (FlagGT_ULT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_ULT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (UGT (FlagGT_UGT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_UGT {
			b.Reset(block.BlockFirst)
			return true
		}
	case block.BlockAMD64ULE:
		// match: (ULE (InvertFlags cmp) yes no)
		// result: (UGE cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64InvertFlags {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64UGE, cmp)
			return true
		}
		// match: (ULE (FlagEQ) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagEQ {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (ULE (FlagLT_ULT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_ULT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (ULE (FlagLT_UGT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_UGT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (ULE (FlagGT_ULT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_ULT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (ULE (FlagGT_UGT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_UGT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
	case block.BlockAMD64ULT:
		// match: (ULT (TESTQ x x) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64TESTQ {
			v_0 := b.Controls[0]
			x := v_0.Args[1]
			if x != v_0.Args[0] {
				break
			}
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (ULT (TESTL x x) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64TESTL {
			v_0 := b.Controls[0]
			x := v_0.Args[1]
			if x != v_0.Args[0] {
				break
			}
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (ULT (TESTW x x) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64TESTW {
			v_0 := b.Controls[0]
			x := v_0.Args[1]
			if x != v_0.Args[0] {
				break
			}
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (ULT (TESTB x x) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64TESTB {
			v_0 := b.Controls[0]
			x := v_0.Args[1]
			if x != v_0.Args[0] {
				break
			}
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (ULT (InvertFlags cmp) yes no)
		// result: (UGT cmp yes no)
		for b.Controls[0].Op == ssaop.OpAMD64InvertFlags {
			v_0 := b.Controls[0]
			cmp := v_0.Args[0]
			b.ResetWithControl(block.BlockAMD64UGT, cmp)
			return true
		}
		// match: (ULT (FlagEQ) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagEQ {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (ULT (FlagLT_ULT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_ULT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (ULT (FlagLT_UGT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagLT_UGT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
		// match: (ULT (FlagGT_ULT) yes no)
		// result: (First yes no)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_ULT {
			b.Reset(block.BlockFirst)
			return true
		}
		// match: (ULT (FlagGT_UGT) yes no)
		// result: (First no yes)
		for b.Controls[0].Op == ssaop.OpAMD64FlagGT_UGT {
			b.Reset(block.BlockFirst)
			b.SwapSuccessors()
			return true
		}
	}
	return false
}
