예제 #1
0
        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 ) );
        }
예제 #2
0
        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)));
        }
예제 #3
0
        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));
        }
예제 #4
0
 static bool match(this PerfData.Instruction ii, eRegSize rs)
 {
     return(ii.args.Any(aa => aa.match(rs)));
 }
예제 #5
0
        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();
            }
        }