LiveRange.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. namespace ARMeilleure.CodeGen.RegisterAllocators
  3. {
  4. unsafe readonly struct LiveRange : IEquatable<LiveRange>
  5. {
  6. private struct Data
  7. {
  8. public int Start;
  9. public int End;
  10. public LiveRange Next;
  11. }
  12. private readonly Data* _data;
  13. public ref int Start => ref _data->Start;
  14. public ref int End => ref _data->End;
  15. public ref LiveRange Next => ref _data->Next;
  16. public LiveRange(int start, int end, LiveRange next = default)
  17. {
  18. _data = Allocators.LiveRanges.Allocate<Data>();
  19. Start = start;
  20. End = end;
  21. Next = next;
  22. }
  23. public bool Overlaps(int start, int end)
  24. {
  25. return Start < end && start < End;
  26. }
  27. public bool Overlaps(LiveRange range)
  28. {
  29. return Start < range.End && range.Start < End;
  30. }
  31. public bool Overlaps(int position)
  32. {
  33. return position >= Start && position < End;
  34. }
  35. public bool Equals(LiveRange range)
  36. {
  37. return range._data == _data;
  38. }
  39. public override bool Equals(object obj)
  40. {
  41. return obj is LiveRange range && Equals(range);
  42. }
  43. public static bool operator ==(LiveRange a, LiveRange b)
  44. {
  45. return a.Equals(b);
  46. }
  47. public static bool operator !=(LiveRange a, LiveRange b)
  48. {
  49. return !a.Equals(b);
  50. }
  51. public override int GetHashCode()
  52. {
  53. return HashCode.Combine((IntPtr)_data);
  54. }
  55. public override string ToString()
  56. {
  57. return $"[{Start}, {End})";
  58. }
  59. }
  60. }