aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/CodeGen/RegisterAllocators/LiveIntervalList.cs
blob: 06b979ead32474f53a10b7ddaf0bb1afde0400be (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;

namespace ARMeilleure.CodeGen.RegisterAllocators
{
    unsafe struct LiveIntervalList
    {
        private LiveInterval* _items;
        private int _count;
        private int _capacity;

        public int Count => _count;
        public Span<LiveInterval> Span => new(_items, _count);

        public void Add(LiveInterval interval)
        {
            if (_count + 1 > _capacity)
            {
                var oldSpan = Span;

                _capacity = Math.Max(4, _capacity * 2);
                _items = Allocators.References.Allocate<LiveInterval>((uint)_capacity);

                var newSpan = Span;

                oldSpan.CopyTo(newSpan);
            }

            int position = interval.GetStart();
            int i = _count - 1;

            while (i >= 0 && _items[i].GetStart() > position)
            {
                _items[i + 1] = _items[i--];
            }

            _items[i + 1] = interval;
            _count++;
        }
    }
}