From e1af3ecc5dda0353a4c076a1835486c1470df90d Mon Sep 17 00:00:00 2001 From: florian Date: Thu, 1 Nov 2012 20:09:12 +0000 Subject: [PATCH] + assembler optimizer unit skeleton git-svn-id: trunk@22908 - --- .gitattributes | 3 + compiler/aarch64/aoptcpu.pas | 66 +++++++++++++++++ compiler/aarch64/aoptcpub.pas | 134 ++++++++++++++++++++++++++++++++++ compiler/aarch64/aoptcpud.pas | 41 +++++++++++ 4 files changed, 244 insertions(+) create mode 100644 compiler/aarch64/aoptcpu.pas create mode 100644 compiler/aarch64/aoptcpub.pas create mode 100644 compiler/aarch64/aoptcpud.pas diff --git a/.gitattributes b/.gitattributes index 2d1409fc56..bdd88128ab 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13,6 +13,9 @@ compiler/aarch64/a64nop.inc svneol=native#text/plain compiler/aarch64/a64op.inc svneol=native#text/plain compiler/aarch64/a64reg.dat svneol=native#text/plain compiler/aarch64/a64tab.inc svneol=native#text/plain +compiler/aarch64/aoptcpu.pas svneol=native#text/plain +compiler/aarch64/aoptcpub.pas svneol=native#text/plain +compiler/aarch64/aoptcpud.pas svneol=native#text/plain compiler/aarch64/cpubase.pas svneol=native#text/plain compiler/aarch64/cpuinfo.pas svneol=native#text/plain compiler/aarch64/ra64con.inc svneol=native#text/plain diff --git a/compiler/aarch64/aoptcpu.pas b/compiler/aarch64/aoptcpu.pas new file mode 100644 index 0000000000..fb8e579d6c --- /dev/null +++ b/compiler/aarch64/aoptcpu.pas @@ -0,0 +1,66 @@ +{ + Copyright (c) 1998-2002 by Jonas Maebe, member of the Free Pascal + Development Team + + This unit implements the ARM64 optimizer object + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + **************************************************************************** +} + + +Unit aoptcpu; + +{$i fpcdefs.inc} + +Interface + +uses cpubase, aasmtai, aopt, aoptcpub; + +Type + TCpuAsmOptimizer = class(TAsmOptimizer) + { uses the same constructor as TAopObj } + function PeepHoleOptPass1Cpu(var p: tai): boolean; override; + procedure PeepHoleOptPass2;override; + End; + +Implementation + + uses + aasmbase,aasmcpu,cgbase; + + function CanBeCond(p : tai) : boolean; + begin + result:=(p.typ=ait_instruction) and (taicpu(p).condition=C_None); + end; + + + function TCpuAsmOptimizer.PeepHoleOptPass1Cpu(var p: tai): boolean; + var + next1: tai; + begin + result := false; + end; + + + procedure TCpuAsmOptimizer.PeepHoleOptPass2; + begin + end; + +begin + casmoptimizer:=TCpuAsmOptimizer; +End. + diff --git a/compiler/aarch64/aoptcpub.pas b/compiler/aarch64/aoptcpub.pas new file mode 100644 index 0000000000..d3964a02a3 --- /dev/null +++ b/compiler/aarch64/aoptcpub.pas @@ -0,0 +1,134 @@ + { + Copyright (c) 1998-2002 by Jonas Maebe, member of the Free Pascal + Development Team + + This unit contains several types and constants necessary for the + optimizer to work on the ARM64 architecture + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + **************************************************************************** +} +Unit aoptcpub; { Assembler OPTimizer CPU specific Base } + +{$i fpcdefs.inc} + +{ enable the following define if memory references can have both a base and } +{ index register in 1 operand } + +{ enable the following define if memory references can have a scaled index } +{ define RefsHaveScale} + +{ enable the following define if memory references can have a segment } +{ override } + +{ define RefsHaveSegment} + +Interface + +Uses + cgbase,aasmtai, + cpubase,aasmcpu,AOptBase; + +Type + +{ type of a normal instruction } + TInstr = Taicpu; + PInstr = ^TInstr; + +{ ************************************************************************* } +{ **************************** TCondRegs ********************************** } +{ ************************************************************************* } +{ Info about the conditional registers } + TCondRegs = Object + Constructor Init; + Destructor Done; + End; + +{ ************************************************************************* } +{ **************************** TAoptBaseCpu ******************************* } +{ ************************************************************************* } + + TAoptBaseCpu = class(TAoptBase) + function RegModifiedByInstruction(Reg: TRegister; p1: tai): boolean; override; + End; + + +{ ************************************************************************* } +{ ******************************* Constants ******************************* } +{ ************************************************************************* } +Const + +{ the maximum number of things (registers, memory, ...) a single instruction } +{ changes } + + MaxCh = 3; + +{ the maximum number of operands an instruction has } + + MaxOps = 4; + +{Oper index of operand that contains the source (reference) with a load } +{instruction } + + LoadSrc = 0; + +{Oper index of operand that contains the destination (register) with a load } +{instruction } + + LoadDst = 1; + +{Oper index of operand that contains the source (register) with a store } +{instruction } + + StoreSrc = 0; + +{Oper index of operand that contains the destination (reference) with a load } +{instruction } + + StoreDst = 1; + + aopt_uncondjmp = A_B; + aopt_condjmp = A_B; + +Implementation + +{ ************************************************************************* } +{ **************************** TCondRegs ********************************** } +{ ************************************************************************* } + Constructor TCondRegs.init; + Begin + End; + + + Destructor TCondRegs.Done; {$ifdef inl} inline; {$endif inl} + Begin + End; + + + function TAoptBaseCpu.RegModifiedByInstruction(Reg: TRegister; p1: tai): boolean; + var + i : Longint; + begin + result:=false; + for i:=0 to taicpu(p1).ops-1 do + if (taicpu(p1).oper[i]^.typ=top_reg) and (taicpu(p1).oper[i]^.reg=Reg) and (taicpu(p1).spilling_get_operation_type(i) in [operand_write,operand_readwrite]) then + begin + result:=true; + exit; + end; + end; + +End. diff --git a/compiler/aarch64/aoptcpud.pas b/compiler/aarch64/aoptcpud.pas new file mode 100644 index 0000000000..d3927b039c --- /dev/null +++ b/compiler/aarch64/aoptcpud.pas @@ -0,0 +1,41 @@ +{ + Copyright (c) 1998-2002 by Jonas Maebe, member of the Free Pascal + Development Team + + This unit contains the processor specific implementation of the + assembler optimizer data flow analyzer. + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + **************************************************************************** +} +Unit aoptcpud; + +{$i fpcdefs.inc} + +Interface + +uses + AOptDA; + +Type + TAOptDFACpu = class(TAOptDFA) + End; + +Implementation + + +End. +