Пример #1
0
        public bool Optimize(ref List <Instruction> src)
        {
            int pushidx;

            if (CurrentIndex == -1)
            {
                return(false);
            }

            Push OldPush = (Push)src[CurrentIndex];

            pushidx = -1;
            Pop OldPop = OptimizeUtils.GetLastPop(src, CurrentIndex - 1, ref pushidx);

            if (OldPop == null)
            {
                return(false);
            }

            // check for same operands
            if (OptimizeUtils.SameOperands(OldPop, OldPush))
            {
                src[CurrentIndex].Emit = false;
                src[pushidx].Emit      = false;
                SamePushPop++;
                Optimizer.OptimizationsSize += 3;
                Optimizer.Optimizations++;
                return(true);
            }



            return(true);
        }
Пример #2
0
        public bool Optimize(ref List <Instruction> src)
        {
            int pushidx;

            if (CurrentIndex == -1)
            {
                return(false);
            }

            Mov OldMov = (Mov)src[CurrentIndex];

            if (OldMov.DestinationIsIndirect && OldMov.SourceIsIndirect)
            {
                return(false);
            }
            // check for same operands
            if (OptimizeUtils.SameOperands(OldMov))
            {
                src[CurrentIndex].Emit = false;
                Optimizer.Optimizations++;
                Optimizer.OptimizationsSize += 3;
                SameMov++;
                return(true);
            }
            return(true);
        }
Пример #3
0
        public bool Optimize(ref List <Instruction> src)
        {
            int pushidx;

            if (CurrentIndex == -1)
            {
                return(false);
            }

            Pop OldPop = (Pop)src[CurrentIndex];

            pushidx = -1;
            Push OldPush = OptimizeUtils.GetLastPush(src, CurrentIndex - 1, ref pushidx);

            if (OldPush == null)
            {
                return(false);
            }



            // check for same operands
            if (OptimizeUtils.SameOperands(OldPop, OldPush))
            {
                src[CurrentIndex].Emit = false;
                src[pushidx].Emit      = false;
                SamePushPop++;
                Optimizer.OptimizationsSize += 6;
                Optimizer.Optimizations++;
                return(true);
            }
            if (OldPop.DestinationIsIndirect && OldPush.DestinationIsIndirect)
            {
                return(false);
            }


            // Transfer to mov dst,src
            if (OptimizeUtils.CanTransfer(OldPush, OldPop))
            {
                src[CurrentIndex].Emit = false;
                src[pushidx].Emit      = false;

                InstructionWithDestinationAndSourceAndSize mv = new Mov();
                OptimizeUtils.CopyDestination((InstructionWithDestinationAndSize)OldPush, ref mv, true);
                OptimizeUtils.CopyDestination((InstructionWithDestinationAndSize)OldPop, ref mv, false);
                src[CurrentIndex] = mv;
                src[pushidx]      = null;

                PushPopCount++;
                Optimizer.OptimizationsSize += 3;
                Optimizer.Optimizations++;
            }

            return(true);
        }