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); }
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); }
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); }