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; } } }