/// <summary> /// Save the state in the low register back to the original register when a save is needed. /// The save code is inserted directly before the given target instruction. /// </summary> public void SaveToOriginalAndClear(Instruction target, BasicBlock block, MethodBody body, RegisterSpillingMap map) { if (wideStart != null) { wideStart.SaveToOriginalAndClear(target, block, body, map); } else { if (SaveToOriginalNeeded) { var original = OriginalRegister; // Fix target to insert before if (target.OpCode.IsMoveResult()) { do { target = target.GetPrevious(body.Instructions); } while (target.OpCode == OpCodes.Nop); } // Insert save code var move = CreateMove(LowRegister, original, type); block.InsertBefore(target, move); // Save end in mapping Mapping.LastInstruction = move; // Record mapping map.Add(Mapping); } Clear(); } }