/// <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); }
/// <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)); }
/// <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); }
/// <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> /// 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); }
/// <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)); }
/// <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);*/ }
/// <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);*/ }
/// <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; }
/// <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))); }
public RegisterRange(Register register, IInstructionRange range) { Register = register; Range = range; }
/// <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; }