Example #1
0
        /// <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;
        }
Example #2
0
        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);
        }