/// <summary> /// Selects an output register number, given an input register number /// An improved implementation might be more picky about the selection, this one grabs the next available off a stack. /// </summary> /// <param name="nInputRegister"></param> /// <param name="nInstruction"></param> /// <returns></returns> int GetOutputRegister(int nInputRegister, NaiveRegisterPacker narp) { // see if it's already transformed int nOutputRegister = -1; if (RegisterTransforms.TryGetValue(nInputRegister, out nOutputRegister)) { return nOutputRegister; } Stack<int> Rejects = new Stack<int>(); do { // it's not. if (AvailableRegisters.Count == 0) { throw new NotImplementedException("Out of registers!"); } nOutputRegister = AvailableRegisters.Pop(); if (narp.AllowRegisterTransform(nInputRegister, nOutputRegister)) { break; } Rejects.Push(nOutputRegister); } while (true); while (Rejects.Count > 0) { AvailableRegisters.Push(Rejects.Peek()); Rejects.Pop(); } UnavailableRegisters.Add(nOutputRegister, nInputRegister); RegisterTransforms.Add(nInputRegister, nOutputRegister); if (nOutputRegister >= NumOutputRegisters) NumOutputRegisters = nOutputRegister + 1; return nOutputRegister; }
void PackRegisters(BasicBlock bb) { NaiveRegisterPacker nrp = new NaiveRegisterPacker(bb,this); List<int> registerPastWrites = bb.GetRegisterPastWrites(); List<int> registerFutureReads = bb.GetRegisterFutureReads(); { List<int> listReserved = new List<int>(); // listReserved is the intersection of RegisterPastWrites with RegisterReads OR RegisterFutureReads foreach (int n in registerPastWrites) { if (bb.RegisterReads.Contains(n) || registerFutureReads.Contains(n)) listReserved.Add(n); } if (listReserved.Count>0) nrp.HeadRegisters(listReserved, bb.Instructions); } nrp.ScanRanges(bb.Instructions); { List<int> listReserved = new List<int>(); // listReserved is the intersection of RegisterFutureReads with RegisterWrites OR RegisterPastWrites foreach (int n in registerFutureReads) { if (bb.RegisterWrites.Contains(n) || registerPastWrites.Contains(n)) listReserved.Add(n); } if (listReserved.Count > 0) nrp.TailRegisters(listReserved, bb.Instructions); } nrp.Condense(bb.Instructions); }