protected void TrySimpleMoves(ResolvedMoveList moves)
        {
            bool loop = true;

            while (loop)
            {
                loop = false;

                for (int i = 0; i < Moves.Count; i++)
                {
                    var move = Moves[i];

                    if (!(move.Source.IsCPURegister || move.Destination.IsCPURegister))
                    {
                        continue;
                    }

                    int other = FindIndex(move.Destination.Register, true);

                    if (other != -1)
                    {
                        continue;
                    }

                    Debug.Assert(move.Destination.IsCPURegister);

                    moves.Add(move.Source, move.Destination, move.Source.IsCPURegister ? ResolvedMoveType.Move : ResolvedMoveType.Load);

                    Moves.RemoveAt(i);

                    loop = true;
                }
            }
        }
        public ResolvedMoveList GetResolveMoves()
        {
            var moves = new ResolvedMoveList();

            TrySimpleMoves(moves);
            TryExchange(moves);
            CreateMemoryMoves(moves);

            return(moves);
        }
        protected void CreateMemoryMoves(ResolvedMoveList moves)
        {
            for (int i = 0; i < Moves.Count; i++)
            {
                var move = Moves[i];

                if (!(move.Source.IsCPURegister || move.Destination.IsCPURegister))
                {
                    continue;
                }

                moves.Add(move.Destination, move.Source, ResolvedMoveType.Move);
            }
        }
        protected void TryExchange(ResolvedMoveList moves)
        {
            bool loop = true;

            while (loop)
            {
                loop = false;

                for (int i = 0; i < Moves.Count; i++)
                {
                    var move = Moves[i];

                    if (!(move.Source.IsCPURegister || move.Destination.IsCPURegister))
                    {
                        continue;
                    }

                    int other = FindIndex(move.Destination.Register, true);

                    if (other == -1)
                    {
                        continue;
                    }

                    Debug.Assert(Moves[other].Source.IsCPURegister);
                    Debug.Assert(move.Source.IsCPURegister);

                    moves.Add(Moves[other].Source, move.Source, ResolvedMoveType.Exchange);

                    Moves[other] = new Move(move.Source, Moves[other].Destination);

                    Moves.RemoveAt(i);

                    if (other > i)
                    {
                        other--;
                    }

                    if (Moves[other].Source.Register == Moves[other].Destination.Register)
                    {
                        Moves.RemoveAt(other);
                    }

                    loop = true;
                }
            }
        }