private bool PlaceLiveIntervalOnTrack(LiveInterval liveInterval, MoveHint[] hints)
        {
            if (hints == null)
            {
                return(false);
            }

            foreach (var moveHint in hints)
            {
                LiveIntervalTrack track = null;

                var register = (liveInterval.Start == moveHint.Slot) ? moveHint.FromRegister : moveHint.ToRegister;

                if (register == null)
                {
                    continue;                       // no usable hint
                }
                if (Trace.Active)
                {
                    Trace.Log("  Trying move hint: " + register + "  [ " + moveHint + " ]");
                }

                if (PlaceLiveIntervalOnTrack(liveInterval, LiveIntervalTracks[register.Index]))
                {
                    return(true);
                }
            }

            return(false);
        }
Пример #2
0
        private bool PlaceLiveIntervalOnTrack(LiveInterval liveInterval, LiveIntervalTrack track)
        {
            if (track.IsReserved)
                return false;

            if (track.IsFloatingPoint != liveInterval.VirtualRegister.IsFloatingPoint)
                return false;

            if (track.Intersects(liveInterval))
                return false;

            if (trace.Active) trace.Log("  Assigned live interval to: " + track.ToString());

            track.Add(liveInterval);

            return true;
        }
Пример #3
0
 public void Evict()
 {
     LiveIntervalTrack.Evict(this);
 }