示例#1
0
 public void Begin()
 {
     RegCount      = new RegisterCount();
     InRegs        = new RegisterMask();
     OutRegs       = new RegisterMask();
     ClobberedRegs = new RegisterMask();
 }
示例#2
0
 public VariableMap(int attrCount)
 {
     InRegs          = new RegisterMask();
     OutRegs         = new RegisterMask();
     ClobberedRegs   = new RegisterMask();
     Start           = new RegisterCount();
     Count           = new RegisterCount();
     AttributesCount = attrCount;
     Attributes      = new VariableAttributes[attrCount].InitializeWith(() => new VariableAttributes());
 }
示例#3
0
        public void End(CodeNode node)
        {
            if (VariableCount == 0 && ClobberedRegs.IsEmpty)
            {
                return;
            }

            var vaIndex = new RegisterCount();

            vaIndex.IndexFrom(RegCount);

            var vaMap = new VariableMap(VariableCount);

            vaMap.Count.CopyFrom(RegCount);
            vaMap.Start.CopyFrom(vaIndex);
            vaMap.InRegs.CopyFrom(InRegs);
            vaMap.OutRegs.CopyFrom(OutRegs);
            vaMap.ClobberedRegs.CopyFrom(ClobberedRegs);

            var vi = 0;

            while (VariableCount != 0)
            {
                var va = _tmpList[vi];
                var vd = va.VariableData;

                var @class   = vd.Info.RegisterClass;
                var dstIndex = vaIndex.Get(@class);

                vaIndex.Add(@class);

                if (va.InRegs != 0)
                {
                    va.AllocableRegs = va.InRegs;
                }
                else if (va.OutRegIndex != RegisterIndex.Invalid)
                {
                    va.AllocableRegs = Utils.Mask(va.OutRegIndex);
                }
                else
                {
                    va.AllocableRegs &= ~InRegs.Get(@class);
                }

                vd.Attributes = null;
                vaMap.Attributes[dstIndex].CopyFrom(va);
                vi++;
                VariableCount--;
            }
            node.VariableMap = vaMap;
            return;
        }