public void Begin() { RegCount = new RegisterCount(); InRegs = new RegisterMask(); OutRegs = new RegisterMask(); ClobberedRegs = new RegisterMask(); }
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()); }
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; }