private void CollectMoveHints()
{
foreach (var block in BasicBlocks)
{
for (var context = new Context(block); !context.IsBlockEndInstruction; context.GotoNext())
{
if (context.IsEmpty || context.IsBlockStartInstruction || context.IsBlockEndInstruction)
continue;
if (!Architecture.IsInstructionMove(context.Instruction))
continue;
if (!((context.Result.IsVirtualRegister && context.Operand1.IsVirtualRegister)
|| (context.Result.IsVirtualRegister && context.Operand1.IsCPURegister)
|| (context.Result.IsCPURegister && context.Operand1.IsVirtualRegister)))
continue;
var from = VirtualRegisters[GetIndex(context.Operand1)];
var to = VirtualRegisters[GetIndex(context.Result)];
var slot = new SlotIndex(context);
int factor = (from.IsPhysicalRegister || to.IsPhysicalRegister) ? 150 : 125;
int bonus = GetLoopDepth(slot);
moveHints.Add(slot, new MoveHint(slot, from, to, bonus));
}
}
}