public IRCodeBlock Optimize(IRCodeBlock block)
        {
            foreach (var optimizer in Optimizers)
                block = optimizer.Optimize(block);

            return block;
        }
示例#2
0
        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();
        }
示例#8
0
 public void Visit(IRCodeBlock block)
 {
     block.Accept(this);
 }
        public IRCodeBlock Optimize(IRCodeBlock block)
        {
            var merged = Merge(block);

            return FixAlignmentIssues(merged);
        }