public IRCodeBlock Optimize(IRCodeBlock block) { foreach (var optimizer in Optimizers) block = optimizer.Optimize(block); return block; }
public Code WriteCode(IRCodeBlock block) { var builder = new CodeBuilder(); var visitor = new ByteCodeVisitor(builder); visitor.Visit(block); return builder.Build(); }
private IRCodeBlock FixAlignmentIssues(IRCodeBlock block) { var units = block.Units; units = units.SelectMany(x => x is IRWriteData ? FixAlignmentIssues(x as IRWriteData) : new[] { x }).AsReadOnly(); return units.Select(x => x is IRCodeBlock ? FixAlignmentIssues(x as IRCodeBlock) : x).ToCodeBlock(); }
public IRCodeBlock Optimize(IRCodeBlock block) { var units = block.Units; var newUnits = units .SelectMany(x => x is IRMultiUnit ? (x as IRMultiUnit).Inner : (IEnumerable<IIRUnit>)new[] { x }) .Select(x => x is IRCodeBlock ? Optimize(x as IRCodeBlock) : x); return newUnits.ToCodeBlock(); }
public Code WriteCode(IRCodeBlock block) { var builder = new CodeBuilder(); var visitor = new ActionReplayVisitor(builder); var optimizer = new ActionReplayOptimizer(builder); block = optimizer.Optimize(block); visitor.Visit(block); return builder.Build(); }
public IRCodeBlock Optimize(IRCodeBlock block) { block = block.Units .Replace<IRUnsigned8BitSet>(replaceUnsigned8BitSet) .Replace<IRUnsigned16BitSet>(replaceUnsigned16BitSet) .Replace<IRUnsigned32BitSet>(replaceUnsigned32BitSet) .Replace<IRUnsigned8BitUnset>(replaceUnsigned8BitUnset) .Replace<IRUnsigned16BitUnset>(replaceUnsigned16BitUnset) .Replace<IRUnsigned32BitUnset>(replaceUnsigned32BitUnset) .ToCodeBlock(); return generalOptimizer.Optimize(block); }
private IRCodeBlock Merge(IRCodeBlock block) { var units = block.Units; var replaced = true; while (replaced) { replaced = false; var last = units.FirstOrDefault(); foreach (var current in units.Skip(1)) { if (current is IRWriteData && last is IRWriteData) { var currentWriteData = current as IRWriteData; var lastWriteData = last as IRWriteData; var consecutive = currentWriteData.Address == lastWriteData.Address + lastWriteData.Length; if (consecutive) { var combined = new IRCombinedWriteData(lastWriteData, currentWriteData); units = units.TakeWhile(x => x != last) .Concat(new[] { combined }) .Concat(units.SkipWhile(x => x != current).Skip(1)) .AsReadOnly(); replaced = true; break; } } last = current; } } return units.Select(x => x is IRCodeBlock ? Merge(x as IRCodeBlock) : x).ToCodeBlock(); }
public void Visit(IRCodeBlock block) { block.Accept(this); }
public IRCodeBlock Optimize(IRCodeBlock block) { var merged = Merge(block); return FixAlignmentIssues(merged); }