public static bool hasPerformanceData(this PerfData pd, Intrinsic i) { if (Debugger.IsAttached && i.name == "_mm256_extractf128_si256") { Debugger.Break(); } if (null == i.instruction) { return(false); } var data = pd.lookup(i.instruction.name); if (null == data) { return(false); } eRegSize regSize = i.regSize(); if (regSize == eRegSize.None) { return(false); } return(true); // return data.Any( ii => ii.match( regSize ) ); }
public static bool match(this eArgumentsMask argMask, eRegSize regSize) { eArgumentsMask thisMask = eArgumentsMask.None; if (0 != (regSize & eRegSize.scalarMask)) { if (0 != (argMask & eArgumentsMask.memory)) { return(false); } argMask &= ArgTypes.scalarBits; switch (regSize) { case eRegSize.scalar8: thisMask = eArgumentsMask.reg8; break; case eRegSize.scalar16: thisMask = eArgumentsMask.reg16 | eArgumentsMask.reg16_32 | eArgumentsMask.reg16_32_64; break; case eRegSize.scalar32: thisMask = eArgumentsMask.reg32 | eArgumentsMask.reg16_32 | eArgumentsMask.reg16_32_64; break; case eRegSize.scalar64: thisMask = eArgumentsMask.reg64 | eArgumentsMask.reg16_32_64; break; } return(0 != (argMask & thisMask)); } switch (regSize) { default: return(eArgumentsMask.None == (argMask & eArgumentsMask.memory)); case eRegSize.mmx: thisMask = ArgTypes.mmxBits; break; case eRegSize.xmm: thisMask = ArgTypes.sseBits; break; case eRegSize.ymm: thisMask = ArgTypes.avxBits; break; case eRegSize.zmm: thisMask = ArgTypes.avx512Bits; break; } return(eArgumentsMask.None == (argMask & (ArgTypes.vectorBits ^ thisMask))); }
public static IEnumerable <PerfData.Instruction> table(this PerfData pd, Intrinsic intr) { // if( intr.name == "_mm256_sad_epu8" && Debugger.IsAttached ) Debugger.Break(); // Break on building the perf.table for "_mm256_sad_epu8" intrinsic if (null == intr.instruction) { return(null); } IEnumerable <PerfData.Instruction> data = pd.lookup(intr.instruction.name); if (null == data) { return(null); } eRegSize regSize = intr.regSize(); return(pickBestPerArch(data, regSize)); }
static bool match(this PerfData.Instruction ii, eRegSize rs) { return(ii.args.Any(aa => aa.match(rs))); }
static IEnumerable <PerfData.Instruction> pickBestPerArch(IEnumerable <PerfData.Instruction> data, eRegSize regSize) { foreach (var g in data.GroupBy(i => i.cpu)) { if (1 == g.Count()) { // This CPU only has a single version of that instruction yield return(g.First()); continue; } var matched = g.FirstOrDefault(ii => ii.match(regSize)); if (null != matched) { yield return(matched); continue; } matched = g.FirstOrDefault(ii => ii.regsOnly()); if (null != matched) { yield return(matched); continue; } // throw new NotSupportedException(); } }