// 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.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.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.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.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.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.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.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.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.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.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.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.OpSaturateToInt16ConcatGroupedInt32x16: v.Op = ssaop.OpAMD64VPACKSSDW512 return true case ssaop.OpSaturateToInt16ConcatGroupedInt32x8: v.Op = ssaop.OpAMD64VPACKSSDW256 return true case ssaop.OpSaturateToInt16ConcatInt32x4: v.Op = ssaop.OpAMD64VPACKSSDW128 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.OpSaturateToUint16ConcatGroupedInt32x16: v.Op = ssaop.OpAMD64VPACKUSDW512 return true case ssaop.OpSaturateToUint16ConcatGroupedInt32x8: v.Op = ssaop.OpAMD64VPACKUSDW256 return true case ssaop.OpSaturateToUint16ConcatInt32x4: v.Op = ssaop.OpAMD64VPACKUSDW128 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 (NEGLflags (MOVBQZX (SETA 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 (NEGLflags (MOVBQZX (SETA 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 [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 x (ADDLconst [-1] x)) // cond: buildcfg.GOAMD64 >= 3 // result: (Select0 (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 x (ADDQconst [-1] x)) // cond: buildcfg.GOAMD64 >= 3 // result: (Select0 (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 [1<<8] (MOVBQZX x))) // result: (BSFQ (ORQconst [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 [1<<16] (MOVWQZX x))) // result: (BSFQ (ORQconst [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<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< 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 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 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 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 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 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 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 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)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) 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: xuint32(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) 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(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) 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: xuint64(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) 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<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) 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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 (Arg [off] {sym})) // cond: t.Size() == u.Size() // result: @b.Func.Entry (Arg [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 (Arg [off] {sym})) // cond: t.Size() == u.Size() // result: @b.Func.Entry (Arg [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 [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 [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 (Arg [off] {sym})) // cond: t.Size() == u.Size() // result: @b.Func.Entry (Arg [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 (Arg [off] {sym})) // cond: t.Size() == u.Size() // result: @b.Func.Entry (Arg [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 [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 [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 [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 [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 [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 [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 (ADDQconst [c] y))) // cond: c & 31 == 0 // result: (SARL x (NEGQ 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 (ANDQconst [c] y))) // cond: c & 31 == 31 // result: (SARL x (NEGQ 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 (ADDLconst [c] y))) // cond: c & 31 == 0 // result: (SARL x (NEGL 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 (ANDLconst [c] y))) // cond: c & 31 == 31 // result: (SARL x (NEGL 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 (ADDQconst [c] y))) // cond: c & 63 == 0 // result: (SARQ x (NEGQ 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 (ANDQconst [c] y))) // cond: c & 63 == 63 // result: (SARQ x (NEGQ 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 (ADDLconst [c] y))) // cond: c & 63 == 0 // result: (SARQ x (NEGL 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 (ANDLconst [c] y))) // cond: c & 63 == 63 // result: (SARQ x (NEGL 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 (NEGLflags (MOVBQZX (SETA 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 (NEGLflags (MOVBQZX (SETA 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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 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 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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 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 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 [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 [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 [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 [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 [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 (ADDQconst [c] y))) // cond: c & 31 == 0 // result: (SHLL x (NEGQ 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 (ANDQconst [c] y))) // cond: c & 31 == 31 // result: (SHLL x (NEGQ 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 (ADDLconst [c] y))) // cond: c & 31 == 0 // result: (SHLL x (NEGL 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 (ANDLconst [c] y))) // cond: c & 31 == 31 // result: (SHLL x (NEGL 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 (ADDQconst [c] y))) // cond: c & 63 == 0 // result: (SHLQ x (NEGQ 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 (ANDQconst [c] y))) // cond: c & 63 == 63 // result: (SHLQ x (NEGQ 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 (ADDLconst [c] y))) // cond: c & 63 == 0 // result: (SHLQ x (NEGL 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 (ANDLconst [c] y))) // cond: c & 63 == 63 // result: (SHLQ x (NEGL 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 (ADDQconst [c] y))) // cond: c & 31 == 0 // result: (SHRL x (NEGQ 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 (ANDQconst [c] y))) // cond: c & 31 == 31 // result: (SHRL x (NEGQ 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 (ADDLconst [c] y))) // cond: c & 31 == 0 // result: (SHRL x (NEGL 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 (ANDLconst [c] y))) // cond: c & 31 == 31 // result: (SHRL x (NEGL 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 (ADDQconst [c] y))) // cond: c & 63 == 0 // result: (SHRQ x (NEGQ 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 (ANDQconst [c] y))) // cond: c & 63 == 63 // result: (SHRQ x (NEGQ 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 (ADDLconst [c] y))) // cond: c & 63 == 0 // result: (SHRQ x (NEGL 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 (ANDLconst [c] y))) // cond: c & 63 == 63 // result: (SHRQ x (NEGL 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 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 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 [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 [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 [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 (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 (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 (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 (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 (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 (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 (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 (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 (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 (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 (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 (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 (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 (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 (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 [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 [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 [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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 ) y)) // cond: x.Uses == 1 // result: (VPBROADCASTB128 (VMOVQ 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 ) y)) // cond: x.Uses == 1 // result: (VPBROADCASTB256 (VMOVQ 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 ) y)) // cond: x.Uses == 1 // result: (VPBROADCASTB512 (VMOVQ 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 ) y)) // cond: x.Uses == 1 // result: (VPBROADCASTW128 (VMOVQ 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 ) y)) // cond: x.Uses == 1 // result: (VPBROADCASTW256 (VMOVQ 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 ) y)) // cond: x.Uses == 1 // result: (VPBROADCASTW512 (VMOVQ 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 ) y) // cond: y.Type.IsFloat() // result: (VMOVSSf2v 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 ) y) // cond: !y.Type.IsFloat() // result: (VMOVD 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 ) y) // cond: y.Type.IsFloat() // result: (VMOVSDf2v 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 ) y) // cond: !y.Type.IsFloat() // result: (VMOVQ 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_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_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 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 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 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 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 [1] (MOVWQZX x) (MOVWQZX 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 x) // cond: buildcfg.GOAMD64 >= 3 // result: (NEGQ (ADDQconst [-32] (LZCNTL (MOVWQZX 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 [1] (MOVLQZX x) (MOVLQZX 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 x) // cond: buildcfg.GOAMD64 >= 3 // result: (NEGQ (ADDQconst [-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 x) // cond: buildcfg.GOAMD64 < 3 // result: (ADDQconst [1] (CMOVQEQ (Select0 (BSRQ x)) (MOVQconst [-1]) (Select1 (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 x) // cond: buildcfg.GOAMD64 >= 3 // result: (NEGQ (ADDQconst [-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 [1] (MOVBQZX x) (MOVBQZX 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 x) // cond: buildcfg.GOAMD64 >= 3 // result: (NEGQ (ADDQconst [-32] (LZCNTL (MOVBQZX 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 [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 [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 x) // cond: buildcfg.GOAMD64 < 3 // result: (CMOVQEQ (Select0 (BSFQ x)) (MOVQconst [64]) (Select1 (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 [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 x) // result: (VPMOVMToVec16x16 (KMOVWk 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 x) // result: (VPMOVMToVec32x16 (KMOVWk 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 x) // result: (VPMOVMToVec8x16 (KMOVWk 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 x) // cond: base.ConvertHash.MatchPos(v.Pos, nil) // result: (XORL y (SARLconst [31] (ANDL y:(CVTTSS2SL x) (NOTL (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 x) // cond: !base.ConvertHash.MatchPos(v.Pos, nil) // result: (CVTTSS2SL 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 x) // cond: base.ConvertHash.MatchPos(v.Pos, nil) // result: (XORQ y (SARQconst [63] (ANDQ y:(CVTTSS2SQ x) (NOTQ (MOVQf2i (CVTSS2SD 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 x) // cond: !base.ConvertHash.MatchPos(v.Pos, nil) // result: (CVTTSS2SQ 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 x) // result: (VPMOVMToVec16x32 (KMOVDk 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 x) // result: (VPMOVMToVec8x32 (KMOVDk 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 x) // cond: base.ConvertHash.MatchPos(v.Pos, nil) // result: (XORL y (SARLconst [31] (ANDL y:(CVTTSD2SL x) (NOTL (MOVLf2i (CVTSD2SS 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 x) // cond: !base.ConvertHash.MatchPos(v.Pos, nil) // result: (CVTTSD2SL 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 x) // cond: base.ConvertHash.MatchPos(v.Pos, nil) // result: (XORQ y (SARQconst [63] (ANDQ y:(CVTTSD2SQ x) (NOTQ (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 x) // cond: !base.ConvertHash.MatchPos(v.Pos, nil) // result: (CVTTSD2SQ 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 x) // result: (VPMOVMToVec8x64 (KMOVQk 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 x) // result: (VPMOVMToVec16x8 (KMOVBk 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 x) // result: (VPMOVMToVec32x4 (KMOVBk 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 x) // result: (VPMOVMToVec32x8 (KMOVBk 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 x) // result: (VPMOVMToVec64x2 (KMOVBk 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 x) // result: (VPMOVMToVec64x4 (KMOVBk 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 x) // result: (VPMOVMToVec64x8 (KMOVBk 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 ptr mask mem) // cond: t.Size() == 64 // result: (VPMASK16load512 ptr (VPMOVVec16x32ToM 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 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 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 ptr mask mem) // cond: t.Size() == 64 // result: (VPMASK32load512 ptr (VPMOVVec32x16ToM 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 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 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 ptr mask mem) // cond: t.Size() == 64 // result: (VPMASK64load512 ptr (VPMOVVec64x8ToM 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 ptr mask mem) // cond: t.Size() == 64 // result: (VPMASK8load512 ptr (VPMOVVec8x64ToM 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 {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 {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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDQ (SHLQ x y) (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDQ (SHLQ x y) (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDQ (SHLQ x y) (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDQ (SHLQ x y) (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (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 x y) // result: (Neg32F (Min32F (Neg32F x) (Neg32F 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 x y) // result: (Neg64F (Min64F (Neg64F x) (Neg64F 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 x y) // result: (POR (MINSS (MINSS x y) x) (MINSS 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 x y) // result: (POR (MINSD (MINSD x y) x) (MINSD 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 [s%8]) (OffPtr 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 [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 [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 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 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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRW x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRW x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRW x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRW x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARW x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARW x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARW x (ORQ y (NOTQ (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARW x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRL x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARL x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARL x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARL x (ORQ y (NOTQ (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARL x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDQ (SHRQ x y) (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDQ (SHRQ x y) (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDQ (SHRQ x y) (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDQ (SHRQ x y) (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARQ x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARQ x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARQ x (ORQ y (NOTQ (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARQ x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRB x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRB x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRB x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (ANDL (SHRB x y) (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARB x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARB x (ORL y (NOTL (SBBLcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARB x (ORQ y (NOTQ (SBBQcarrymask (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 x y) // cond: !ssa.ShiftIsBounded(v) // result: (SARB x (ORL y (NOTL (SBBLcarrymask (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 (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 (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 (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 (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 (AddTupleFirst32 val tuple)) // result: (ADDL val (Select0 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 (AddTupleFirst64 val tuple)) // result: (ADDQ val (Select0 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 (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 (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 (Select1 (ADCQ x y (Select1 (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 (Select1 (SBBQ x y (Select1 (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 x) // result: (SARQconst (NEGQ 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 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 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 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 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 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 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 [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 ) // cond: t.Size() == 16 // result: (Zero128 ) for { t := v.Type if !(t.Size() == 16) { break } v.Reset(ssaop.OpAMD64Zero128) v.Type = t return true } // match: (ZeroSIMD ) // cond: t.Size() == 32 // result: (Zero256 ) for { t := v.Type if !(t.Size() == 32) { break } v.Reset(ssaop.OpAMD64Zero256) v.Type = t return true } // match: (ZeroSIMD ) // cond: t.Size() == 64 // result: (Zero512 ) 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 {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 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 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 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 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 }