From df7af34de98fd6df88e5cf885a54deccb8155a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A1roly=20Balogh?= Date: Fri, 6 Jun 2014 07:38:50 +0000 Subject: [PATCH] m68k: very early optimizer implementation experiments git-svn-id: trunk@27862 - --- compiler/m68k/aoptcpu.pas | 39 ++++++++++++++++++++++++++++++++++++--- compiler/m68k/cputarg.pas | 8 ++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/compiler/m68k/aoptcpu.pas b/compiler/m68k/aoptcpu.pas index cb656af36e..693c461065 100644 --- a/compiler/m68k/aoptcpu.pas +++ b/compiler/m68k/aoptcpu.pas @@ -1,8 +1,8 @@ { - Copyright (c) 1998-2004 by Jonas Maebe + Copyright (c) 1998-2014 by the Free Pascal development team This unit calls the optimization procedures to optimize the assembler - code for sparc + code for m68k This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,14 +28,47 @@ unit aoptcpu; Interface uses - cpubase, aoptobj, aoptcpub, aopt; + cpubase, aoptobj, aoptcpub, aopt, aasmtai; Type TCpuAsmOptimizer = class(TAsmOptimizer) + function PeepHoleOptPass1Cpu(var p: tai): boolean; override; End; Implementation + uses + cutils, aasmcpu; + + function TCpuAsmOptimizer.PeepHoleOptPass1Cpu(var p: tai): boolean; + var + next: tai; + begin + result:=false; + case p.typ of + ait_instruction: + begin + //asml.insertbefore(tai_comment.Create(strpnew('pass1 called for instr')), p); + + { LEA (Ax),Ax is a NOP if src and dest reg is equal, so remove it. } + if getnextinstruction(p,next) and (taicpu(p).opcode = A_LEA) and + (not assigned(taicpu(p).oper[0]^.ref^.symbol)) and + (((taicpu(p).oper[0]^.ref^.base = taicpu(p).oper[1]^.reg) and + (taicpu(p).oper[0]^.ref^.index = NR_NO)) or + ((taicpu(p).oper[0]^.ref^.index = taicpu(p).oper[1]^.reg) and + (taicpu(p).oper[0]^.ref^.base = NR_NO))) and + (taicpu(p).oper[0]^.ref^.offset = 0) then + begin + //asml.insertbefore(tai_comment.Create(strpnew('LEA (Ax),Ax removed')), p); + asml.remove(p); + p.free; + p:=next; + result:=true; + end; + end; + end; + end; + begin casmoptimizer:=TCpuAsmOptimizer; end. diff --git a/compiler/m68k/cputarg.pas b/compiler/m68k/cputarg.pas index 4b3afb3932..38bd83ac35 100644 --- a/compiler/m68k/cputarg.pas +++ b/compiler/m68k/cputarg.pas @@ -70,6 +70,14 @@ implementation {$ifndef NoDbgDwarf} ,dbgdwarf {$endif NoDbgDwarf} + +{************************************** + Optimizer +**************************************} + + {$ifndef NOOPT} + , aoptcpu + {$endif NOOPT} ; end.