示例#1
0
 /// <summary>
 /// Extend range 1 with range 2.
 /// </summary>
 public static IInstructionRange Extend(this IInstructionRange range1, IInstructionRange range2)
 {
     var first = range1.First;
     if (range2.First.Index < first.Index) first = range2.First;
     var last = range2.Last;
     if (range1.Last.Index > last.Index) last = range1.Last;
     return new InstructionRange(first, last);
 }
示例#2
0
        /// <summary>
        /// Is the given instruction contained in the given range?
        /// </summary>
        public static bool Contains(this IInstructionRange range, Instruction instruction)
        {
            if (instruction == null)
            {
                return(false);
            }
            var f = range.First.Index;
            var l = range.Last.Index;
            var i = instruction.Index;

            return((i >= f) && (i <= l));
        }
示例#3
0
        /// <summary>
        /// Is the given range2 completly contained in the given range1?
        /// </summary>
        public static bool Contains(this IInstructionRange range1, IInstructionRange range2)
        {
            if (range2 == null)
                return false;

            var f1 = range1.First.Index;
            var l1 = range1.Last.Index;
            var f2 = range2.First.Index;
            var l2 = range2.Last.Index;

            return ((f2 >= f1) && (l2 <= l1));
        }
        /// <summary>
        /// Is the given instruction a const instruction which register is never modified.
        /// </summary>
        private static bool IsReadOnlyConst(Instruction ins, IInstructionRange range)
        {
            if (!ins.Code.IsConst())
            {
                return(false);
            }
            var reg = ins.Registers[0];

            if (range.Instructions.Any(x => (x != ins) && reg.IsDestinationIn(x)))
            {
                return(false);
            }
            return(true);
        }
示例#5
0
        /// <summary>
        /// Is the given range2 completly contained in the given range1?
        /// </summary>
        public static bool Contains(this IInstructionRange range1, IInstructionRange range2)
        {
            if (range2 == null)
            {
                return(false);
            }

            var f1 = range1.First.Index;
            var l1 = range1.Last.Index;
            var f2 = range2.First.Index;
            var l2 = range2.Last.Index;

            return((f2 >= f1) && (l2 <= l1));
        }
示例#6
0
        /// <summary>
        /// Does this block contain the entire range?
        /// </summary>
        /// <returns>False if any instruction of the given range is outside this block, true if all instructions of the given range are inside this block</returns>
        public bool ContainsEntireRange(IInstructionRange range)
        {
            var entryIndex = entry.Index;
            var exitIndex  = exit.Index;

            foreach (var i in range.Instructions)
            {
                var index = i.Index;
                if ((index < entryIndex) || (index > exitIndex))
                {
                    return(false);
                }
            }
            return(true);
        }
示例#7
0
        /// <summary>
        /// Extend range 1 with range 2.
        /// </summary>
        public static IInstructionRange Extend(this IInstructionRange range1, IInstructionRange range2)
        {
            var first = range1.First;

            if (range2.First.Index < first.Index)
            {
                first = range2.First;
            }
            var last = range2.Last;

            if (range1.Last.Index > last.Index)
            {
                last = range1.Last;
            }
            return(new InstructionRange(first, last));
        }
示例#8
0
        /// <summary>
        /// Is there an intersection between range 1 and 2?
        /// </summary>
        public static bool IntersectsWith(this IInstructionRange range1, IInstructionRange range2)
        {
            if (range2 == null)
                return false;

            var f1 = range1.First.Index;
            var l1 = range1.Last.Index;
            var f2 = range2.First.Index;
            var l2 = range2.Last.Index;

            return
                ((f2 >= f1) && (f2 <= l1)) ||
                ((l2 >= f1) && (l2 <= l1)) ||
                ((f1 >= f2) && (f1 <= l2)) ||
                ((l1 >= f2) && (l1 <= l2));
            
            /*return range1.Contains(range2.First) || range1.Contains(range2.Last) ||
                   range2.Contains(range1.First) || range2.Contains(range1.Last);*/
        }
示例#9
0
        /// <summary>
        /// Is there an intersection between range 1 and 2?
        /// </summary>
        public static bool IntersectsWith(this IInstructionRange range1, IInstructionRange range2)
        {
            if (range2 == null)
            {
                return(false);
            }

            var f1 = range1.First.Index;
            var l1 = range1.Last.Index;
            var f2 = range2.First.Index;
            var l2 = range2.Last.Index;

            return
                (((f2 >= f1) && (f2 <= l1)) ||
                 ((l2 >= f1) && (l2 <= l1)) ||
                 ((f1 >= f2) && (f1 <= l2)) ||
                 ((l1 >= f2) && (l1 <= l2)));

            /*return range1.Contains(range2.First) || range1.Contains(range2.Last) ||
             *     range2.Contains(range1.First) || range2.Contains(range1.Last);*/
        }
示例#10
0
 /// <summary>
 /// Is the given instruction a const instruction which register is never modified.
 /// </summary>
 private static bool IsReadOnlyConst(Instruction ins, IInstructionRange range)
 {
     if (!ins.Code.IsConst())
         return false;
     var reg = ins.Registers[0];
     if (range.Instructions.Any(x => (x != ins) && reg.IsDestinationIn(x)))
     {
         return false;
     }
     return true;
 }
示例#11
0
 /// <summary>
 /// Does any of the instructions in the given range use the given register?
 /// </summary>
 public static bool Uses(this IInstructionRange range, Register r)
 {
     return(range.Instructions.Any(x => x.Uses(r)));
 }
示例#12
0
 public RegisterRange(Register register, IInstructionRange range)
 {
     Register = register;
     Range    = range;
 }
示例#13
0
 /// <summary>
 /// Does this block contain the entire range?
 /// </summary>
 /// <returns>False if any instruction of the given range is outside this block, true if all instructions of the given range are inside this block</returns>
 public bool ContainsEntireRange(IInstructionRange range)
 {
     var entryIndex = entry.Index;
     var exitIndex = exit.Index;
     foreach (var i in range.Instructions)
     {
         var index = i.Index;
         if ((index < entryIndex) || (index > exitIndex))
             return false;
     }
     return true;
 }
示例#14
0
 public RegisterRange(Register register, IInstructionRange range)
 {
     Register = register;
     Range = range;
 }