public override Frame.Frame NewFrame(Temp.Label name, BoolList formals) { MipsFrame ret = new MipsFrame(); ret.Name = name; AccessList ptr = null; int count = 0; for (BoolList f = formals; f != null; f = f.Tail) { Access a; if (count < 4 && !f.Head) { a = ret.AllocLocal(false); } else { a = ret.AllocLocal(true); } if (ret.Formals == null) { ptr = ret.Formals = new AccessList(a, null); } else { ptr = ptr.Tail = new AccessList(a, null); } } AllFrames.Add(ret); return(ret); }
private void RewriteProgram(HashSet <Node> spilledNodes) { HashSet <Node> newTemps = new HashSet <Node>(); foreach (Node v in spilledNodes) { InFrame a = (InFrame)Frame.AllocLocal(true); foreach (BasicBlock b in Blocks) { for (int i = 0; i < b.List.Count; i++) { TExp inst = b.List[i]; if (inst.LivenessNode == null) { continue; } if (inst.LivenessNode.Use.Contains(v.Temp)) { Temp.Temp p = new Temp.Temp(); newTemps.Add(GetNodeByTemp(p)); GetNodeByTemp(p).IsNew = true; b.List.Insert(i, new Load(Frame.FP(), a.Offset, p)); b.List[++i].ReplaceUse(v.Temp, p); } if (inst.LivenessNode.Def.Contains(v.Temp)) { Temp.Temp p = new Temp.Temp(); newTemps.Add(GetNodeByTemp(p)); GetNodeByTemp(p).IsNew = true; b.List.Insert(i + 1, new Store(Frame.FP(), a.Offset, p)); b.List[i++].ReplaceDef(v.Temp, p); } } } } spilledNodes.Clear(); Initial = newTemps; Initial.UnionWith(ColoredNodes); Initial.UnionWith(CoalescedNodes); ColoredNodes.Clear(); CoalescedNodes.Clear(); }