mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-21 11:01:54 +01:00
- removed partial Alpha, IA64 and vis backends since they were never nor
will likely ever be finished git-svn-id: trunk@30836 -
This commit is contained in:
parent
1b43930749
commit
a04cae2c4b
30
.gitattributes
vendored
30
.gitattributes
vendored
@ -53,24 +53,6 @@ compiler/aasmsym.pas svneol=native#text/plain
|
|||||||
compiler/aasmtai.pas svneol=native#text/plain
|
compiler/aasmtai.pas svneol=native#text/plain
|
||||||
compiler/aggas.pas svneol=native#text/plain
|
compiler/aggas.pas svneol=native#text/plain
|
||||||
compiler/agjasmin.pas svneol=native#text/plain
|
compiler/agjasmin.pas svneol=native#text/plain
|
||||||
compiler/alpha/aasmcpu.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/agaxpgas.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/aoptcpu.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/aoptcpub.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/aoptcpuc.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/aoptcpud.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/cgcpu.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/cpubase.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/cpuinfo.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/cpunode.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/cpupara.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/cpupi.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/cputarg.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/radirect.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/rasm.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/rgcpu.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/symcpu.pas svneol=native#text/plain
|
|
||||||
compiler/alpha/tgcpu.pas svneol=native#text/plain
|
|
||||||
compiler/aopt.pas svneol=native#text/plain
|
compiler/aopt.pas svneol=native#text/plain
|
||||||
compiler/aoptbase.pas svneol=native#text/plain
|
compiler/aoptbase.pas svneol=native#text/plain
|
||||||
compiler/aoptcs.pas svneol=native#text/plain
|
compiler/aoptcs.pas svneol=native#text/plain
|
||||||
@ -213,7 +195,6 @@ compiler/i386/cpunode.pas svneol=native#text/plain
|
|||||||
compiler/i386/cpupara.pas svneol=native#text/plain
|
compiler/i386/cpupara.pas svneol=native#text/plain
|
||||||
compiler/i386/cpupi.pas svneol=native#text/plain
|
compiler/i386/cpupi.pas svneol=native#text/plain
|
||||||
compiler/i386/cputarg.pas svneol=native#text/plain
|
compiler/i386/cputarg.pas svneol=native#text/plain
|
||||||
compiler/i386/csopt386.pas svneol=native#text/plain
|
|
||||||
compiler/i386/daopt386.pas svneol=native#text/plain
|
compiler/i386/daopt386.pas svneol=native#text/plain
|
||||||
compiler/i386/hlcgcpu.pas svneol=native#text/plain
|
compiler/i386/hlcgcpu.pas svneol=native#text/plain
|
||||||
compiler/i386/i386att.inc svneol=native#text/plain
|
compiler/i386/i386att.inc svneol=native#text/plain
|
||||||
@ -250,7 +231,6 @@ compiler/i386/r386std.inc svneol=native#text/plain
|
|||||||
compiler/i386/ra386att.pas svneol=native#text/plain
|
compiler/i386/ra386att.pas svneol=native#text/plain
|
||||||
compiler/i386/ra386int.pas svneol=native#text/plain
|
compiler/i386/ra386int.pas svneol=native#text/plain
|
||||||
compiler/i386/rgcpu.pas svneol=native#text/plain
|
compiler/i386/rgcpu.pas svneol=native#text/plain
|
||||||
compiler/i386/rropt386.pas svneol=native#text/plain
|
|
||||||
compiler/i386/symcpu.pas svneol=native#text/plain
|
compiler/i386/symcpu.pas svneol=native#text/plain
|
||||||
compiler/i8086/aoptcpu.pas svneol=native#text/plain
|
compiler/i8086/aoptcpu.pas svneol=native#text/plain
|
||||||
compiler/i8086/aoptcpub.pas svneol=native#text/plain
|
compiler/i8086/aoptcpub.pas svneol=native#text/plain
|
||||||
@ -300,11 +280,6 @@ compiler/i8086/ra8086int.pas svneol=native#text/plain
|
|||||||
compiler/i8086/rgcpu.pas svneol=native#text/plain
|
compiler/i8086/rgcpu.pas svneol=native#text/plain
|
||||||
compiler/i8086/symcpu.pas svneol=native#text/plain
|
compiler/i8086/symcpu.pas svneol=native#text/plain
|
||||||
compiler/i8086/tgcpu.pas svneol=native#text/plain
|
compiler/i8086/tgcpu.pas svneol=native#text/plain
|
||||||
compiler/ia64/aasmcpu.pas svneol=native#text/plain
|
|
||||||
compiler/ia64/cpubase.pas svneol=native#text/plain
|
|
||||||
compiler/ia64/cpuinfo.pas svneol=native#text/plain
|
|
||||||
compiler/ia64/ia64reg.dat svneol=native#text/plain
|
|
||||||
compiler/ia64/symcpu.pas svneol=native#text/plain
|
|
||||||
compiler/impdef.pas svneol=native#text/plain
|
compiler/impdef.pas svneol=native#text/plain
|
||||||
compiler/import.pas svneol=native#text/plain
|
compiler/import.pas svneol=native#text/plain
|
||||||
compiler/jvm/aasmcpu.pas svneol=native#text/plain
|
compiler/jvm/aasmcpu.pas svneol=native#text/plain
|
||||||
@ -815,11 +790,6 @@ compiler/utils/ppuutils/ppuxml.pp svneol=native#text/plain
|
|||||||
compiler/utils/samplecfg svneol=native#text/plain
|
compiler/utils/samplecfg svneol=native#text/plain
|
||||||
compiler/verbose.pas svneol=native#text/plain
|
compiler/verbose.pas svneol=native#text/plain
|
||||||
compiler/version.pas svneol=native#text/plain
|
compiler/version.pas svneol=native#text/plain
|
||||||
compiler/vis/aasmcpu.pas svneol=native#text/plain
|
|
||||||
compiler/vis/cpubase.pas svneol=native#text/plain
|
|
||||||
compiler/vis/cpuinfo.pas svneol=native#text/plain
|
|
||||||
compiler/vis/cpunode.pas svneol=native#text/plain
|
|
||||||
compiler/vis/cpupara.pas svneol=native#text/plain
|
|
||||||
compiler/widestr.pas svneol=native#text/plain
|
compiler/widestr.pas svneol=native#text/plain
|
||||||
compiler/wpo.pas svneol=native#text/plain
|
compiler/wpo.pas svneol=native#text/plain
|
||||||
compiler/wpobase.pas svneol=native#text/plain
|
compiler/wpobase.pas svneol=native#text/plain
|
||||||
|
|||||||
@ -330,9 +330,6 @@ override PACKAGE_VERSION=3.1.1
|
|||||||
unexport FPC_VERSION FPC_COMPILERINFO
|
unexport FPC_VERSION FPC_COMPILERINFO
|
||||||
CYCLETARGETS=i386 powerpc sparc arm x86_64 powerpc64 m68k armeb mipsel mips avr jvm i8086 aarch64
|
CYCLETARGETS=i386 powerpc sparc arm x86_64 powerpc64 m68k armeb mipsel mips avr jvm i8086 aarch64
|
||||||
ALLTARGETS=$(CYCLETARGETS)
|
ALLTARGETS=$(CYCLETARGETS)
|
||||||
ifdef ALPHA
|
|
||||||
PPC_TARGET=alpha
|
|
||||||
endif
|
|
||||||
ifdef POWERPC
|
ifdef POWERPC
|
||||||
PPC_TARGET=powerpc
|
PPC_TARGET=powerpc
|
||||||
endif
|
endif
|
||||||
@ -436,9 +433,6 @@ MSGFILES=$(wildcard msg/error*.msg)
|
|||||||
ifeq ($(CPC_TARGET),i386)
|
ifeq ($(CPC_TARGET),i386)
|
||||||
CPUSUF=386
|
CPUSUF=386
|
||||||
endif
|
endif
|
||||||
ifeq ($(CPC_TARGET),alpha)
|
|
||||||
CPUSUF=axp
|
|
||||||
endif
|
|
||||||
ifeq ($(CPC_TARGET),m68k)
|
ifeq ($(CPC_TARGET),m68k)
|
||||||
CPUSUF=68k
|
CPUSUF=68k
|
||||||
endif
|
endif
|
||||||
@ -3861,7 +3855,7 @@ INSTALLEXEFILE=$(PPCROSSNAME)
|
|||||||
else
|
else
|
||||||
INSTALLEXEFILE=$(EXENAME)
|
INSTALLEXEFILE=$(EXENAME)
|
||||||
endif
|
endif
|
||||||
PPC_TARGETS=i386 m68k powerpc sparc arm armeb x86_64 powerpc64 alpha vis ia64 mips mipsel avr jvm i8086 aarch64
|
PPC_TARGETS=i386 m68k powerpc sparc arm armeb x86_64 powerpc64 mips mipsel avr jvm i8086 aarch64
|
||||||
INSTALL_TARGETS=$(addsuffix _exe_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
|
INSTALL_TARGETS=$(addsuffix _exe_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
|
||||||
.PHONY: $(PPC_TARGETS) $(INSTALL_TARGETS)
|
.PHONY: $(PPC_TARGETS) $(INSTALL_TARGETS)
|
||||||
$(PPC_TARGETS):
|
$(PPC_TARGETS):
|
||||||
@ -3936,9 +3930,6 @@ insdat: insdatx86 insdatarm insdataarch64
|
|||||||
regdatarm : arm/armreg.dat
|
regdatarm : arm/armreg.dat
|
||||||
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkarmreg.pp
|
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkarmreg.pp
|
||||||
cd arm && ..$(PATHSEP)utils$(PATHSEP)mkarmreg$(SRCEXEEXT)
|
cd arm && ..$(PATHSEP)utils$(PATHSEP)mkarmreg$(SRCEXEEXT)
|
||||||
regdatia64 : ia64/ia64reg.dat
|
|
||||||
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkia64reg.pp
|
|
||||||
cd ia64 && ..$(PATHSEP)utils$(PATHSEP)mkia64reg$(SRCEXEEXT)
|
|
||||||
regdatsp : sparc/spreg.dat
|
regdatsp : sparc/spreg.dat
|
||||||
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkspreg.pp
|
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkspreg.pp
|
||||||
cd sparc && ..$(PATHSEP)utils$(PATHSEP)mkspreg$(SRCEXEEXT)
|
cd sparc && ..$(PATHSEP)utils$(PATHSEP)mkspreg$(SRCEXEEXT)
|
||||||
|
|||||||
@ -38,9 +38,6 @@ CYCLETARGETS=i386 powerpc sparc arm x86_64 powerpc64 m68k armeb mipsel mips avr
|
|||||||
ALLTARGETS=$(CYCLETARGETS)
|
ALLTARGETS=$(CYCLETARGETS)
|
||||||
|
|
||||||
# Allow ALPHA, POWERPC, POWERPC64, M68K, I386, jvm defines for target cpu
|
# Allow ALPHA, POWERPC, POWERPC64, M68K, I386, jvm defines for target cpu
|
||||||
ifdef ALPHA
|
|
||||||
PPC_TARGET=alpha
|
|
||||||
endif
|
|
||||||
ifdef POWERPC
|
ifdef POWERPC
|
||||||
PPC_TARGET=powerpc
|
PPC_TARGET=powerpc
|
||||||
endif
|
endif
|
||||||
@ -172,9 +169,6 @@ MSGFILES=$(wildcard msg/error*.msg)
|
|||||||
ifeq ($(CPC_TARGET),i386)
|
ifeq ($(CPC_TARGET),i386)
|
||||||
CPUSUF=386
|
CPUSUF=386
|
||||||
endif
|
endif
|
||||||
ifeq ($(CPC_TARGET),alpha)
|
|
||||||
CPUSUF=axp
|
|
||||||
endif
|
|
||||||
ifeq ($(CPC_TARGET),m68k)
|
ifeq ($(CPC_TARGET),m68k)
|
||||||
CPUSUF=68k
|
CPUSUF=68k
|
||||||
endif
|
endif
|
||||||
@ -406,7 +400,7 @@ endif
|
|||||||
# CPU targets
|
# CPU targets
|
||||||
#####################################################################
|
#####################################################################
|
||||||
|
|
||||||
PPC_TARGETS=i386 m68k powerpc sparc arm armeb x86_64 powerpc64 alpha vis ia64 mips mipsel avr jvm i8086 aarch64
|
PPC_TARGETS=i386 m68k powerpc sparc arm armeb x86_64 powerpc64 mips mipsel avr jvm i8086 aarch64
|
||||||
INSTALL_TARGETS=$(addsuffix _exe_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
|
INSTALL_TARGETS=$(addsuffix _exe_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
|
||||||
|
|
||||||
.PHONY: $(PPC_TARGETS) $(INSTALL_TARGETS)
|
.PHONY: $(PPC_TARGETS) $(INSTALL_TARGETS)
|
||||||
@ -521,10 +515,6 @@ regdatarm : arm/armreg.dat
|
|||||||
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkarmreg.pp
|
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkarmreg.pp
|
||||||
cd arm && ..$(PATHSEP)utils$(PATHSEP)mkarmreg$(SRCEXEEXT)
|
cd arm && ..$(PATHSEP)utils$(PATHSEP)mkarmreg$(SRCEXEEXT)
|
||||||
|
|
||||||
regdatia64 : ia64/ia64reg.dat
|
|
||||||
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkia64reg.pp
|
|
||||||
cd ia64 && ..$(PATHSEP)utils$(PATHSEP)mkia64reg$(SRCEXEEXT)
|
|
||||||
|
|
||||||
regdatsp : sparc/spreg.dat
|
regdatsp : sparc/spreg.dat
|
||||||
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkspreg.pp
|
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkspreg.pp
|
||||||
cd sparc && ..$(PATHSEP)utils$(PATHSEP)mkspreg$(SRCEXEEXT)
|
cd sparc && ..$(PATHSEP)utils$(PATHSEP)mkspreg$(SRCEXEEXT)
|
||||||
|
|||||||
@ -1,268 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2000 by Florian Klaempfl
|
|
||||||
|
|
||||||
Implements the assembler classes specific for the Alpha
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
****************************************************************************
|
|
||||||
}
|
|
||||||
{
|
|
||||||
Implements the assembler classes specific for the Alpha.
|
|
||||||
}
|
|
||||||
unit aasmcpu;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
aasmbase,globals,verbose,
|
|
||||||
cpubase,aasmtai,aasmdata,aasmsym;
|
|
||||||
|
|
||||||
type
|
|
||||||
tai_frame = class(tai)
|
|
||||||
G,R : TRegister;
|
|
||||||
LS,LU : longint;
|
|
||||||
Constructor Create (GP : Tregister; Localsize : Longint; RA : TRegister; L : longint);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
taicpu = class(tai_cpu_abstract_sym)
|
|
||||||
constructor op_none(op : tasmop);
|
|
||||||
|
|
||||||
constructor op_reg(op : tasmop;_op1 : tregister);
|
|
||||||
constructor op_const(op : tasmop;_op1 : longint);
|
|
||||||
constructor op_ref(op : tasmop;_op1 : preference);
|
|
||||||
|
|
||||||
constructor op_reg_reg(op : tasmop;_op1,_op2 : tregister);
|
|
||||||
constructor op_reg_ref(op : tasmop;_op1 : tregister;_op2 : preference);
|
|
||||||
constructor op_reg_const(op:tasmop; _op1: tregister; _op2: longint);
|
|
||||||
|
|
||||||
constructor op_const_reg(op : tasmop;_op1 : longint;_op2 : tregister);
|
|
||||||
constructor op_const_const(op : tasmop;_op1,_op2 : longint);
|
|
||||||
constructor op_const_ref(op : tasmop;_op1 : longint;_op2 : preference);
|
|
||||||
|
|
||||||
constructor op_ref_reg(op : tasmop;_op1 : preference;_op2 : tregister);
|
|
||||||
{ this is only allowed if _op1 is an int value (_op1^.isintvalue=true) }
|
|
||||||
constructor op_ref_ref(op : tasmop;_op1,_op2 : preference);
|
|
||||||
|
|
||||||
constructor op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister);
|
|
||||||
constructor op_reg_const_reg(op : tasmop;_op1 : tregister;_op2 : longint;_op3 : tregister);
|
|
||||||
constructor op_const_ref_reg(op : tasmop;_op1 : longint;_op2 : preference;_op3 : tregister);
|
|
||||||
constructor op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister; _op3 : preference);
|
|
||||||
constructor op_const_reg_ref(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : preference);
|
|
||||||
constructor op_reg_ref_const(op : tasmop;_op1 : tregister;_op2 : preference;_op3 : longint);
|
|
||||||
|
|
||||||
{ this is for Jmp instructions }
|
|
||||||
constructor op_cond_sym(op : tasmop;cond:TAsmCond;_op1 : tasmsymbol);
|
|
||||||
|
|
||||||
constructor op_sym(op : tasmop;_op1 : tasmsymbol);
|
|
||||||
constructor op_sym_ofs(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint);
|
|
||||||
constructor op_sym_ofs_reg(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;_op2 : tregister);
|
|
||||||
constructor op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;_op2 : preference);
|
|
||||||
end;
|
|
||||||
|
|
||||||
tai_align = class(tai_align_abstract)
|
|
||||||
{ nothing to add }
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure InitAsm;
|
|
||||||
procedure DoneAsm;
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
taicpu Constructors
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_none(op : tasmop);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_reg(op : tasmop;_op1 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=1;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_const(op : tasmop;_op1 : longint);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=1;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_ref(op : tasmop;_op1 : preference);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=1;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_reg(op : tasmop;_op1,_op2 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_const(op:tasmop; _op1: tregister; _op2: longint);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_ref(op : tasmop;_op1 : tregister;_op2 : preference);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_const_reg(op : tasmop;_op1 : longint;_op2 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_const_const(op : tasmop;_op1,_op2 : longint);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_const_ref(op : tasmop;_op1 : longint;_op2 : preference);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor taicpu.op_ref_reg(op : tasmop;_op1 : preference;_op2 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_ref_ref(op : tasmop;_op1,_op2 : preference);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=3;
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_const_reg(op : tasmop;_op1 : tregister;_op2 : longint;_op3 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=3;
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister;_op3 : preference);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=3;
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor taicpu.op_const_ref_reg(op : tasmop;_op1 : longint;_op2 : preference;_op3 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=3;
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor taicpu.op_const_reg_ref(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : preference);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=3;
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_ref_const(op : tasmop;_op1 : tregister;_op2 : preference;_op3 : longint);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=3;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_cond_sym(op : tasmop;cond:TAsmCond;_op1 : tasmsymbol);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
condition:=cond;
|
|
||||||
ops:=1;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_sym(op : tasmop;_op1 : tasmsymbol);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=1;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_sym_ofs(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=1;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_sym_ofs_reg(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;_op2 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;_op2 : preference);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
ops:=2;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Constructor tai_frame.create (GP : Tregister; Localsize : Longint; RA : TRegister; L : longint);
|
|
||||||
|
|
||||||
begin
|
|
||||||
Inherited Create;
|
|
||||||
typ:=ait_frame;
|
|
||||||
G:=GP;
|
|
||||||
R:=RA;
|
|
||||||
LS:=LocalSize;
|
|
||||||
LU:=L;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure InitAsm;
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure DoneAsm;
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,126 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2000 by Florian Klaempfl
|
|
||||||
|
|
||||||
This unit implements an asm for the DEC Alpha
|
|
||||||
|
|
||||||
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 agaxpgas;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
globals,systems,aasmbase,aasmtai,aasmdata,
|
|
||||||
aggas,cpubase;
|
|
||||||
|
|
||||||
type
|
|
||||||
TAXPGNUAssembler=class(TGNUAssembler)
|
|
||||||
procedure WriteInstruction(hp : tai);override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
const
|
|
||||||
gas_reg2str : array[tregister] of string[4] = (
|
|
||||||
'',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'','',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'',''
|
|
||||||
);
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
const
|
|
||||||
op2str : array[tasmop] of string[14] = (
|
|
||||||
'addf','addg','addl','addq',
|
|
||||||
'adds','addt','amask','and','beq','bge',
|
|
||||||
'bgt','bic','bis','blbc','blbs','ble',
|
|
||||||
'blt','bne','br','bsr','call_pal','cmoveq',
|
|
||||||
'cmovge','cmovgt','cmovlbc','cmovlbs','cmovle','cmovlt',
|
|
||||||
'cmovne','cmpbge','cmpeq','cmpgeq','cmpgle','cmpglt',
|
|
||||||
'cmple','cmplt','cmpteq','cmptle','cmptlt','cmptun',
|
|
||||||
'cmpule','cmpult','cpys','cpyse','cpysn','ctlz',
|
|
||||||
'ctpop','cttz','cvtdg','cvtgd','cvtgf','cvtgq',
|
|
||||||
'cvtlq','cvtqf','cvtqg','cvtql','cvtqs','cvtqt',
|
|
||||||
'cvtst','cvttq','cvtts','divf','divg','divs',
|
|
||||||
'divt','ecb','eqv','excb','extbl','extlh',
|
|
||||||
'extll','extqh','extql','extwh','extwl','fbeq',
|
|
||||||
'fbge','fbgt','fble','fblt','fbne','fcmoveq',
|
|
||||||
'fcmovge','fcmovgt','fcmovle','fcmovlt','fcmovne','fetch',
|
|
||||||
'fetch_m','ftois','ftoit','implver','insbl','inslh',
|
|
||||||
'insll','insqh','insql','inswh','inswl','itoff',
|
|
||||||
'itofs','itoft','jmp','jsr','jsr_coroutine','lda',
|
|
||||||
'ldah','ldbu','ldwu','ldf','ldg','ldl',
|
|
||||||
'ldl_l','ldq','ldq_l','ldq_u','lds','ldt',
|
|
||||||
'maxsb8','maxsw4','maxub8','maxuw4','mb','mf_fpcr',
|
|
||||||
'minsb8','minsw4','minub8','minuw4','mskbl','msklh',
|
|
||||||
'mskll','mskqh','mskql','mskwh','mskwl','mt_fpcr',
|
|
||||||
'mulf','mulg','mull','mulq',
|
|
||||||
'muls','mult','ornot','perr','pklb','pkwb',
|
|
||||||
'rc','ret','rpcc','rs','s4addl','s4addq',
|
|
||||||
's4subl','s4subq','s8addl','s8addq','s8subl','s8subq',
|
|
||||||
'sextb','sextw','sll','sqrtf','sqrtg','sqrts',
|
|
||||||
'sqrtt','sra','srl','stb','stf','stg',
|
|
||||||
'sts','stl','stl_c','stq','stq_c','stq_u',
|
|
||||||
'stt','stw','subf','subg','subl',
|
|
||||||
'subq','subs','subt','trapb','umulh','unpkbl',
|
|
||||||
'unpkbw','wh64','wmb','xor','zap','zapnot',
|
|
||||||
'ldgp');
|
|
||||||
|
|
||||||
procedure TAXPGNUAssembler.WriteInstruction (hp : tai);
|
|
||||||
begin
|
|
||||||
(*
|
|
||||||
op:=paicpu(hp)^.opcode;
|
|
||||||
calljmp:=is_calljmp(op);
|
|
||||||
{ call maybe not translated to calll }
|
|
||||||
s:=#9+att_op2str[op]+cond2str[paicpu(hp)^.condition];
|
|
||||||
if (not calljmp) and
|
|
||||||
(not att_nosuffix[op]) and
|
|
||||||
not(
|
|
||||||
(paicpu(hp)^.oper[0].typ=top_reg) and
|
|
||||||
(paicpu(hp)^.oper[0].reg in [R_ST..R_ST7])
|
|
||||||
) then
|
|
||||||
s:=s+att_opsize2str[paicpu(hp)^.opsize];
|
|
||||||
{ process operands }
|
|
||||||
if paicpu(hp)^.ops<>0 then
|
|
||||||
begin
|
|
||||||
{ call and jmp need an extra handling }
|
|
||||||
{ this code is only called if jmp isn't a labeled instruction }
|
|
||||||
if calljmp then
|
|
||||||
s:=s+#9+getopstr_jmp(paicpu(hp)^.oper[0])
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
for i:=0to paicpu(hp)^.ops-1 do
|
|
||||||
begin
|
|
||||||
if i=0 then
|
|
||||||
sep:=#9
|
|
||||||
else
|
|
||||||
sep:=',';
|
|
||||||
s:=s+sep+getopstr(paicpu(hp)^.oper[i])
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
AsmWriteLn(s);
|
|
||||||
*)
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2000 by Jonas Maebe, member of the Free Pascal
|
|
||||||
Development Team
|
|
||||||
|
|
||||||
This unit implements the Alpha 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;
|
|
||||||
|
|
||||||
Interface
|
|
||||||
|
|
||||||
uses cpubase, aoptobj, aoptcpub;
|
|
||||||
|
|
||||||
Type
|
|
||||||
TAOptCpu = Object(TAoptObj)
|
|
||||||
{ uses the same constructor as TAopObj }
|
|
||||||
End;
|
|
||||||
|
|
||||||
Implementation
|
|
||||||
|
|
||||||
End.
|
|
||||||
@ -1,112 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2000 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 80x86 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 }
|
|
||||||
|
|
||||||
{ 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
|
|
||||||
CPUAsm,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 = Object(TAoptBase)
|
|
||||||
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 = 3;
|
|
||||||
|
|
||||||
{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;
|
|
||||||
|
|
||||||
Implementation
|
|
||||||
|
|
||||||
{ ************************************************************************* }
|
|
||||||
{ **************************** TCondRegs ********************************** }
|
|
||||||
{ ************************************************************************* }
|
|
||||||
Constructor TCondRegs.init;
|
|
||||||
Begin
|
|
||||||
End;
|
|
||||||
|
|
||||||
Destructor TCondRegs.Done; {$ifdef inl} inline; {$endif inl}
|
|
||||||
Begin
|
|
||||||
End;
|
|
||||||
|
|
||||||
End.
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2000 by Jonas Maebe, member of the Free Pascal
|
|
||||||
Development Team
|
|
||||||
|
|
||||||
This unit contains the processor specific implementation of the
|
|
||||||
assembler optimizer common subexpression elimination 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 aoptcpuc;
|
|
||||||
|
|
||||||
Interface
|
|
||||||
|
|
||||||
Uses
|
|
||||||
AOptCs;
|
|
||||||
|
|
||||||
Type
|
|
||||||
TRegInfoCpu = Object(TRegInfo)
|
|
||||||
End;
|
|
||||||
|
|
||||||
|
|
||||||
Implementation
|
|
||||||
|
|
||||||
End.
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2000 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;
|
|
||||||
|
|
||||||
Interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
AOptDA;
|
|
||||||
|
|
||||||
Type
|
|
||||||
PAOptDFACpu = ^TAOptDFACpu;
|
|
||||||
TAOptDFACpu = Object(TAOptDFA)
|
|
||||||
End;
|
|
||||||
|
|
||||||
Implementation
|
|
||||||
|
|
||||||
|
|
||||||
End.
|
|
||||||
@ -1,168 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2000 by Florian Klaempfl
|
|
||||||
|
|
||||||
This unit implements the code generator for the Alpha
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
****************************************************************************
|
|
||||||
}
|
|
||||||
{
|
|
||||||
This unit implements the code generator for the Alpha.
|
|
||||||
}
|
|
||||||
unit cgcpu;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
cgbase,cgobj,aasmbase,aasmtai,aasmdata,aasmcpu,cginfo,cpubase,cpuinfo;
|
|
||||||
|
|
||||||
type
|
|
||||||
pcgalpha = ^tcgalpha;
|
|
||||||
tcgalpha = class(tcg)
|
|
||||||
procedure a_call_name(list : TAsmList;const s : string);override;
|
|
||||||
procedure a_load_const_reg(list : TAsmList;size : tcgsize;a : aword;register : tregister);override;
|
|
||||||
procedure a_load_reg_ref(list : TAsmList;size : tcgsize;register : tregister;const ref : treference);override;
|
|
||||||
procedure a_load_ref_reg(list : TAsmList;size : tcgsize;const ref : treference;register : tregister);override;
|
|
||||||
procedure a_load_reg_reg(list : TAsmList;fromsize, tosize : tcgsize;reg1,reg2 : tregister);override;
|
|
||||||
procedure a_cmp_const_reg_label(list : TAsmList;size : tcgsize;cmp_op : topcmp;a : aword;
|
|
||||||
reg : tregister; l : tasmlabel);override;
|
|
||||||
procedure a_cmp_reg_reg_label(list : TAsmList;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : tasmlabel);
|
|
||||||
procedure a_cmp_reg_ref_label(list : TAsmList;size : tcgsize;cmp_op : topcmp;reg : tregister;l : tasmlabel);
|
|
||||||
procedure a_cmp_ref_const_label(list : TAsmList;size : tcgsize;cmp_op : topcmp;a : aword;
|
|
||||||
reg : tregister; l : tasmlabel);
|
|
||||||
procedure a_loadaddr_ref_reg(list : TAsmList;const ref : treference;r : tregister);override;
|
|
||||||
procedure g_stackframe_entry(list : TAsmList;localsize : longint);override;
|
|
||||||
procedure g_maybe_loadself(list : TAsmList);override;
|
|
||||||
procedure g_restore_frame_pointer(list : TAsmList);override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure create_codegen;
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
globtype,globals;
|
|
||||||
|
|
||||||
procedure tcgalpha.g_stackframe_entry(list : TAsmList;localsize : longint);
|
|
||||||
|
|
||||||
begin
|
|
||||||
list.concat(taicpu.op_reg_ref(A_LDGP,Global_pointer,new_reference(R_27,0)));
|
|
||||||
list.concat(taicpu.op_reg_ref(A_LDA,stack_pointer_reg,new_reference(stack_pointer_reg,-LocalSize)));
|
|
||||||
If LocalSize<>0 then
|
|
||||||
list.concat(tai_frame.create(Global_pointer,LocalSize,R_27,0));
|
|
||||||
{ Always generate a frame pointer. }
|
|
||||||
list.concat(taicpu.op_reg_reg_reg(A_BIS,stack_pointer_reg,stack_pointer_reg,frame_pointer_reg));
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure g_exitcode(list : TAsmList;parasize : longint; nostackframe,inlined : boolean);
|
|
||||||
|
|
||||||
begin
|
|
||||||
{ Restore stack pointer from frame pointer }
|
|
||||||
list.Concat (taicpu.op_reg_reg_reg(A_BIS,frame_pointer_reg,frame_pointer_reg,stack_pointer_reg));
|
|
||||||
{ Restore previous stack position}
|
|
||||||
list.Concat (taicpu.op_reg_const_reg(A_ADDQ,stack_pointer_reg,Parasize,stack_pointer_reg));
|
|
||||||
{ return... }
|
|
||||||
list.Concat(taicpu.op_reg_ref_const(A_RET,stack_pointer_reg,new_reference(Return_pointer,0),1));
|
|
||||||
{ end directive
|
|
||||||
Concat (paiend,init(''));
|
|
||||||
}
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure tcgalpha.a_call_name(list : TAsmList;const s : string);
|
|
||||||
|
|
||||||
begin
|
|
||||||
{ list^.concat(taicpu,op_sym(A_CALL,S_NO,newasmsymbol(s,AB_EXTERNAL,AT_FUNCTION)))); }
|
|
||||||
{!!!!!!!!!1 offset is ignored }
|
|
||||||
abstract;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure tcgalpha.a_load_const_reg(list : TAsmList;size : tcgsize;a : aword;register : tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgalpha.a_load_reg_ref(list : TAsmList;size : tcgsize;register : tregister;const ref : treference);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgalpha.a_load_ref_reg(list : TAsmList;size : tcgsize;const ref : treference;register : tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgalpha.a_load_reg_reg(list : TAsmList;fromsize, tosize : tcgsize;reg1,reg2 : tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgalpha.a_cmp_const_reg_label(list : TAsmList;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
|
|
||||||
l : tasmlabel);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgalpha.a_cmp_reg_reg_label(list : TAsmList;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : tasmlabel);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgalpha.a_cmp_reg_ref_label(list : TAsmList;size : tcgsize;cmp_op : topcmp;reg : tregister;l : tasmlabel);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgalpha.a_cmp_ref_const_label(list : TAsmList;size : tcgsize;cmp_op : topcmp;a : aword;
|
|
||||||
reg : tregister; l : tasmlabel);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgalpha.a_loadaddr_ref_reg(list : TAsmList;const ref : treference;r : tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgalpha.g_maybe_loadself(list : TAsmList);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgalpha.g_restore_frame_pointer(list : TAsmList);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure create_codegen;
|
|
||||||
begin
|
|
||||||
cg:=tcgalpha.create;
|
|
||||||
cg128:=tcg128.create;
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,431 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (C) 1998-2000 by Florian Klaempfl
|
|
||||||
|
|
||||||
This unit implements an asmlistitem class for the Alpha 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.
|
|
||||||
|
|
||||||
****************************************************************************
|
|
||||||
}
|
|
||||||
{
|
|
||||||
This unit implements an asmlistitem class for the Alpha architecture.
|
|
||||||
}
|
|
||||||
unit cpubase;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
cutils,cclasses,globals,aasmbase,cpuinfo,cginfo;
|
|
||||||
|
|
||||||
type
|
|
||||||
{ all registers }
|
|
||||||
TRegister = (R_NO, { R_NO is Mandatory, signifies no register }
|
|
||||||
R_0,R_1,R_2,R_3,R_4,R_5,R_6,R_7,R_8,R_9,
|
|
||||||
R_10,R_11,R_12,R_13,R_14,R_15,R_16,R_17,R_18,R_19,
|
|
||||||
R_20,R_21,R_22,R_23,R_24,R_25,R_26,R_27,R_28,R_29,
|
|
||||||
R_30,R_31,
|
|
||||||
R_F0,R_F1,R_F2,R_F3,R_F4,R_F5,R_F6,R_F7,R_F8,R_F9,
|
|
||||||
R_F10,R_F11,R_F12,R_F13,R_F14,R_F15,R_F16,R_F17,R_F18,R_F19,
|
|
||||||
R_F20,R_F21,R_F22,R_F23,R_F24,R_F25,R_F26,R_F27,R_F28,R_F29,
|
|
||||||
R_F30,R_F31);
|
|
||||||
|
|
||||||
tasmop = (A_ADDF,A_ADDG,A_ADDL,A_ADDQ,
|
|
||||||
A_ADDS,A_ADDT,A_AMASK,A_AND,A_BEQ,A_BGE,
|
|
||||||
A_BGT,A_BIC,A_BIS,A_BLBC,A_BLBS,A_BLE,
|
|
||||||
A_BLT,A_BNE,A_BR,A_BSR,A_CALL_PAL,A_CMOVEQ,
|
|
||||||
A_CMOVGE,A_CMOVGT,A_CMOVLBC,A_CMOVLBS,A_CMOVLE,A_CMOVLT,
|
|
||||||
A_CMOVNE,A_CMPBGE,A_CMPEQ,A_CMPGEQ,A_CMPGLE,A_CMPGLT,
|
|
||||||
A_CMPLE,A_CMPLT,A_CMPTEQ,A_CMPTLE,A_CMPTLT,A_CMPTUN,
|
|
||||||
A_CMPULE,A_CMPULT,A_CPYS,A_CPYSE,A_CPYSN,A_CTLZ,
|
|
||||||
A_CTPOP,A_CTTZ,A_CVTDG,A_CVTGD,A_CVTGF,A_CVTGQ,
|
|
||||||
A_CVTLQ,A_CVTQF,A_CVTQG,A_CVTQL,A_CVTQS,A_CVTQT,
|
|
||||||
A_CVTST,A_CVTTQ,A_CVTTS,A_DIVF,A_DIVG,A_DIVS,
|
|
||||||
A_DIVT,A_ECB,A_EQV,A_EXCB,A_EXTBL,A_EXTLH,
|
|
||||||
A_EXTLL,A_EXTQH,A_EXTQL,A_EXTWH,A_EXTWL,A_FBEQ,
|
|
||||||
A_FBGE,A_FBGT,A_FBLE,A_FBLT,A_FBNE,A_FCMOVEQ,
|
|
||||||
A_FCMOVGE,A_FCMOVGT,A_FCMOVLE,A_FCMOVLT,A_FCMOVNE,A_FETCH,
|
|
||||||
A_FETCH_M,A_FTOIS,A_FTOIT,A_IMPLVER,A_INSBL,A_INSLH,
|
|
||||||
A_INSLL,A_INSQH,A_INSQL,A_INSWH,A_INSWL,A_ITOFF,
|
|
||||||
A_ITOFS,A_ITOFT,A_JMP,A_JSR,A_JSR_COROUTINE,A_LDA,
|
|
||||||
A_LDAH,A_LDBU,A_LDWU,A_LDF,A_LDG,A_LDL,
|
|
||||||
A_LDL_L,A_LDQ,A_LDQ_L,A_LDQ_U,A_LDS,A_LDT,
|
|
||||||
A_MAXSB8,A_MAXSW4,A_MAXUB8,A_MAXUW4,A_MB,A_MF_FPCR,
|
|
||||||
A_MINSB8,A_MINSW4,A_MINUB8,A_MINUW4,A_MSKBL,A_MSKLH,
|
|
||||||
A_MSKLL,A_MSKQH,A_MSKQL,A_MSKWH,A_MSKWL,A_MT_FPCR,
|
|
||||||
A_MULF,A_MULG,A_MULL,A_MULQ,
|
|
||||||
A_MULS,A_MULT,A_ORNOT,A_PERR,A_PKLB,A_PKWB,
|
|
||||||
A_RC,A_RET,A_RPCC,A_RS,A_S4ADDL,A_S4ADDQ,
|
|
||||||
A_S4SUBL,A_S4SUBQ,A_S8ADDL,A_S8ADDQ,A_S8SUBL,A_S8SUBQ,
|
|
||||||
A_SEXTB,A_SEXTW,A_SLL,A_SQRTF,A_SQRTG,A_SQRTS,
|
|
||||||
A_SQRTT,A_SRA,A_SRL,A_STB,A_STF,A_STG,
|
|
||||||
A_STS,A_STL,A_STL_C,A_STQ,A_STQ_C,A_STQ_U,
|
|
||||||
A_STT,A_STW,A_SUBF,A_SUBG,A_SUBL,
|
|
||||||
A_SUBQ,A_SUBS,A_SUBT,A_TRAPB,A_UMULH,
|
|
||||||
A_UNPKBL,A_UNPKBW,A_WH64,A_WMB,A_XOR,A_ZAP,
|
|
||||||
A_ZAPNOT
|
|
||||||
{ Psuedo code understood by the gnu assembler }
|
|
||||||
,A_LDGP);
|
|
||||||
|
|
||||||
const
|
|
||||||
firstop = low(tasmop);
|
|
||||||
lastop = high(tasmop);
|
|
||||||
|
|
||||||
std_reg2str : array[tregister] of string[4] = (
|
|
||||||
'',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'','',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'','','','','','','','','','',
|
|
||||||
'',''
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
type
|
|
||||||
TAsmCond =
|
|
||||||
(
|
|
||||||
C_None,C_A,C_AE,C_B,C_BE,C_C,C_E,C_G,C_GE,C_L,C_LE,C_NA,C_NAE,
|
|
||||||
C_NB,C_NBE,C_NC,C_NE,C_NG,C_NGE,C_NL,C_NLE,C_NO,C_NP,C_NS,C_NZ,C_O,C_P,
|
|
||||||
C_PE,C_PO,C_S,C_Z
|
|
||||||
);
|
|
||||||
|
|
||||||
TRegisterset = Set of TRegister;
|
|
||||||
|
|
||||||
tregister64 = tregister;
|
|
||||||
|
|
||||||
Const
|
|
||||||
Firstreg = R_0;
|
|
||||||
LastReg = R_F31;
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Default generic sizes
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
{ Defines the default address size for a processor, }
|
|
||||||
OS_ADDR = OS_64;
|
|
||||||
{ the natural int size for a processor,
|
|
||||||
has to match osuinttype/ossinttype as initialized in psystem }
|
|
||||||
OS_INT = OS_64;
|
|
||||||
{ the maximum float size for a processor, }
|
|
||||||
OS_FLOAT = OS_F80;
|
|
||||||
{ the size of a vector register for a processor }
|
|
||||||
OS_VECTOR = OS_M64;
|
|
||||||
|
|
||||||
stack_pointer_reg = R_30;
|
|
||||||
frame_pointer_reg = R_15;
|
|
||||||
self_pointer_reg = R_16;
|
|
||||||
accumulator = R_0;
|
|
||||||
{the return_result_reg, is used inside the called function to store its return
|
|
||||||
value when that is a scalar value otherwise a pointer to the address of the
|
|
||||||
result is placed inside it}
|
|
||||||
return_result_reg = accumulator;
|
|
||||||
|
|
||||||
{the function_result_reg contains the function result after a call to a scalar
|
|
||||||
function othewise it contains a pointer to the returned result}
|
|
||||||
function_result_reg = accumulator;
|
|
||||||
fpu_result_reg = R_F0;
|
|
||||||
global_pointer = R_29;
|
|
||||||
return_pointer = R_26;
|
|
||||||
{ it is used to pass the offset to the destructor helper routine }
|
|
||||||
vmt_offset_reg = R_1;
|
|
||||||
|
|
||||||
{ low and high of the available maximum width integer general purpose }
|
|
||||||
{ registers }
|
|
||||||
LoGPReg = R_0;
|
|
||||||
HiGPReg = R_31;
|
|
||||||
|
|
||||||
{ low and high of every possible width general purpose register (same as
|
|
||||||
above on most architctures apart from the 80x86) }
|
|
||||||
LoReg = R_0;
|
|
||||||
HiReg = R_31;
|
|
||||||
|
|
||||||
maxfpuregs = 32;
|
|
||||||
|
|
||||||
max_operands = 4;
|
|
||||||
|
|
||||||
registers_saved_on_cdecl = [R_9..R_14,R_F2..R_F9];
|
|
||||||
|
|
||||||
maxvarregs = 6;
|
|
||||||
varregs : Array [1..maxvarregs] of Tregister =
|
|
||||||
(R_9,R_10,R_11,R_12,R_13,R_14);
|
|
||||||
|
|
||||||
maxfpuvarregs = 8;
|
|
||||||
|
|
||||||
{ Registers which are defined as scratch and no need to save across
|
|
||||||
routine calls or in assembler blocks.
|
|
||||||
}
|
|
||||||
max_scratch_regs = 2;
|
|
||||||
scratch_regs : array[1..max_scratch_regs] of tregister = (R_1,R_2);
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
GDB Information
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
{ Register indexes for stabs information, when some
|
|
||||||
parameters or variables are stored in registers.
|
|
||||||
}
|
|
||||||
stab_regindex : array[tregister] of shortint =
|
|
||||||
(0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0,0,0,0,0,0,0,0,0,
|
|
||||||
0,0
|
|
||||||
);
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Flags
|
|
||||||
*****************************************************************************}
|
|
||||||
type
|
|
||||||
{ The Alpha doesn't have flags but some generic code depends on this type. }
|
|
||||||
TResFlags = (F_NO);
|
|
||||||
|
|
||||||
|
|
||||||
{ reference record }
|
|
||||||
pparareference = ^tparareference;
|
|
||||||
tparareference = packed record
|
|
||||||
index : tregister;
|
|
||||||
offset : longint;
|
|
||||||
end;
|
|
||||||
|
|
||||||
trefoptions=(ref_none,ref_parafixup,ref_localfixup,ref_selffixup);
|
|
||||||
|
|
||||||
TReference = record
|
|
||||||
offset : aword;
|
|
||||||
symbol : tasmsymbol;
|
|
||||||
base : tregister;
|
|
||||||
{ The index isn't used by the alpha port, but some generic code depends on it }
|
|
||||||
index : tregister;
|
|
||||||
is_immediate : boolean;
|
|
||||||
offsetfixup : word; {needed for inline}
|
|
||||||
options : trefoptions;
|
|
||||||
{ the boundary to which the reference is surely aligned }
|
|
||||||
alignment : byte;
|
|
||||||
end;
|
|
||||||
PReference = ^TReference;
|
|
||||||
|
|
||||||
TLoc=(
|
|
||||||
LOC_INVALID, { added for tracking problems}
|
|
||||||
LOC_CONSTANT, { constant value }
|
|
||||||
LOC_JUMP, { boolean results only, jump to false or true label }
|
|
||||||
LOC_FLAGS, { boolean results only, flags are set }
|
|
||||||
LOC_CREFERENCE, { in memory constant value reference (cannot change) }
|
|
||||||
LOC_REFERENCE, { in memory value }
|
|
||||||
LOC_REGISTER, { in a processor register }
|
|
||||||
LOC_CREGISTER, { Constant register which shouldn't be modified }
|
|
||||||
LOC_FPUREGISTER, { FPU stack }
|
|
||||||
LOC_CFPUREGISTER, { if it is a FPU register variable on the fpu stack }
|
|
||||||
LOC_SSEREGISTER,
|
|
||||||
LOC_CSSEREGISTER,
|
|
||||||
LOC_CMMREGISTER,
|
|
||||||
LOC_MMREGISTER
|
|
||||||
);
|
|
||||||
|
|
||||||
{ tparamlocation describes where a parameter for a procedure is stored.
|
|
||||||
References are given from the caller's point of view. The usual
|
|
||||||
TLocation isn't used, because contains a lot of unnessary fields.
|
|
||||||
}
|
|
||||||
tparalocation = packed record
|
|
||||||
size : TCGSize;
|
|
||||||
loc : TLoc;
|
|
||||||
sp_fixup : longint;
|
|
||||||
case TLoc of
|
|
||||||
LOC_REFERENCE : (reference : tparareference);
|
|
||||||
{ segment in reference at the same place as in loc_register }
|
|
||||||
LOC_REGISTER,LOC_CREGISTER : (
|
|
||||||
case longint of
|
|
||||||
1 : (register,register64.reghi : tregister);
|
|
||||||
{ overlay a register64.reglo }
|
|
||||||
2 : (register64.reglo : tregister);
|
|
||||||
{ overlay a 64 Bit register type }
|
|
||||||
3 : (reg64 : tregister64);
|
|
||||||
4 : (register64 : tregister64);
|
|
||||||
);
|
|
||||||
end;
|
|
||||||
|
|
||||||
tlocation = packed record
|
|
||||||
loc : TLoc;
|
|
||||||
size : TCGSize;
|
|
||||||
case TLoc of
|
|
||||||
LOC_CONSTANT : (
|
|
||||||
case longint of
|
|
||||||
1 : (value : AWord);
|
|
||||||
{ can't do this, this layout depends on the host cpu. Use }
|
|
||||||
{ lo(valueqword)/hi(valueqword) instead (JM) }
|
|
||||||
{ 2 : (valuelow, valuehigh:AWord); }
|
|
||||||
{ overlay a complete 64 Bit value }
|
|
||||||
3 : (valueqword : qword);
|
|
||||||
);
|
|
||||||
LOC_CREFERENCE,
|
|
||||||
LOC_REFERENCE : (reference : treference);
|
|
||||||
{ segment in reference at the same place as in loc_register }
|
|
||||||
LOC_REGISTER,LOC_CREGISTER : (
|
|
||||||
case longint of
|
|
||||||
1 : (register,register64.reghi,segment : tregister);
|
|
||||||
{ overlay a register64.reglo }
|
|
||||||
2 : (register64.reglo : tregister);
|
|
||||||
{ overlay a 64 Bit register type }
|
|
||||||
3 : (reg64 : tregister64);
|
|
||||||
4 : (register64 : tregister64);
|
|
||||||
);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Operands
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
|
|
||||||
{ Types of operand }
|
|
||||||
toptype=(top_none,top_reg,top_ref,top_const,top_symbol);
|
|
||||||
|
|
||||||
toper=record
|
|
||||||
ot : longint;
|
|
||||||
case typ : toptype of
|
|
||||||
top_none : ();
|
|
||||||
top_reg : (reg:tregister);
|
|
||||||
top_ref : (ref:preference);
|
|
||||||
top_const : (val:longint);
|
|
||||||
top_symbol : (sym:tasmsymbol;symofs:longint);
|
|
||||||
end;
|
|
||||||
|
|
||||||
const
|
|
||||||
{ Registers which must be saved when calling a routine declared as
|
|
||||||
cppdecl, cdecl, stdcall, safecall, palmossyscall. The registers
|
|
||||||
saved should be the ones as defined in the target ABI and / or GCC.
|
|
||||||
|
|
||||||
This value can be deduced from the CALLED_USED_REGISTERS array in the
|
|
||||||
GCC source.
|
|
||||||
}
|
|
||||||
std_saved_registers = [];
|
|
||||||
{ Required parameter alignment when calling a routine declared as
|
|
||||||
stdcall and cdecl. The alignment value should be the one defined
|
|
||||||
by GCC or the target ABI.
|
|
||||||
|
|
||||||
The value of this constant is equal to the constant
|
|
||||||
PARM_BOUNDARY / BITS_PER_UNIT in the GCC source.
|
|
||||||
}
|
|
||||||
std_param_align = 8;
|
|
||||||
|
|
||||||
{ offsets for the integer and floating point registers }
|
|
||||||
INT_REG = 0;
|
|
||||||
FLOAT_REG = 32;
|
|
||||||
|
|
||||||
{ operator qualifiers }
|
|
||||||
OQ_CHOPPED_ROUNDING = $01; { /C }
|
|
||||||
OQ_ROUNDING_MODE_DYNAMIC = $02; { /D }
|
|
||||||
OQ_ROUND_TOWARD_MINUS_INFINITY = $04; { /M }
|
|
||||||
OQ_INEXACT_RESULT_ENABLE = $08; { /I }
|
|
||||||
OQ_SOFTWARE_COMPLETION_ENABLE = $10; { /S }
|
|
||||||
OQ_FLOATING_UNDERFLOW_ENABLE = $20; { /U }
|
|
||||||
OQ_INTEGER_OVERFLOW_ENABLE = $40; { /V }
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Opcode propeties (needed for optimizer)
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
{$ifndef NOOPT}
|
|
||||||
Type
|
|
||||||
{What an instruction can change}
|
|
||||||
TInsChange = (Ch_None);
|
|
||||||
{$endif}
|
|
||||||
|
|
||||||
|
|
||||||
{ resets all values of ref to defaults }
|
|
||||||
procedure reset_reference(var ref : treference);
|
|
||||||
{ set mostly used values of a new reference }
|
|
||||||
function new_reference(base : tregister;offset : longint) : preference;
|
|
||||||
function newreference(const r : treference) : preference;
|
|
||||||
procedure disposereference(var r : preference);
|
|
||||||
|
|
||||||
function reg2str(r : tregister) : string;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Init/Done
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
procedure InitCpu;
|
|
||||||
procedure DoneCpu;
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
verbose;
|
|
||||||
|
|
||||||
function reg2str(r : tregister) : string;
|
|
||||||
|
|
||||||
begin
|
|
||||||
if r in [R_0..R_31] then
|
|
||||||
reg2str:='R'+tostr(longint(r)-longint(R_0))
|
|
||||||
else if r in [R_F0..R_F31] then
|
|
||||||
reg2str:='F'+tostr(longint(r)-longint(R_F0))
|
|
||||||
else internalerror(38991);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure reset_reference(var ref : treference);
|
|
||||||
begin
|
|
||||||
FillChar(ref,sizeof(treference),0);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
function new_reference(base : tregister;offset : longint) : preference;
|
|
||||||
var
|
|
||||||
r : preference;
|
|
||||||
begin
|
|
||||||
new(r);
|
|
||||||
FillChar(r^,sizeof(treference),0);
|
|
||||||
r^.offset:=offset;
|
|
||||||
r^.alignment:=8;
|
|
||||||
new_reference:=r;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function newreference(const r : treference) : preference;
|
|
||||||
|
|
||||||
var
|
|
||||||
p : preference;
|
|
||||||
begin
|
|
||||||
new(p);
|
|
||||||
p^:=r;
|
|
||||||
newreference:=p;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure disposereference(var r : preference);
|
|
||||||
|
|
||||||
begin
|
|
||||||
dispose(r);
|
|
||||||
r:=Nil;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Init/Done
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
procedure InitCpu;
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure DoneCpu;
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,91 +0,0 @@
|
|||||||
{
|
|
||||||
This file is part of the Free Pascal run time library.
|
|
||||||
Copyright (c) 1998-2000 by the Free Pascal development team
|
|
||||||
|
|
||||||
Basic Processor information about the Alpha
|
|
||||||
|
|
||||||
See the file COPYING.FPC, included in this distribution,
|
|
||||||
for details about the copyright.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
**********************************************************************}
|
|
||||||
{
|
|
||||||
Basic Processor information about the Alpha
|
|
||||||
}
|
|
||||||
Unit CPUInfo;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
Interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
globtype;
|
|
||||||
|
|
||||||
Type
|
|
||||||
{ Natural integer register type and size for the target machine }
|
|
||||||
{$ifdef FPC}
|
|
||||||
AWord = Qword;
|
|
||||||
{$else FPC}
|
|
||||||
AWord = Longint;
|
|
||||||
{$endif FPC}
|
|
||||||
PAWord = ^AWord;
|
|
||||||
|
|
||||||
{ This must be an ordinal type with the same size as a pointer
|
|
||||||
Note: Must be unsigned! Otherwise, ugly code like
|
|
||||||
pointer(-1) will result in a pointer with the value
|
|
||||||
$fffffffffffffff on a 32bit machine if the compiler uses
|
|
||||||
int64 constants internally (JM) }
|
|
||||||
TConstPtrUInt = qword;
|
|
||||||
|
|
||||||
bestreal = extended;
|
|
||||||
{$if FPC_FULLVERSION>20700}
|
|
||||||
bestrealrec = TExtended80Rec;
|
|
||||||
{$endif FPC_FULLVERSION>20700}
|
|
||||||
ts32real = single;
|
|
||||||
ts64real = double;
|
|
||||||
ts80real = extended;
|
|
||||||
ts64comp = extended;
|
|
||||||
|
|
||||||
pbestreal=^bestreal;
|
|
||||||
|
|
||||||
{ possible supported processors for this target }
|
|
||||||
tcputype =
|
|
||||||
(cpu_none,
|
|
||||||
ClassEV7,
|
|
||||||
ClassEV8
|
|
||||||
);
|
|
||||||
|
|
||||||
tcontrollertype =
|
|
||||||
(ct_none
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Const
|
|
||||||
{ Is there support for dealing with multiple microcontrollers available }
|
|
||||||
{ for this platform? }
|
|
||||||
ControllerSupport = false;
|
|
||||||
{ Size of native extended type }
|
|
||||||
extended_size = 16;
|
|
||||||
{# Size of a pointer }
|
|
||||||
aint_size = 8;
|
|
||||||
{# Size of a multimedia register }
|
|
||||||
mmreg_size = 8;
|
|
||||||
|
|
||||||
{ We know that there are fields after sramsize
|
|
||||||
but we don't care about this warning }
|
|
||||||
{$PUSH}
|
|
||||||
{$WARN 3177 OFF}
|
|
||||||
embedded_controllers : array [tcontrollertype] of tcontrollerdatatype =
|
|
||||||
(
|
|
||||||
(controllertypestr:''; controllerunitstr:''; flashbase:0; flashsize:0; srambase:0; sramsize:0));
|
|
||||||
{$POP}
|
|
||||||
|
|
||||||
{ target cpu string (used by compiler options) }
|
|
||||||
target_cpu_string = 'alpha';
|
|
||||||
|
|
||||||
Implementation
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,56 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 2000-2002 by Florian Klaempfl
|
|
||||||
|
|
||||||
Imports the Alpha code generator
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
****************************************************************************
|
|
||||||
}
|
|
||||||
{
|
|
||||||
This unit imports the Alpha code generator.
|
|
||||||
}
|
|
||||||
unit cpunode;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
{ generic nodes }
|
|
||||||
ncgbas,ncgld,ncgflw,ncgcnv,ncgmem,ncgcon,ncgcal,ncgset,ncginl,
|
|
||||||
{ to be able to only parts of the generic code,
|
|
||||||
the processor specific nodes must be included
|
|
||||||
after the generic one (FK)
|
|
||||||
}
|
|
||||||
// naxpadd,
|
|
||||||
// naxpcal,
|
|
||||||
// naxpcon,
|
|
||||||
// naxpflw,
|
|
||||||
// naxpmem,
|
|
||||||
// naxpset,
|
|
||||||
// naxpinl,
|
|
||||||
// nppcopt,
|
|
||||||
{ this not really a node }
|
|
||||||
// naxpobj,
|
|
||||||
// naxpmat,
|
|
||||||
// naxpcnv,
|
|
||||||
{ symtable }
|
|
||||||
symcpu
|
|
||||||
;
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,270 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 2002 by Florian Klaempfl
|
|
||||||
|
|
||||||
Alpha specific calling conventions
|
|
||||||
|
|
||||||
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.
|
|
||||||
****************************************************************************
|
|
||||||
}
|
|
||||||
{ Alpha specific calling conventions are handled by this unit
|
|
||||||
}
|
|
||||||
unit cpupara;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
cpubase,
|
|
||||||
symconst,symbase,symtype,symdef,paramgr;
|
|
||||||
|
|
||||||
type
|
|
||||||
tcpuparamanager = class(tparamanager)
|
|
||||||
procedure create_param_loc_info(p : tabstractprocdef);override;
|
|
||||||
function getfuncretparaloc(p : tabstractprocdef) : tparalocation;override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
verbose,
|
|
||||||
globtype,
|
|
||||||
cpuinfo,cginfo,cgbase,
|
|
||||||
defbase;
|
|
||||||
|
|
||||||
function getparaloc(p : tdef) : tloc;
|
|
||||||
|
|
||||||
begin
|
|
||||||
{ Later, the LOC_REFERENCE is in most cases changed into LOC_REGISTER
|
|
||||||
if push_addr_param for the def is true
|
|
||||||
}
|
|
||||||
case p.typ of
|
|
||||||
orddef:
|
|
||||||
getparaloc:=LOC_REGISTER;
|
|
||||||
floatdef:
|
|
||||||
getparaloc:=LOC_FPUREGISTER;
|
|
||||||
enumdef:
|
|
||||||
getparaloc:=LOC_REGISTER;
|
|
||||||
pointerdef:
|
|
||||||
getparaloc:=LOC_REGISTER;
|
|
||||||
formaldef:
|
|
||||||
getparaloc:=LOC_REGISTER;
|
|
||||||
classrefdef:
|
|
||||||
getparaloc:=LOC_REGISTER;
|
|
||||||
recorddef:
|
|
||||||
getparaloc:=LOC_REFERENCE;
|
|
||||||
objectdef:
|
|
||||||
if is_object(p) then
|
|
||||||
getparaloc:=LOC_REFERENCE
|
|
||||||
else
|
|
||||||
getparaloc:=LOC_REGISTER;
|
|
||||||
stringdef:
|
|
||||||
if is_shortstring(p) or is_longstring(p) then
|
|
||||||
getparaloc:=LOC_REFERENCE
|
|
||||||
else
|
|
||||||
getparaloc:=LOC_REGISTER;
|
|
||||||
procvardef:
|
|
||||||
if (po_methodpointer in tprocvardef(p).procoptions) then
|
|
||||||
getparaloc:=LOC_REFERENCE
|
|
||||||
else
|
|
||||||
getparaloc:=LOC_REGISTER;
|
|
||||||
filedef:
|
|
||||||
getparaloc:=LOC_REGISTER;
|
|
||||||
arraydef:
|
|
||||||
getparaloc:=LOC_REFERENCE;
|
|
||||||
setdef:
|
|
||||||
if is_smallset(p) then
|
|
||||||
getparaloc:=LOC_REGISTER
|
|
||||||
else
|
|
||||||
getparaloc:=LOC_REFERENCE;
|
|
||||||
variantdef:
|
|
||||||
getparaloc:=LOC_REFERENCE;
|
|
||||||
{ avoid problems with errornous definitions }
|
|
||||||
errordef:
|
|
||||||
getparaloc:=LOC_REGISTER;
|
|
||||||
else
|
|
||||||
internalerror(2002071001);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure tcpuparamanager.create_param_loc_info(p : tabstractprocdef);
|
|
||||||
|
|
||||||
var
|
|
||||||
nextintreg,nextfloatreg,nextmmreg : tregister;
|
|
||||||
stack_offset : aword;
|
|
||||||
hp : tparaitem;
|
|
||||||
loc : tloc;
|
|
||||||
is_64bit: boolean;
|
|
||||||
|
|
||||||
begin
|
|
||||||
nextintreg:=R_3;
|
|
||||||
nextfloatreg:=R_F1;
|
|
||||||
// nextmmreg:=R_M1;
|
|
||||||
stack_offset:=0;
|
|
||||||
{ pointer for structured results ? }
|
|
||||||
if not is_void(p.returndef) then
|
|
||||||
begin
|
|
||||||
if not(ret_in_reg(p.returndef)) then
|
|
||||||
inc(nextintreg);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ frame pointer for nested procedures? }
|
|
||||||
{ inc(nextintreg); }
|
|
||||||
{ constructor? }
|
|
||||||
{ destructor? }
|
|
||||||
hp:=tparaitem(p.para.last);
|
|
||||||
while assigned(hp) do
|
|
||||||
begin
|
|
||||||
loc:=getparaloc(hp.paratype.def);
|
|
||||||
hp.paraloc.sp_fixup:=0;
|
|
||||||
case loc of
|
|
||||||
LOC_REGISTER:
|
|
||||||
begin
|
|
||||||
hp.paraloc.size := def_cgsize(hp.paratype.def);
|
|
||||||
{ for things like formaldef }
|
|
||||||
if hp.paraloc.size = OS_NO then
|
|
||||||
hp.paraloc.size := OS_ADDR;
|
|
||||||
is_64bit := hp.paraloc.size in [OS_64,OS_S64];
|
|
||||||
if nextintreg<=tregister(ord(R_10)-ord(is_64bit)) then
|
|
||||||
begin
|
|
||||||
hp.paraloc.loc:=LOC_REGISTER;
|
|
||||||
hp.paraloc.register64.reglo:=nextintreg;
|
|
||||||
inc(nextintreg);
|
|
||||||
if is_64bit then
|
|
||||||
begin
|
|
||||||
hp.paraloc.register64.reghi:=nextintreg;
|
|
||||||
inc(nextintreg);
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
nextintreg := R_11;
|
|
||||||
hp.paraloc.loc:=LOC_REFERENCE;
|
|
||||||
hp.paraloc.reference.index:=stack_pointer_reg;
|
|
||||||
hp.paraloc.reference.offset:=stack_offset;
|
|
||||||
if not is_64bit then
|
|
||||||
inc(stack_offset,4)
|
|
||||||
else
|
|
||||||
inc(stack_offset,8);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
LOC_FPUREGISTER:
|
|
||||||
begin
|
|
||||||
if hp.paratyp in [vs_var,vs_out] then
|
|
||||||
begin
|
|
||||||
if nextintreg<=R_10 then
|
|
||||||
begin
|
|
||||||
hp.paraloc.size:=OS_ADDR;
|
|
||||||
hp.paraloc.loc:=LOC_REGISTER;
|
|
||||||
hp.paraloc.register:=nextintreg;
|
|
||||||
inc(nextintreg);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
{!!!!!!!}
|
|
||||||
hp.paraloc.size:=def_cgsize(hp.paratype.def);
|
|
||||||
internalerror(2002071006);
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
else if nextfloatreg<=R_F10 then
|
|
||||||
begin
|
|
||||||
hp.paraloc.size:=def_cgsize(hp.paratype.def);
|
|
||||||
hp.paraloc.loc:=LOC_FPUREGISTER;
|
|
||||||
hp.paraloc.register:=nextfloatreg;
|
|
||||||
inc(nextfloatreg);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
{!!!!!!!}
|
|
||||||
hp.paraloc.size:=def_cgsize(hp.paratype.def);
|
|
||||||
internalerror(2002071004);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
LOC_REFERENCE:
|
|
||||||
begin
|
|
||||||
hp.paraloc.size:=OS_ADDR;
|
|
||||||
if push_addr_param(hp.paratype.def,p.proccalloption in [pocall_cdecl,pocall_cppdecl]) or (hp.paratyp in [vs_var,vs_out]) then
|
|
||||||
begin
|
|
||||||
if nextintreg<=R_10 then
|
|
||||||
begin
|
|
||||||
hp.paraloc.loc:=LOC_REGISTER;
|
|
||||||
hp.paraloc.register:=nextintreg;
|
|
||||||
inc(nextintreg);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
hp.paraloc.loc:=LOC_REFERENCE;
|
|
||||||
hp.paraloc.reference.index:=stack_pointer_reg;
|
|
||||||
hp.paraloc.reference.offset:=stack_offset;
|
|
||||||
inc(stack_offset,4);
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
hp.paraloc.loc:=LOC_REFERENCE;
|
|
||||||
hp.paraloc.reference.index:=stack_pointer_reg;
|
|
||||||
hp.paraloc.reference.offset:=stack_offset;
|
|
||||||
inc(stack_offset,hp.paratype.def.size);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
else
|
|
||||||
internalerror(2002071002);
|
|
||||||
end;
|
|
||||||
hp:=tparaitem(hp.previous);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function tcpuparamanager.getfuncretparaloc(p : tabstractprocdef) : tparalocation;
|
|
||||||
begin
|
|
||||||
case p.returndef.typ of
|
|
||||||
orddef,
|
|
||||||
enumdef:
|
|
||||||
begin
|
|
||||||
getfuncretparaloc.loc:=LOC_REGISTER;
|
|
||||||
getfuncretparaloc.register:=R_3;
|
|
||||||
getfuncretparaloc.size:=def_cgsize(p.returndef);
|
|
||||||
if getfuncretparaloc.size in [OS_S64,OS_64] then
|
|
||||||
getfuncretparaloc.register64.reghi:=R_4;
|
|
||||||
end;
|
|
||||||
floatdef:
|
|
||||||
begin
|
|
||||||
getfuncretparaloc.loc:=LOC_FPUREGISTER;
|
|
||||||
getfuncretparaloc.register:=R_F1;
|
|
||||||
getfuncretparaloc.size:=def_cgsize(p.returndef);
|
|
||||||
end;
|
|
||||||
pointerdef,
|
|
||||||
formaldef,
|
|
||||||
classrefdef,
|
|
||||||
recorddef,
|
|
||||||
objectdef,
|
|
||||||
stringdef,
|
|
||||||
procvardef,
|
|
||||||
filedef,
|
|
||||||
arraydef,
|
|
||||||
errordef:
|
|
||||||
begin
|
|
||||||
getfuncretparaloc.loc:=LOC_REGISTER;
|
|
||||||
getfuncretparaloc.register:=R_3;
|
|
||||||
getfuncretparaloc.size:=OS_ADDR;
|
|
||||||
end;
|
|
||||||
else
|
|
||||||
internalerror(2002090903);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
begin
|
|
||||||
paramanager:=tcpuparamanager.create;
|
|
||||||
end.
|
|
||||||
@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 2002 by Florian Klaempfl
|
|
||||||
|
|
||||||
This unit contains the CPU specific part of tprocinfo
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
****************************************************************************
|
|
||||||
}
|
|
||||||
{
|
|
||||||
This unit contains the CPU specific part of tprocinfo.
|
|
||||||
}
|
|
||||||
unit cpupi;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
cgbase;
|
|
||||||
|
|
||||||
type
|
|
||||||
talphaprocinfo = class(tprocinfo)
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
begin
|
|
||||||
cprocinfo:=talphaprocinfo;
|
|
||||||
end.
|
|
||||||
@ -1,51 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 2001-2002 by Peter Vreman
|
|
||||||
|
|
||||||
Includes the powerpc dependent target units
|
|
||||||
|
|
||||||
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 cputarg;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
systems { prevent a syntax error when nothing is included }
|
|
||||||
|
|
||||||
{**************************************
|
|
||||||
Targets
|
|
||||||
**************************************}
|
|
||||||
|
|
||||||
{$ifndef NOTARGETLINUX}
|
|
||||||
,t_linux
|
|
||||||
{$endif}
|
|
||||||
|
|
||||||
{**************************************
|
|
||||||
Assemblers
|
|
||||||
**************************************}
|
|
||||||
|
|
||||||
{$ifndef NOAGAXPGAS}
|
|
||||||
,agaxpgas
|
|
||||||
{$endif}
|
|
||||||
;
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,65 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2002 by The Free Pascal Team
|
|
||||||
|
|
||||||
This unit does the parsing process for the inline assembler
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
****************************************************************************
|
|
||||||
}
|
|
||||||
{
|
|
||||||
This unit does the parsing process for the inline assembler.
|
|
||||||
}
|
|
||||||
Unit Rasm;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
Interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
node;
|
|
||||||
|
|
||||||
{
|
|
||||||
This routine is called to parse the instructions in assembler
|
|
||||||
blocks. It returns a complete list of directive and instructions
|
|
||||||
}
|
|
||||||
function assemble: tnode;
|
|
||||||
|
|
||||||
|
|
||||||
Implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
{ common }
|
|
||||||
cutils,cclasses,
|
|
||||||
{ global }
|
|
||||||
globtype,globals,verbose,
|
|
||||||
systems,
|
|
||||||
{ aasm }
|
|
||||||
cpubase,aasmbase,aasmtai,aasmdata,aasmcpu,
|
|
||||||
{ symtable }
|
|
||||||
symconst,symbase,symtype,symsym,symtable,
|
|
||||||
{ pass 1 }
|
|
||||||
nbas,
|
|
||||||
{ parser }
|
|
||||||
scanner
|
|
||||||
// ,rautils
|
|
||||||
;
|
|
||||||
|
|
||||||
function assemble : tnode;
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
Begin
|
|
||||||
end.
|
|
||||||
@ -1,69 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2002 by Florian Klaempfl
|
|
||||||
|
|
||||||
This unit implements the powerpc specific class for the register
|
|
||||||
allocator
|
|
||||||
|
|
||||||
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 rgcpu;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
aasmbase,aasmtai,aasmdata,
|
|
||||||
cpubase,
|
|
||||||
rgobj;
|
|
||||||
|
|
||||||
type
|
|
||||||
trgcpu = class(trgobj)
|
|
||||||
function getcpuregisterint(list: TAsmList; reg: tregister): tregister; override;
|
|
||||||
procedure ungetregisterint(list: TAsmList; reg: tregister); override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
cgobj;
|
|
||||||
|
|
||||||
function trgcpu.getcpuregisterint(list: TAsmList; reg: tregister): tregister;
|
|
||||||
|
|
||||||
begin
|
|
||||||
if reg = R_0 then
|
|
||||||
begin
|
|
||||||
cg.a_reg_alloc(list,reg);
|
|
||||||
result := reg;
|
|
||||||
end
|
|
||||||
else result := inherited getcpuregisterint(list,reg);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure trgcpu.ungetregisterint(list: TAsmList; reg: tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
if reg = R_0 then
|
|
||||||
cg.a_reg_dealloc(list,reg)
|
|
||||||
else
|
|
||||||
inherited ungetregisterint(list,reg);
|
|
||||||
end;
|
|
||||||
|
|
||||||
initialization
|
|
||||||
rg := trgcpu.create;
|
|
||||||
end.
|
|
||||||
@ -1,216 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 2014 by Florian Klaempfl
|
|
||||||
|
|
||||||
Symbol table overrides for Alpha
|
|
||||||
|
|
||||||
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 symcpu;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
symtype,symdef,symsym;
|
|
||||||
|
|
||||||
type
|
|
||||||
{ defs }
|
|
||||||
tcpufiledef = class(tfiledef)
|
|
||||||
end;
|
|
||||||
tcpufiledefclass = class of tcpufiledef;
|
|
||||||
|
|
||||||
tcpuvariantdef = class(tvariantdef)
|
|
||||||
end;
|
|
||||||
tcpuvariantdefclass = class of tcpuvariantdef;
|
|
||||||
|
|
||||||
tcpuformaldef = class(tformaldef)
|
|
||||||
end;
|
|
||||||
tcpuformaldefclass = class of tcpuformaldef;
|
|
||||||
|
|
||||||
tcpuforwarddef = class(tforwarddef)
|
|
||||||
end;
|
|
||||||
tcpuforwarddefclass = class of tcpuforwarddef;
|
|
||||||
|
|
||||||
tcpuundefineddef = class(tundefineddef)
|
|
||||||
end;
|
|
||||||
tcpuundefineddefclass = class of tcpuundefineddef;
|
|
||||||
|
|
||||||
tcpuerrordef = class(terrordef)
|
|
||||||
end;
|
|
||||||
tcpuerrordefclass = class of tcpuerrordef;
|
|
||||||
|
|
||||||
tcpupointerdef = class(tpointerdef)
|
|
||||||
end;
|
|
||||||
tcpupointerdefclass = class of tcpupointerdef;
|
|
||||||
|
|
||||||
tcpurecorddef = class(trecorddef)
|
|
||||||
end;
|
|
||||||
tcpurecorddefclass = class of tcpurecorddef;
|
|
||||||
|
|
||||||
tcpuimplementedinterface = class(timplementedinterface)
|
|
||||||
end;
|
|
||||||
tcpuimplementedinterfaceclass = class of tcpuimplementedinterface;
|
|
||||||
|
|
||||||
tcpuobjectdef = class(tobjectdef)
|
|
||||||
end;
|
|
||||||
tcpuobjectdefclass = class of tcpuobjectdef;
|
|
||||||
|
|
||||||
tcpuclassrefdef = class(tclassrefdef)
|
|
||||||
end;
|
|
||||||
tcpuclassrefdefclass = class of tcpuclassrefdef;
|
|
||||||
|
|
||||||
tcpuarraydef = class(tarraydef)
|
|
||||||
end;
|
|
||||||
tcpuarraydefclass = class of tcpuarraydef;
|
|
||||||
|
|
||||||
tcpuorddef = class(torddef)
|
|
||||||
end;
|
|
||||||
tcpuorddefclass = class of tcpuorddef;
|
|
||||||
|
|
||||||
tcpufloatdef = class(tfloatdef)
|
|
||||||
end;
|
|
||||||
tcpufloatdefclass = class of tcpufloatdef;
|
|
||||||
|
|
||||||
tcpuprocvardef = class(tprocvardef)
|
|
||||||
end;
|
|
||||||
tcpuprocvardefclass = class of tcpuprocvardef;
|
|
||||||
|
|
||||||
tcpuprocdef = class(tprocdef)
|
|
||||||
end;
|
|
||||||
tcpuprocdefclass = class of tcpuprocdef;
|
|
||||||
|
|
||||||
tcpustringdef = class(tstringdef)
|
|
||||||
end;
|
|
||||||
tcpustringdefclass = class of tcpustringdef;
|
|
||||||
|
|
||||||
tcpuenumdef = class(tenumdef)
|
|
||||||
end;
|
|
||||||
tcpuenumdefclass = class of tcpuenumdef;
|
|
||||||
|
|
||||||
tcpusetdef = class(tsetdef)
|
|
||||||
end;
|
|
||||||
tcpusetdefclass = class of tcpusetdef;
|
|
||||||
|
|
||||||
{ syms }
|
|
||||||
tcpulabelsym = class(tlabelsym)
|
|
||||||
end;
|
|
||||||
tcpulabelsymclass = class of tcpulabelsym;
|
|
||||||
|
|
||||||
tcpuunitsym = class(tunitsym)
|
|
||||||
end;
|
|
||||||
tcpuunitsymclass = class of tcpuunitsym;
|
|
||||||
|
|
||||||
tcpuprogramparasym = class(tprogramparasym)
|
|
||||||
end;
|
|
||||||
tcpuprogramparasymclass = class(tprogramparasym);
|
|
||||||
|
|
||||||
tcpunamespacesym = class(tnamespacesym)
|
|
||||||
end;
|
|
||||||
tcpunamespacesymclass = class of tcpunamespacesym;
|
|
||||||
|
|
||||||
tcpuprocsym = class(tprocsym)
|
|
||||||
end;
|
|
||||||
tcpuprocsymclass = class of tcpuprocsym;
|
|
||||||
|
|
||||||
tcputypesym = class(ttypesym)
|
|
||||||
end;
|
|
||||||
tcpuypesymclass = class of tcputypesym;
|
|
||||||
|
|
||||||
tcpufieldvarsym = class(tfieldvarsym)
|
|
||||||
end;
|
|
||||||
tcpufieldvarsymclass = class of tcpufieldvarsym;
|
|
||||||
|
|
||||||
tcpulocalvarsym = class(tlocalvarsym)
|
|
||||||
end;
|
|
||||||
tcpulocalvarsymclass = class of tcpulocalvarsym;
|
|
||||||
|
|
||||||
tcpuparavarsym = class(tparavarsym)
|
|
||||||
end;
|
|
||||||
tcpuparavarsymclass = class of tcpuparavarsym;
|
|
||||||
|
|
||||||
tcpustaticvarsym = class(tstaticvarsym)
|
|
||||||
end;
|
|
||||||
tcpustaticvarsymclass = class of tcpustaticvarsym;
|
|
||||||
|
|
||||||
tcpuabsolutevarsym = class(tabsolutevarsym)
|
|
||||||
end;
|
|
||||||
tcpuabsolutevarsymclass = class of tcpuabsolutevarsym;
|
|
||||||
|
|
||||||
tcpupropertysym = class(tpropertysym)
|
|
||||||
end;
|
|
||||||
tcpupropertysymclass = class of tcpupropertysym;
|
|
||||||
|
|
||||||
tcpuconstsym = class(tconstsym)
|
|
||||||
end;
|
|
||||||
tcpuconstsymclass = class of tcpuconstsym;
|
|
||||||
|
|
||||||
tcpuenumsym = class(tenumsym)
|
|
||||||
end;
|
|
||||||
tcpuenumsymclass = class of tcpuenumsym;
|
|
||||||
|
|
||||||
tcpusyssym = class(tsyssym)
|
|
||||||
end;
|
|
||||||
tcpusyssymclass = class of tcpusyssym;
|
|
||||||
|
|
||||||
|
|
||||||
const
|
|
||||||
pbestrealtype : ^tdef = @s64floattype;
|
|
||||||
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
begin
|
|
||||||
{ used tdef classes }
|
|
||||||
cfiledef:=tcpufiledef;
|
|
||||||
cvariantdef:=tcpuvariantdef;
|
|
||||||
cformaldef:=tcpuformaldef;
|
|
||||||
cforwarddef:=tcpuforwarddef;
|
|
||||||
cundefineddef:=tcpuundefineddef;
|
|
||||||
cerrordef:=tcpuerrordef;
|
|
||||||
cpointerdef:=tcpupointerdef;
|
|
||||||
crecorddef:=tcpurecorddef;
|
|
||||||
cimplementedinterface:=tcpuimplementedinterface;
|
|
||||||
cobjectdef:=tcpuobjectdef;
|
|
||||||
cclassrefdef:=tcpuclassrefdef;
|
|
||||||
carraydef:=tcpuarraydef;
|
|
||||||
corddef:=tcpuorddef;
|
|
||||||
cfloatdef:=tcpufloatdef;
|
|
||||||
cprocvardef:=tcpuprocvardef;
|
|
||||||
cprocdef:=tcpuprocdef;
|
|
||||||
cstringdef:=tcpustringdef;
|
|
||||||
cenumdef:=tcpuenumdef;
|
|
||||||
csetdef:=tcpusetdef;
|
|
||||||
|
|
||||||
{ used tsym classes }
|
|
||||||
clabelsym:=tcpulabelsym;
|
|
||||||
cunitsym:=tcpuunitsym;
|
|
||||||
cprogramparasym:=tcpuprogramparasym;
|
|
||||||
cnamespacesym:=tcpunamespacesym;
|
|
||||||
cprocsym:=tcpuprocsym;
|
|
||||||
ctypesym:=tcputypesym;
|
|
||||||
cfieldvarsym:=tcpufieldvarsym;
|
|
||||||
clocalvarsym:=tcpulocalvarsym;
|
|
||||||
cparavarsym:=tcpuparavarsym;
|
|
||||||
cstaticvarsym:=tcpustaticvarsym;
|
|
||||||
cabsolutevarsym:=tcpuabsolutevarsym;
|
|
||||||
cpropertysym:=tcpupropertysym;
|
|
||||||
cconstsym:=tcpuconstsym;
|
|
||||||
cenumsym:=tcpuenumsym;
|
|
||||||
csyssym:=tcpusyssym;
|
|
||||||
end.
|
|
||||||
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (C) 1998-2000 by Florian Klaempfl
|
|
||||||
|
|
||||||
This unit handles the temporary variables stuff for Alpha
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
****************************************************************************
|
|
||||||
}
|
|
||||||
{
|
|
||||||
This unit handles the temporary variables stuff for Alpha.
|
|
||||||
}
|
|
||||||
unit tgcpu;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
tgobj;
|
|
||||||
|
|
||||||
type
|
|
||||||
ttgalpha = class(ttgobj)
|
|
||||||
end;
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
begin
|
|
||||||
tg:=ttgalpha.create;
|
|
||||||
end.
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,372 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2002 by Jonas Maebe, member of the Free Pascal
|
|
||||||
development team
|
|
||||||
|
|
||||||
This unit contains register renaming functionality
|
|
||||||
|
|
||||||
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 rropt386;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses aasmbase,aasmtai,aasmdata,aasmcpu;
|
|
||||||
|
|
||||||
procedure doRenaming(asml: TAsmList; first, last: tai);
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
{$ifdef replaceregdebug}cutils,{$endif}
|
|
||||||
verbose,globals,cpubase,daopt386,csopt386,rgobj,
|
|
||||||
cgbase,cgutils,cgobj;
|
|
||||||
|
|
||||||
function canBeFirstSwitch(p: taicpu; supreg: tsuperregister): boolean;
|
|
||||||
{ checks whether an operation on reg can be switched to another reg without an }
|
|
||||||
{ additional mov, e.g. "addl $4,%reg1" can be changed to "leal 4(%reg1),%reg2" }
|
|
||||||
begin
|
|
||||||
canBeFirstSwitch := false;
|
|
||||||
case p.opcode of
|
|
||||||
A_MOV,A_MOVZX,A_MOVSX,A_LEA:
|
|
||||||
canBeFirstSwitch :=
|
|
||||||
(p.oper[1]^.typ = top_reg) and
|
|
||||||
(getsupreg(p.oper[1]^.reg) = supreg);
|
|
||||||
A_IMUL:
|
|
||||||
canBeFirstSwitch :=
|
|
||||||
(p.ops >= 2) and
|
|
||||||
(p.oper[0]^.typ = top_const) and
|
|
||||||
(getsupreg(p.oper[p.ops-1]^.reg) = supreg) and
|
|
||||||
(not pTaiprop(p.optinfo)^.FlagsUsed);
|
|
||||||
A_INC,A_DEC:
|
|
||||||
canBeFirstSwitch :=
|
|
||||||
(p.oper[0]^.typ = top_reg) and
|
|
||||||
(p.opsize = S_L) and
|
|
||||||
(not pTaiprop(p.optinfo)^.FlagsUsed);
|
|
||||||
A_SUB,A_ADD:
|
|
||||||
canBeFirstSwitch :=
|
|
||||||
(p.oper[1]^.typ = top_reg) and
|
|
||||||
(p.opsize = S_L) and
|
|
||||||
(getsupreg(p.oper[1]^.reg) = supreg) and
|
|
||||||
(p.oper[0]^.typ <> top_ref) and
|
|
||||||
((p.opcode <> A_SUB) or
|
|
||||||
(p.oper[0]^.typ = top_const)) and
|
|
||||||
(not pTaiprop(p.optinfo)^.FlagsUsed);
|
|
||||||
A_SHL:
|
|
||||||
canBeFirstSwitch :=
|
|
||||||
(p.opsize = S_L) and
|
|
||||||
(p.oper[1]^.typ = top_reg) and
|
|
||||||
(getsupreg(p.oper[1]^.reg) = supreg) and
|
|
||||||
(p.oper[0]^.typ = top_const) and
|
|
||||||
(p.oper[0]^.val in [1,2,3]) and
|
|
||||||
(not pTaiprop(p.optinfo)^.FlagsUsed);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure switchReg(var reg: tregister; reg1, reg2: tsuperregister);
|
|
||||||
var
|
|
||||||
supreg: tsuperregister;
|
|
||||||
begin
|
|
||||||
if (reg = NR_NO) or
|
|
||||||
(getregtype(reg) <> R_INTREGISTER) then
|
|
||||||
exit;
|
|
||||||
supreg := getsupreg(reg);
|
|
||||||
if (supreg = reg1) then
|
|
||||||
setsupreg(reg,reg2)
|
|
||||||
else if (supreg = reg2) then
|
|
||||||
setsupreg(reg,reg1);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure switchOp(var op: toper; reg1, reg2: tsuperregister);
|
|
||||||
begin
|
|
||||||
case op.typ of
|
|
||||||
top_reg:
|
|
||||||
switchReg(op.reg,reg1,reg2);
|
|
||||||
top_ref:
|
|
||||||
begin
|
|
||||||
switchReg(op.ref^.base,reg1,reg2);
|
|
||||||
switchReg(op.ref^.index,reg1,reg2);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure doSwitchReg(hp: taicpu; reg1,reg2: tsuperregister);
|
|
||||||
var
|
|
||||||
opCount: longint;
|
|
||||||
begin
|
|
||||||
for opCount := 0 to hp.ops-1 do
|
|
||||||
switchOp(hp.oper[opCount]^,reg1,reg2);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure doFirstSwitch(p: taicpu; reg1, reg2: tsuperregister);
|
|
||||||
var
|
|
||||||
tmpRef: treference;
|
|
||||||
begin
|
|
||||||
case p.opcode of
|
|
||||||
A_MOV,A_MOVZX,A_MOVSX,A_LEA:
|
|
||||||
begin
|
|
||||||
changeOp(p.oper[1]^,reg1,reg2);
|
|
||||||
changeOp(p.oper[0]^,reg2,reg1);
|
|
||||||
end;
|
|
||||||
A_IMUL:
|
|
||||||
begin
|
|
||||||
p.ops := 3;
|
|
||||||
p.loadreg(2,newreg(R_INTREGISTER,reg2,R_SUBWHOLE));
|
|
||||||
changeOp(p.oper[1]^,reg2,reg1);
|
|
||||||
end;
|
|
||||||
A_INC,A_DEC:
|
|
||||||
begin
|
|
||||||
reference_reset(tmpref,1);
|
|
||||||
tmpref.base := newreg(R_INTREGISTER,reg1,R_SUBWHOLE);
|
|
||||||
case p.opcode of
|
|
||||||
A_INC:
|
|
||||||
tmpref.offset := 1;
|
|
||||||
A_DEC:
|
|
||||||
tmpref.offset := -1;
|
|
||||||
end;
|
|
||||||
p.ops := 2;
|
|
||||||
p.opcode := A_LEA;
|
|
||||||
p.loadreg(1,newreg(R_INTREGISTER,reg2,R_SUBWHOLE));
|
|
||||||
p.loadref(0,tmpref);
|
|
||||||
end;
|
|
||||||
A_SUB,A_ADD:
|
|
||||||
begin
|
|
||||||
reference_reset(tmpref,1);
|
|
||||||
tmpref.base := newreg(R_INTREGISTER,reg1,R_SUBWHOLE);
|
|
||||||
case p.oper[0]^.typ of
|
|
||||||
top_const:
|
|
||||||
begin
|
|
||||||
tmpref.offset := longint(p.oper[0]^.val);
|
|
||||||
if p.opcode = A_SUB then
|
|
||||||
tmpref.offset := - tmpRef.offset;
|
|
||||||
end;
|
|
||||||
top_ref:
|
|
||||||
if (p.oper[0]^.ref^.refaddr=addr_full) then
|
|
||||||
tmpref.symbol := p.oper[0]^.ref^.symbol
|
|
||||||
else
|
|
||||||
internalerror(200402263);
|
|
||||||
top_reg:
|
|
||||||
begin
|
|
||||||
{ "addl %reg2,%reg1" must become "leal (%reg1,%reg1),%reg2" }
|
|
||||||
{ since at this point reg1 holds the value that reg2 would }
|
|
||||||
{ otherwise contain }
|
|
||||||
tmpref.index := p.oper[0]^.reg;
|
|
||||||
if (getsupreg(tmpref.index)=reg2) then
|
|
||||||
setsupreg(tmpref.index,reg1);
|
|
||||||
tmpref.scalefactor := 1;
|
|
||||||
end;
|
|
||||||
else internalerror(200010031);
|
|
||||||
end;
|
|
||||||
p.opcode := A_LEA;
|
|
||||||
p.loadref(0,tmpref);
|
|
||||||
p.loadreg(1,newreg(R_INTREGISTER,reg2,R_SUBWHOLE));
|
|
||||||
end;
|
|
||||||
A_SHL:
|
|
||||||
begin
|
|
||||||
reference_reset(tmpref,2);
|
|
||||||
tmpref.index := newreg(R_INTREGISTER,reg1,R_SUBWHOLE);
|
|
||||||
tmpref.scalefactor := 1 shl p.oper[0]^.val;
|
|
||||||
p.opcode := A_LEA;
|
|
||||||
p.loadref(0,tmpref);
|
|
||||||
p.loadreg(1,newreg(R_INTREGISTER,reg2,R_SUBWHOLE));
|
|
||||||
end;
|
|
||||||
else internalerror(200010032);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
function switchRegs(asml: TAsmList; reg1, reg2: tsuperregister; start: tai): Boolean;
|
|
||||||
{ change movl %reg1,%reg2 ... bla ... to ... bla with reg1 and reg2 switched }
|
|
||||||
var
|
|
||||||
endP, hp, lastreg1,lastreg2: tai;
|
|
||||||
switchDone, switchLast, tmpResult, sequenceEnd, reg1Modified, reg2Modified: boolean;
|
|
||||||
reg1StillUsed, reg2StillUsed, isInstruction: boolean;
|
|
||||||
begin
|
|
||||||
switchRegs := false;
|
|
||||||
tmpResult := true;
|
|
||||||
sequenceEnd := false;
|
|
||||||
reg1Modified := false;
|
|
||||||
reg2Modified := false;
|
|
||||||
switchLast := false;
|
|
||||||
endP := start;
|
|
||||||
while tmpResult and not sequenceEnd do
|
|
||||||
begin
|
|
||||||
tmpResult :=
|
|
||||||
getNextInstruction(endP,endP);
|
|
||||||
If tmpResult and
|
|
||||||
not pTaiprop(endp.optinfo)^.canBeRemoved then
|
|
||||||
begin
|
|
||||||
{ if the newReg gets stored back to the oldReg, we can change }
|
|
||||||
{ "mov %oldReg,%newReg; <operations on %newReg>; mov %newReg, }
|
|
||||||
{ %oldReg" to "<operations on %oldReg>" }
|
|
||||||
switchLast := storeBack(start,endP,reg1,reg2);
|
|
||||||
reg1StillUsed := reg1 in pTaiprop(endp.optinfo)^.usedregs;
|
|
||||||
reg2StillUsed := reg2 in pTaiprop(endp.optinfo)^.usedregs;
|
|
||||||
isInstruction := endp.typ = ait_instruction;
|
|
||||||
sequenceEnd :=
|
|
||||||
switchLast or
|
|
||||||
{ if both registers are released right before an instruction }
|
|
||||||
{ that contains hardcoded regs, it's ok too }
|
|
||||||
(not reg1StillUsed and not reg2StillUsed) or
|
|
||||||
{ no support for (i)div, mul and imul with hardcoded operands }
|
|
||||||
(((not isInstruction) or
|
|
||||||
noHardCodedRegs(taicpu(endP),reg1,reg2)) and
|
|
||||||
(not reg1StillUsed or
|
|
||||||
(isInstruction and findRegDealloc(reg1,endP) and
|
|
||||||
regLoadedWithNewValue(reg1,false,taicpu(endP)))) and
|
|
||||||
(not reg2StillUsed or
|
|
||||||
(isInstruction and findRegDealloc(reg2,endP) and
|
|
||||||
regLoadedWithNewValue(reg2,false,taicpu(endP)))));
|
|
||||||
|
|
||||||
{ we can't switch reg1 and reg2 in something like }
|
|
||||||
{ movl %reg1,%reg2 }
|
|
||||||
{ movl (%reg2),%reg2 }
|
|
||||||
{ movl 4(%reg1),%reg1 }
|
|
||||||
if reg2Modified and not(reg1Modified) and
|
|
||||||
regReadByInstruction(reg1,endP) then
|
|
||||||
begin
|
|
||||||
tmpResult := false;
|
|
||||||
break
|
|
||||||
end;
|
|
||||||
|
|
||||||
if not reg1Modified then
|
|
||||||
begin
|
|
||||||
reg1Modified := regModifiedByInstruction(reg1,endP);
|
|
||||||
if reg1Modified and not canBeFirstSwitch(taicpu(endP),reg1) then
|
|
||||||
begin
|
|
||||||
tmpResult := false;
|
|
||||||
break;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
if not reg2Modified then
|
|
||||||
reg2Modified := regModifiedByInstruction(reg2,endP);
|
|
||||||
|
|
||||||
tmpResult :=
|
|
||||||
((not isInstruction) or
|
|
||||||
(NoHardCodedRegs(taicpu(endP),reg1,reg2) and
|
|
||||||
RegSizesOk(reg1,reg2,taicpu(endP))));
|
|
||||||
|
|
||||||
if sequenceEnd then
|
|
||||||
break;
|
|
||||||
|
|
||||||
tmpResult :=
|
|
||||||
tmpresult and
|
|
||||||
(endp.typ <> ait_label) and
|
|
||||||
((not isInstruction) or
|
|
||||||
(not taicpu(endp).is_jmp));
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if tmpResult and sequenceEnd then
|
|
||||||
begin
|
|
||||||
switchRegs := true;
|
|
||||||
reg1Modified := false;
|
|
||||||
reg2Modified := false;
|
|
||||||
lastreg1 := start;
|
|
||||||
lastreg2 := start;
|
|
||||||
getNextInstruction(start,hp);
|
|
||||||
while hp <> endP do
|
|
||||||
begin
|
|
||||||
if (not pTaiprop(hp.optinfo)^.canberemoved) and
|
|
||||||
(hp.typ = ait_instruction) then
|
|
||||||
begin
|
|
||||||
switchDone := false;
|
|
||||||
if not reg1Modified then
|
|
||||||
begin
|
|
||||||
reg1Modified := regModifiedByInstruction(reg1,hp);
|
|
||||||
if reg1Modified then
|
|
||||||
begin
|
|
||||||
doFirstSwitch(taicpu(hp),reg1,reg2);
|
|
||||||
switchDone := true;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
if not switchDone then
|
|
||||||
if reg1Modified then
|
|
||||||
doSwitchReg(taicpu(hp),reg1,reg2)
|
|
||||||
else
|
|
||||||
doReplaceReg(taicpu(hp),reg2,reg1);
|
|
||||||
end;
|
|
||||||
if regininstruction(reg1,hp) then
|
|
||||||
lastreg1 := hp;
|
|
||||||
if regininstruction(reg2,hp) then
|
|
||||||
lastreg2 := hp;
|
|
||||||
getNextInstruction(hp,hp);
|
|
||||||
end;
|
|
||||||
if switchLast then
|
|
||||||
begin
|
|
||||||
lastreg1 := hp;
|
|
||||||
lastreg2 := hp;
|
|
||||||
{ this is in case of a storeback, make sure the same size of register }
|
|
||||||
{ contents as the initial move is transfered }
|
|
||||||
doSwitchReg(taicpu(hp),reg1,reg2);
|
|
||||||
if taicpu(hp).opsize <> taicpu(start).opsize then
|
|
||||||
begin
|
|
||||||
taicpu(hp).opsize := taicpu(start).opsize;
|
|
||||||
taicpu(hp).oper[0]^.reg := taicpu(start).oper[0]^.reg;
|
|
||||||
taicpu(hp).oper[1]^.reg := taicpu(start).oper[1]^.reg;
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
else
|
|
||||||
getLastInstruction(hp,hp);
|
|
||||||
allocRegBetween(asmL,newreg(R_INTREGISTER,reg1,R_SUBWHOLE),start,lastreg1,
|
|
||||||
ptaiprop(start.optinfo)^.usedregs);
|
|
||||||
allocRegBetween(asmL,newreg(R_INTREGISTER,reg2,R_SUBWHOLE),start,lastreg2,
|
|
||||||
ptaiprop(start.optinfo)^.usedregs);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure doRenaming(asml: TAsmList; first, last: tai);
|
|
||||||
var
|
|
||||||
p: tai;
|
|
||||||
begin
|
|
||||||
p := First;
|
|
||||||
SkipHead(p);
|
|
||||||
while p <> last do
|
|
||||||
begin
|
|
||||||
case p.typ of
|
|
||||||
ait_instruction:
|
|
||||||
begin
|
|
||||||
case taicpu(p).opcode of
|
|
||||||
A_MOV:
|
|
||||||
begin
|
|
||||||
if not(pTaiprop(p.optinfo)^.canBeRemoved) and
|
|
||||||
(taicpu(p).oper[0]^.typ = top_reg) and
|
|
||||||
(taicpu(p).oper[1]^.typ = top_reg) and
|
|
||||||
(taicpu(p).opsize = S_L) and
|
|
||||||
(getsupreg(taicpu(p).oper[0]^.reg) in ([RS_EAX,RS_EBX,RS_ECX,RS_EDX,RS_ESI,RS_EDI])) and
|
|
||||||
(getsupreg(taicpu(p).oper[1]^.reg) in ([RS_EAX,RS_EBX,RS_ECX,RS_EDX,RS_ESI,RS_EDI])) then
|
|
||||||
if switchRegs(asml,getsupreg(taicpu(p).oper[0]^.reg),
|
|
||||||
getsupreg(taicpu(p).oper[1]^.reg),p) then
|
|
||||||
begin
|
|
||||||
pTaiprop(p.optinfo)^.canBeRemoved := true;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
getNextInstruction(p,p);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
End.
|
|
||||||
@ -1,287 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 2000-2006 by Florian Klaempfl
|
|
||||||
|
|
||||||
Contains the assembler object for the ia64
|
|
||||||
|
|
||||||
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 aasmcpu;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
globals,verbose,
|
|
||||||
aasmbase,aasmtai,
|
|
||||||
cpubase,
|
|
||||||
cgutils;
|
|
||||||
|
|
||||||
|
|
||||||
type
|
|
||||||
pairegalloc = ^tairegalloc;
|
|
||||||
tairegalloc = class(tai)
|
|
||||||
allocation : boolean;
|
|
||||||
reg : tregister;
|
|
||||||
constructor alloc(r : tregister);
|
|
||||||
constructor dealloc(r : tregister);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ Types of operand }
|
|
||||||
toptype=(top_none,top_reg,top_ref,top_const,top_symbol,top_qp);
|
|
||||||
|
|
||||||
paicpu = ^taicpu;
|
|
||||||
taicpu = class(tai)
|
|
||||||
is_jmp : boolean; { is this instruction a jump? (needed for optimizer) }
|
|
||||||
opcode : tasmop;
|
|
||||||
ops : array[0..4] of longint;
|
|
||||||
oper : longint;
|
|
||||||
qp : tqp;
|
|
||||||
ldsttype : tldsttype;
|
|
||||||
hint : thint;
|
|
||||||
{ ALU instructions }
|
|
||||||
{ A1,A9: integer ALU }
|
|
||||||
constructor op_reg_reg_reg(op : tasmop;const r1,r2,r3 : tregister);
|
|
||||||
{ A2,A10: shift left and add }
|
|
||||||
constructor op_reg_reg_const_reg(_qp : tqp;op : tasmop;
|
|
||||||
const r1,r2 : tregister;i : byte;const r3 : tregister);
|
|
||||||
{ A3,A4,A5: integer ALU - imm.,register }
|
|
||||||
constructor op_reg_const_reg(_qp : tqp;op : tasmop;
|
|
||||||
const r1 : tregister;i : longint;const r3 : tregister);
|
|
||||||
{ A6,A7: integer compare - register,register }
|
|
||||||
constructor op_preg_preg_reg_reg(_qp : tqp;op : tasmop;
|
|
||||||
cond : tasmcond;p1,p2 : tqp;const r2,r3 : tregister);
|
|
||||||
{ A8: integer compare - imm.,register }
|
|
||||||
constructor op_preg_preg_const_reg(_qp : tqp;op : tasmop;
|
|
||||||
cond : tasmcond;p1,p2 : tqp;i : longint;const r3 : tregister);
|
|
||||||
(*!!!!!!!
|
|
||||||
{ multimedia shift and multiply }
|
|
||||||
constructor op_reg_reg_reg_const(_qp : tqp;
|
|
||||||
{ multimedia mux }
|
|
||||||
constructor op_reg_reg_mbtype(_qp : tqp;
|
|
||||||
{ multimedia shift fixed }
|
|
||||||
constructor op_reg_reg_const(_qp : tqp;
|
|
||||||
{ div. }
|
|
||||||
constructor op_reg_reg(_qp : tqp;
|
|
||||||
{ mm extract }
|
|
||||||
constructor op_reg_reg_const_const(_qp : tqp;
|
|
||||||
{ zero and deposit imm }
|
|
||||||
constructor op_reg_const_const_const(_qp : tqp;
|
|
||||||
{ deposit imm }
|
|
||||||
constructor op_reg_const_reg_const_const(_qp : tqp;
|
|
||||||
{ deposit }
|
|
||||||
constructor op_reg_reg_reg_const_const(_qp : tqp;
|
|
||||||
{ test bit }
|
|
||||||
{ !!!! here we need also to take care of the postfix }
|
|
||||||
constructor op_preg_preg_reg_const(_qp : tqp;
|
|
||||||
{ test NaT }
|
|
||||||
{ !!!! here we need also to take care of the postfix }
|
|
||||||
constructor op_preg_preg_reg(_qp : tqp;
|
|
||||||
|
|
||||||
{ -------- here are some missed ----------- }
|
|
||||||
*)
|
|
||||||
|
|
||||||
{ M1: integer load }
|
|
||||||
{ M4: integer store }
|
|
||||||
{ M6: floating-point load }
|
|
||||||
{ M9: floating-point store }
|
|
||||||
constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
|
|
||||||
_hint : thint;const r1 : tregister;ref : treference);
|
|
||||||
|
|
||||||
{ M2: integer load incremented by register }
|
|
||||||
{ M7: floating-point load incremented by register }
|
|
||||||
constructor op_reg_ref_reg(_qp : tqp;op : tasmop;postfix : tldsttype;
|
|
||||||
_hint : thint;const r1 : tregister;const ref : treference;
|
|
||||||
const r2 : tregister);
|
|
||||||
|
|
||||||
{ M3: integer load increment by imm. }
|
|
||||||
{ M5: integer store increment by imm. }
|
|
||||||
{ M8: floating-point load increment by imm. }
|
|
||||||
{ M10: floating-point store increment by imm. }
|
|
||||||
constructor op_reg_ref_const(_qp : tqp;op : tasmop;postfix : tldsttype;
|
|
||||||
_hint : thint;const r1 : tregister;ref : treference;i : longint);
|
|
||||||
|
|
||||||
{ M11: floating-point load pair}
|
|
||||||
constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
|
|
||||||
_hint : thint;const r1,r2 : tregister;ref : treference);
|
|
||||||
|
|
||||||
{ M12: floating-point load pair increment by imm. }
|
|
||||||
constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
|
|
||||||
_hint : thint;const r1,r2 : tregister;ref : treference;i : longint);
|
|
||||||
|
|
||||||
{ X1: break/nop }
|
|
||||||
constructor op_const62(_qp : tqp;op : tasmop;i : int64);
|
|
||||||
{ X2: move imm64 }
|
|
||||||
constructor op_reg_const64(_qp : tqp;op : tasmop;const r1 : tregister;
|
|
||||||
i : int64);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ the following objects are special for the ia64 }
|
|
||||||
{ they decribe a stop and the bundles }
|
|
||||||
paistop = ^taistop;
|
|
||||||
taistop = class(tai)
|
|
||||||
constructor init;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ a second underscro indicates a stop }
|
|
||||||
tbundletemplate = (but_none,but_mii,but_mii_,
|
|
||||||
but_mi_i,but_mi_i_,but_mlx,but_mlx_,
|
|
||||||
but_mmi,but_mmi_,but_m_mi,but_m_mi_,
|
|
||||||
but_mfi,but_mfi_,but_mmf,but_mmf_,
|
|
||||||
but_mif,but_mib_,but_mbb,but_mbb_,
|
|
||||||
but_bbb,but_bbb_,but_mmb,but_mmb_,
|
|
||||||
but_mfb,but_mfb_);
|
|
||||||
|
|
||||||
paibundle = ^taibundle;
|
|
||||||
taibundle = class(tai)
|
|
||||||
template : tbundletemplate;
|
|
||||||
instructions : array[0..1] of paicpu;
|
|
||||||
end;
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
TaiStop
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
constructor taistop.init;
|
|
||||||
|
|
||||||
begin
|
|
||||||
inherited create;
|
|
||||||
typ:=ait_stop;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
TaiRegAlloc
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
constructor tairegalloc.alloc(r : tregister);
|
|
||||||
begin
|
|
||||||
inherited create;
|
|
||||||
typ:=ait_regalloc;
|
|
||||||
allocation:=true;
|
|
||||||
reg:=r;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor tairegalloc.dealloc(r : tregister);
|
|
||||||
begin
|
|
||||||
inherited create;
|
|
||||||
typ:=ait_regalloc;
|
|
||||||
allocation:=false;
|
|
||||||
reg:=r;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Taicpu
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
{ ALU instructions }
|
|
||||||
{ A1,A9: integer ALU }
|
|
||||||
constructor taicpu.op_reg_reg_reg(op : tasmop;const r1,r2,r3 : tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ A2,A10: shift left and add }
|
|
||||||
constructor taicpu.op_reg_reg_const_reg(_qp : tqp;op : tasmop;
|
|
||||||
const r1,r2 : tregister;i : byte;const r3 : tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ A3,A4,A5: integer ALU - imm.,register }
|
|
||||||
constructor taicpu.op_reg_const_reg(_qp : tqp;op : tasmop;
|
|
||||||
const r1 : tregister;i : longint;const r3 : tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ A6,A7: integer compare - register,register }
|
|
||||||
constructor taicpu.op_preg_preg_reg_reg(_qp : tqp;op : tasmop;
|
|
||||||
cond : tasmcond;p1,p2 : tqp;const r2,r3 : tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ A8: integer compare - imm.,register }
|
|
||||||
constructor taicpu.op_preg_preg_const_reg(_qp : tqp;op : tasmop;
|
|
||||||
cond : tasmcond;p1,p2 : tqp;i : longint;const r3 : tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ M1: integer load }
|
|
||||||
{ M4: integer store }
|
|
||||||
{ M6: floating-point load }
|
|
||||||
{ M9: floating-point store }
|
|
||||||
constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
|
|
||||||
_hint : thint;const r1 : tregister;ref : treference);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ M2: integer load incremented by register }
|
|
||||||
{ M7: floating-point load incremented by register }
|
|
||||||
constructor taicpu.op_reg_ref_reg(_qp : tqp;op : tasmop;postfix : tldsttype;
|
|
||||||
_hint : thint;const r1 : tregister;const ref : treference;
|
|
||||||
const r2 : tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ M3: integer load increment by imm. }
|
|
||||||
{ M5: integer store increment by imm. }
|
|
||||||
{ M8: floating-point load increment by imm. }
|
|
||||||
{ M10: floating-point store increment by imm. }
|
|
||||||
constructor taicpu.op_reg_ref_const(_qp : tqp;op : tasmop;postfix : tldsttype;
|
|
||||||
_hint : thint;const r1 : tregister;ref : treference;i : longint);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ M11: floating-point load pair}
|
|
||||||
constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
|
|
||||||
_hint : thint;const r1,r2 : tregister;ref : treference);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ M12: floating-point load pair increment by imm. }
|
|
||||||
constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
|
|
||||||
_hint : thint;const r1,r2 : tregister;ref : treference;i : longint);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ X1: break/nop }
|
|
||||||
constructor taicpu.op_const62(_qp : tqp;op : tasmop;i : int64);
|
|
||||||
{ X2: move imm64 }
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_const64(_qp : tqp;op : tasmop;const r1 : tregister;
|
|
||||||
i : int64);
|
|
||||||
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,150 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (C) 2000-2006 by Florian Klaempfl
|
|
||||||
|
|
||||||
this unit implements the base types for the iA-64 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 cpubase;
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
cutils,
|
|
||||||
globals,
|
|
||||||
systems,
|
|
||||||
cpuinfo,
|
|
||||||
cgbase;
|
|
||||||
|
|
||||||
type
|
|
||||||
tasmop = (A_ADD,A_SUB,A_ADDP4,A_AND,A_ANDCM,A_OR,A_XOR,A_SHLADD,
|
|
||||||
A_SHLADDP4,A_ADDS,A_ADDL,A_CMP,A_CMP4,A_PADD1,A_PADD2,
|
|
||||||
A_PADD4,A_PSUB1,A_PSUB2,A_PSUB4,A_PAVG1,A_PAVG2,A_PAVGSUB1,
|
|
||||||
A_PAVGSUB2,A_PCMP1,A_PCMP2,A_PCMP4,A_PSHLADD2,A_PSHRADD2,
|
|
||||||
A_PMPY2,A_MIX1,A_MIX2,A_MIX4,A_PACK2,A_PACK4,A_UNPACK2,
|
|
||||||
A_UNPACK4,A_PMIN1,A_PMAX1,A_PMIN2,A_PMAX2,A_PSAD1,A_MUX1,
|
|
||||||
A_MUX2,A_PSHR2,A_PSHR4,A_SHR,A_PSHL2,A_SHL4,A_SHL,
|
|
||||||
A_POPCNT,A_SHRP,A_EXTR,A_DEP,A_TBIT,A_TNAT,A_BREAK,
|
|
||||||
A_NOP,A_CHK,A_MOV,A_ZX1,A_ZX2,A_ZXT4,A_SXT1,A_SXT2,A_SXT4,
|
|
||||||
A_CXZ1,A_CZX2,A_LD1,A_LD2,A_LD4,A_LD8,A_ST1,A_ST2,A_ST4,
|
|
||||||
A_ST8,A_LDFS,A_LDFD,A_LDF8,A_LDFE,A_LDF,A_STFS,A_STFD,A_STF8,
|
|
||||||
A_STFE,A_STF,A_LDFPS,A_LDFPD,A_LDFP8,A_LFETCH,A_CMPXCHG1,
|
|
||||||
A_CMPXCHG2,A_CMPXHG4,A_CMPXCHG8,A_XCHG1,A_XCHG2,A_XCHG4,
|
|
||||||
A_XCHG8,A_FETCHADD4,A_FETCHADD8,A_SETF,A_GETF,
|
|
||||||
A_INVALA,A_MF,A_SRLZ,A_SYNC,A_FLUSHRS,A_FC,A_ALLOC,A_SUM,
|
|
||||||
A_RUM,A_BR,A_CLRRRB,A_FMA,A_FPMA,A_FMS,A_FPMS,A_FNMA,A_FPNMA,
|
|
||||||
A_XMA,A_FSELECT,A_FCLASS,A_FRCPA,A_FPRCPA,A_FRSQRTA,
|
|
||||||
A_FPRSQRTA,A_FMIN,A_FMAX,A_FAMIN,A_FAMAX,A_FPMIN,A_FPMAX,
|
|
||||||
A_FPAMIN,A_FPAMAX,A_FPCMP,A_FMERGE,A_FMIX,A_FSXT,A_FPACK,
|
|
||||||
A_FSWAP,A_FAND,A_FANDCM,A_FOR,A_FXOR,A_FPMERGE,A_FCVT,
|
|
||||||
A_FPCVT,A_FSETC,A_FCLRT,A_FCHKF,A_MOVL);
|
|
||||||
|
|
||||||
Const
|
|
||||||
firstop = low(tasmop);
|
|
||||||
lastop = high(tasmop);
|
|
||||||
|
|
||||||
type
|
|
||||||
TAsmCond = (C_NONE,C_LT,C_LTU,C_EQ,C_LT_UNC,C_LTU_UNC,C_EQ_UNC,
|
|
||||||
C_EQ_AND,C_EQ_OR,C_EQ_OR_ANDCM,C_NE_AND,C_NE_OR);
|
|
||||||
|
|
||||||
THint = (H_NONE,H_NT1,H_NT2,H_NTA);
|
|
||||||
TLdStType = (LST_NONE,LST_S,LST_A,LSR_SA,LST_BIAS,LST_ACQ,LST_C_CLR,
|
|
||||||
LST_FILL,LST_C_NC,LST_C_CLR_ACQ,LST_REL,
|
|
||||||
LST_SPILL);
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Flags
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
type
|
|
||||||
TResFlags = (F_NONE,F_LT,F_LTU,F_EQ,F_LT_UNC,F_LTU_UNC,F_EQ_UNC,
|
|
||||||
F_EQ_AND,F_EQ_OR,F_EQ_OR_ANDCM,F_NE_AND,F_NE_OR);
|
|
||||||
|
|
||||||
Type
|
|
||||||
TRegister = (R_NO, { R_NO is Mandatory, signifies no register }
|
|
||||||
R_0,R_1,R_2,R_3,R_4,R_5,R_6,R_7,R_8,R_9,
|
|
||||||
R_10,R_11,R_12,R_13,R_14,R_15,R_16,R_17,R_18,R_19,
|
|
||||||
R_20,R_21,R_22,R_23,R_24,R_25,R_26,R_27,R_28,R_29,
|
|
||||||
R_30,R_31,
|
|
||||||
R_F0,R_F1,R_F2,R_F3,R_F4,R_F5,R_F6,R_F7,R_F8,R_F9,
|
|
||||||
R_F10,R_F11,R_F12,R_F13,R_F14,R_F15,R_F16,R_F17,R_F18,R_F19,
|
|
||||||
R_F20,R_F21,R_F22,R_F23,R_F24,R_F25,R_F26,R_F27,R_F28,R_F29,
|
|
||||||
R_F30,R_F31);
|
|
||||||
|
|
||||||
TRegisterset = Set of TRegister;
|
|
||||||
|
|
||||||
{ -1 indicates no qualifying prediction }
|
|
||||||
tqp = -1..63;
|
|
||||||
|
|
||||||
const
|
|
||||||
qp_none : tqp = -1;
|
|
||||||
|
|
||||||
{ Constants describing the registers }
|
|
||||||
|
|
||||||
Const
|
|
||||||
intregs = [R_0..R_31];
|
|
||||||
fpuregs = [R_F0..R_F31];
|
|
||||||
mmregs = [];
|
|
||||||
|
|
||||||
maxvarregs = 128;
|
|
||||||
maxfpuvarregs = 128;
|
|
||||||
|
|
||||||
max_operands = 4;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Default generic sizes
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
{ Defines the default address size for a processor, }
|
|
||||||
OS_ADDR = OS_64;
|
|
||||||
{ the natural int size for a processor,
|
|
||||||
has to match osuinttype/ossinttype as initialized in psystem }
|
|
||||||
OS_INT = OS_64;
|
|
||||||
OS_SINT = OS_S64;
|
|
||||||
{ the maximum float size for a processor, }
|
|
||||||
OS_FLOAT = OS_F80;
|
|
||||||
{ the size of a vector register for a processor }
|
|
||||||
OS_VECTOR = OS_M128;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
GCC /ABI linking information
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
{# Registers which must be saved when calling a routine declared as
|
|
||||||
cppdecl, cdecl, stdcall, safecall, palmossyscall. The registers
|
|
||||||
saved should be the ones as defined in the target ABI and / or GCC.
|
|
||||||
|
|
||||||
This value can be deduced from CALLED_USED_REGISTERS array in the
|
|
||||||
GCC source.
|
|
||||||
}
|
|
||||||
std_saved_registers = [R_9..R_14,R_F2..R_F9];
|
|
||||||
{# Required parameter alignment when calling a routine declared as
|
|
||||||
stdcall and cdecl. The alignment value should be the one defined
|
|
||||||
by GCC or the target ABI.
|
|
||||||
|
|
||||||
The value of this constant is equal to the constant
|
|
||||||
PARM_BOUNDARY / BITS_PER_UNIT in the GCC source.
|
|
||||||
}
|
|
||||||
std_param_align = 8;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Opcode propeties (needed for optimizer)
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,105 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2006 by Florian Klaempfl
|
|
||||||
|
|
||||||
Basic Processor information
|
|
||||||
|
|
||||||
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 cpuinfo;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
Interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
globtype;
|
|
||||||
|
|
||||||
Type
|
|
||||||
bestreal = extended;
|
|
||||||
{$if FPC_FULLVERSION>20700}
|
|
||||||
bestrealrec = TExtended80Rec;
|
|
||||||
{$endif FPC_FULLVERSION>20700}
|
|
||||||
ts32real = single;
|
|
||||||
ts64real = double;
|
|
||||||
ts80real = extended;
|
|
||||||
ts128real = type extended;
|
|
||||||
ts64comp = type extended;
|
|
||||||
|
|
||||||
pbestreal=^bestreal;
|
|
||||||
|
|
||||||
{ possible supported processors for this target }
|
|
||||||
tcputype =
|
|
||||||
(cpu_none,
|
|
||||||
cpu_itanium
|
|
||||||
);
|
|
||||||
|
|
||||||
tfputype =
|
|
||||||
(fpu_none,
|
|
||||||
fpu_itanium
|
|
||||||
);
|
|
||||||
|
|
||||||
tcontrollertype =
|
|
||||||
(ct_none
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Const
|
|
||||||
{ Is there support for dealing with multiple microcontrollers available }
|
|
||||||
{ for this platform? }
|
|
||||||
ControllerSupport = false;
|
|
||||||
|
|
||||||
{ We know that there are fields after sramsize
|
|
||||||
but we don't care about this warning }
|
|
||||||
{$PUSH}
|
|
||||||
{$WARN 3177 OFF}
|
|
||||||
embedded_controllers : array [tcontrollertype] of tcontrollerdatatype =
|
|
||||||
(
|
|
||||||
(controllertypestr:''; controllerunitstr:''; flashbase:0; flashsize:0; srambase:0; sramsize:0));
|
|
||||||
{$POP}
|
|
||||||
|
|
||||||
{ calling conventions supported by the code generator }
|
|
||||||
supported_calling_conventions : tproccalloptions = [
|
|
||||||
pocall_internproc,
|
|
||||||
pocall_stdcall,
|
|
||||||
pocall_cdecl,
|
|
||||||
pocall_cppdecl
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
cputypestr : array[tcputype] of string[10] = ('',
|
|
||||||
'ITANIUM'
|
|
||||||
);
|
|
||||||
|
|
||||||
fputypestr : array[tfputype] of string[6] = ('',
|
|
||||||
'ITANIUM'
|
|
||||||
);
|
|
||||||
|
|
||||||
{ Supported optimizations, only used for information }
|
|
||||||
supported_optimizerswitches = [cs_opt_peephole,cs_opt_regvar,cs_opt_stackframe,
|
|
||||||
cs_opt_asmcse,cs_opt_loopunroll,cs_opt_uncertain,
|
|
||||||
cs_opt_nodecse];
|
|
||||||
|
|
||||||
level1optimizerswitches = [cs_opt_level1,cs_opt_peephole];
|
|
||||||
level2optimizerswitches = level1optimizerswitches +
|
|
||||||
[cs_opt_level2,cs_opt_regvar,cs_opt_stackframe,cs_opt_asmcse,cs_opt_nodecse];
|
|
||||||
level3optimizerswitches = level2optimizerswitches + [cs_opt_level3{,cs_opt_loopunroll}];
|
|
||||||
level4optimizerswitches = genericlevel4optimizerswitches + level3optimizerswitches + [];
|
|
||||||
|
|
||||||
Implementation
|
|
||||||
|
|
||||||
end.
|
|
||||||
|
|
||||||
@ -1,268 +0,0 @@
|
|||||||
;
|
|
||||||
; iA-64 registers
|
|
||||||
; This file is generate with help of fpc/compiler/utils/gia64reg,
|
|
||||||
; please try to use this generator before you do error prone and tedious
|
|
||||||
; editing by hand
|
|
||||||
;
|
|
||||||
; layout
|
|
||||||
; <name>,<type>,<value>,<stdname>,<gasname>
|
|
||||||
;
|
|
||||||
NO,$00,$00,INVALID,INVALID
|
|
||||||
|
|
||||||
R0,$01,0,r0,r0
|
|
||||||
R1,$01,1,r1,r1
|
|
||||||
R2,$01,2,r2,r2
|
|
||||||
R3,$01,3,r3,r3
|
|
||||||
R4,$01,4,r4,r4
|
|
||||||
R5,$01,5,r5,r5
|
|
||||||
R6,$01,6,r6,r6
|
|
||||||
R7,$01,7,r7,r7
|
|
||||||
R8,$01,8,r8,r8
|
|
||||||
R9,$01,9,r9,r9
|
|
||||||
R10,$01,10,r10,r10
|
|
||||||
R11,$01,11,r11,r11
|
|
||||||
R12,$01,12,r12,r12
|
|
||||||
R13,$01,13,r13,r13
|
|
||||||
R14,$01,14,r14,r14
|
|
||||||
R15,$01,15,r15,r15
|
|
||||||
R16,$01,16,r16,r16
|
|
||||||
R17,$01,17,r17,r17
|
|
||||||
R18,$01,18,r18,r18
|
|
||||||
R19,$01,19,r19,r19
|
|
||||||
R20,$01,20,r20,r20
|
|
||||||
R21,$01,21,r21,r21
|
|
||||||
R22,$01,22,r22,r22
|
|
||||||
R23,$01,23,r23,r23
|
|
||||||
R24,$01,24,r24,r24
|
|
||||||
R25,$01,25,r25,r25
|
|
||||||
R26,$01,26,r26,r26
|
|
||||||
R27,$01,27,r27,r27
|
|
||||||
R28,$01,28,r28,r28
|
|
||||||
R29,$01,29,r29,r29
|
|
||||||
R30,$01,30,r30,r30
|
|
||||||
R31,$01,31,r31,r31
|
|
||||||
R32,$01,32,r32,r32
|
|
||||||
R33,$01,33,r33,r33
|
|
||||||
R34,$01,34,r34,r34
|
|
||||||
R35,$01,35,r35,r35
|
|
||||||
R36,$01,36,r36,r36
|
|
||||||
R37,$01,37,r37,r37
|
|
||||||
R38,$01,38,r38,r38
|
|
||||||
R39,$01,39,r39,r39
|
|
||||||
R40,$01,40,r40,r40
|
|
||||||
R41,$01,41,r41,r41
|
|
||||||
R42,$01,42,r42,r42
|
|
||||||
R43,$01,43,r43,r43
|
|
||||||
R44,$01,44,r44,r44
|
|
||||||
R45,$01,45,r45,r45
|
|
||||||
R46,$01,46,r46,r46
|
|
||||||
R47,$01,47,r47,r47
|
|
||||||
R48,$01,48,r48,r48
|
|
||||||
R49,$01,49,r49,r49
|
|
||||||
R50,$01,50,r50,r50
|
|
||||||
R51,$01,51,r51,r51
|
|
||||||
R52,$01,52,r52,r52
|
|
||||||
R53,$01,53,r53,r53
|
|
||||||
R54,$01,54,r54,r54
|
|
||||||
R55,$01,55,r55,r55
|
|
||||||
R56,$01,56,r56,r56
|
|
||||||
R57,$01,57,r57,r57
|
|
||||||
R58,$01,58,r58,r58
|
|
||||||
R59,$01,59,r59,r59
|
|
||||||
R60,$01,60,r60,r60
|
|
||||||
R61,$01,61,r61,r61
|
|
||||||
R62,$01,62,r62,r62
|
|
||||||
R63,$01,63,r63,r63
|
|
||||||
R64,$01,64,r64,r64
|
|
||||||
R65,$01,65,r65,r65
|
|
||||||
R66,$01,66,r66,r66
|
|
||||||
R67,$01,67,r67,r67
|
|
||||||
R68,$01,68,r68,r68
|
|
||||||
R69,$01,69,r69,r69
|
|
||||||
R70,$01,70,r70,r70
|
|
||||||
R71,$01,71,r71,r71
|
|
||||||
R72,$01,72,r72,r72
|
|
||||||
R73,$01,73,r73,r73
|
|
||||||
R74,$01,74,r74,r74
|
|
||||||
R75,$01,75,r75,r75
|
|
||||||
R76,$01,76,r76,r76
|
|
||||||
R77,$01,77,r77,r77
|
|
||||||
R78,$01,78,r78,r78
|
|
||||||
R79,$01,79,r79,r79
|
|
||||||
R80,$01,80,r80,r80
|
|
||||||
R81,$01,81,r81,r81
|
|
||||||
R82,$01,82,r82,r82
|
|
||||||
R83,$01,83,r83,r83
|
|
||||||
R84,$01,84,r84,r84
|
|
||||||
R85,$01,85,r85,r85
|
|
||||||
R86,$01,86,r86,r86
|
|
||||||
R87,$01,87,r87,r87
|
|
||||||
R88,$01,88,r88,r88
|
|
||||||
R89,$01,89,r89,r89
|
|
||||||
R90,$01,90,r90,r90
|
|
||||||
R91,$01,91,r91,r91
|
|
||||||
R92,$01,92,r92,r92
|
|
||||||
R93,$01,93,r93,r93
|
|
||||||
R94,$01,94,r94,r94
|
|
||||||
R95,$01,95,r95,r95
|
|
||||||
R96,$01,96,r96,r96
|
|
||||||
R97,$01,97,r97,r97
|
|
||||||
R98,$01,98,r98,r98
|
|
||||||
R99,$01,99,r99,r99
|
|
||||||
R100,$01,100,r100,r100
|
|
||||||
R101,$01,101,r101,r101
|
|
||||||
R102,$01,102,r102,r102
|
|
||||||
R103,$01,103,r103,r103
|
|
||||||
R104,$01,104,r104,r104
|
|
||||||
R105,$01,105,r105,r105
|
|
||||||
R106,$01,106,r106,r106
|
|
||||||
R107,$01,107,r107,r107
|
|
||||||
R108,$01,108,r108,r108
|
|
||||||
R109,$01,109,r109,r109
|
|
||||||
R110,$01,110,r110,r110
|
|
||||||
R111,$01,111,r111,r111
|
|
||||||
R112,$01,112,r112,r112
|
|
||||||
R113,$01,113,r113,r113
|
|
||||||
R114,$01,114,r114,r114
|
|
||||||
R115,$01,115,r115,r115
|
|
||||||
R116,$01,116,r116,r116
|
|
||||||
R117,$01,117,r117,r117
|
|
||||||
R118,$01,118,r118,r118
|
|
||||||
R119,$01,119,r119,r119
|
|
||||||
R120,$01,120,r120,r120
|
|
||||||
R121,$01,121,r121,r121
|
|
||||||
R122,$01,122,r122,r122
|
|
||||||
R123,$01,123,r123,r123
|
|
||||||
R124,$01,124,r124,r124
|
|
||||||
R125,$01,125,r125,r125
|
|
||||||
R126,$01,126,r126,r126
|
|
||||||
R127,$01,127,r127,r127
|
|
||||||
|
|
||||||
F0,$02,0,r0,r0
|
|
||||||
F1,$02,1,r1,r1
|
|
||||||
F2,$02,2,r2,r2
|
|
||||||
F3,$02,3,r3,r3
|
|
||||||
F4,$02,4,r4,r4
|
|
||||||
F5,$02,5,r5,r5
|
|
||||||
F6,$02,6,r6,r6
|
|
||||||
F7,$02,7,r7,r7
|
|
||||||
F8,$02,8,r8,r8
|
|
||||||
F9,$02,9,r9,r9
|
|
||||||
F10,$02,10,r10,r10
|
|
||||||
F11,$02,11,r11,r11
|
|
||||||
F12,$02,12,r12,r12
|
|
||||||
F13,$02,13,r13,r13
|
|
||||||
F14,$02,14,r14,r14
|
|
||||||
F15,$02,15,r15,r15
|
|
||||||
F16,$02,16,r16,r16
|
|
||||||
F17,$02,17,r17,r17
|
|
||||||
F18,$02,18,r18,r18
|
|
||||||
F19,$02,19,r19,r19
|
|
||||||
F20,$02,20,r20,r20
|
|
||||||
F21,$02,21,r21,r21
|
|
||||||
F22,$02,22,r22,r22
|
|
||||||
F23,$02,23,r23,r23
|
|
||||||
F24,$02,24,r24,r24
|
|
||||||
F25,$02,25,r25,r25
|
|
||||||
F26,$02,26,r26,r26
|
|
||||||
F27,$02,27,r27,r27
|
|
||||||
F28,$02,28,r28,r28
|
|
||||||
F29,$02,29,r29,r29
|
|
||||||
F30,$02,30,r30,r30
|
|
||||||
F31,$02,31,r31,r31
|
|
||||||
F32,$02,32,r32,r32
|
|
||||||
F33,$02,33,r33,r33
|
|
||||||
F34,$02,34,r34,r34
|
|
||||||
F35,$02,35,r35,r35
|
|
||||||
F36,$02,36,r36,r36
|
|
||||||
F37,$02,37,r37,r37
|
|
||||||
F38,$02,38,r38,r38
|
|
||||||
F39,$02,39,r39,r39
|
|
||||||
F40,$02,40,r40,r40
|
|
||||||
F41,$02,41,r41,r41
|
|
||||||
F42,$02,42,r42,r42
|
|
||||||
F43,$02,43,r43,r43
|
|
||||||
F44,$02,44,r44,r44
|
|
||||||
F45,$02,45,r45,r45
|
|
||||||
F46,$02,46,r46,r46
|
|
||||||
F47,$02,47,r47,r47
|
|
||||||
F48,$02,48,r48,r48
|
|
||||||
F49,$02,49,r49,r49
|
|
||||||
F50,$02,50,r50,r50
|
|
||||||
F51,$02,51,r51,r51
|
|
||||||
F52,$02,52,r52,r52
|
|
||||||
F53,$02,53,r53,r53
|
|
||||||
F54,$02,54,r54,r54
|
|
||||||
F55,$02,55,r55,r55
|
|
||||||
F56,$02,56,r56,r56
|
|
||||||
F57,$02,57,r57,r57
|
|
||||||
F58,$02,58,r58,r58
|
|
||||||
F59,$02,59,r59,r59
|
|
||||||
F60,$02,60,r60,r60
|
|
||||||
F61,$02,61,r61,r61
|
|
||||||
F62,$02,62,r62,r62
|
|
||||||
F63,$02,63,r63,r63
|
|
||||||
F64,$02,64,r64,r64
|
|
||||||
F65,$02,65,r65,r65
|
|
||||||
F66,$02,66,r66,r66
|
|
||||||
F67,$02,67,r67,r67
|
|
||||||
F68,$02,68,r68,r68
|
|
||||||
F69,$02,69,r69,r69
|
|
||||||
F70,$02,70,r70,r70
|
|
||||||
F71,$02,71,r71,r71
|
|
||||||
F72,$02,72,r72,r72
|
|
||||||
F73,$02,73,r73,r73
|
|
||||||
F74,$02,74,r74,r74
|
|
||||||
F75,$02,75,r75,r75
|
|
||||||
F76,$02,76,r76,r76
|
|
||||||
F77,$02,77,r77,r77
|
|
||||||
F78,$02,78,r78,r78
|
|
||||||
F79,$02,79,r79,r79
|
|
||||||
F80,$02,80,r80,r80
|
|
||||||
F81,$02,81,r81,r81
|
|
||||||
F82,$02,82,r82,r82
|
|
||||||
F83,$02,83,r83,r83
|
|
||||||
F84,$02,84,r84,r84
|
|
||||||
F85,$02,85,r85,r85
|
|
||||||
F86,$02,86,r86,r86
|
|
||||||
F87,$02,87,r87,r87
|
|
||||||
F88,$02,88,r88,r88
|
|
||||||
F89,$02,89,r89,r89
|
|
||||||
F90,$02,90,r90,r90
|
|
||||||
F91,$02,91,r91,r91
|
|
||||||
F92,$02,92,r92,r92
|
|
||||||
F93,$02,93,r93,r93
|
|
||||||
F94,$02,94,r94,r94
|
|
||||||
F95,$02,95,r95,r95
|
|
||||||
F96,$02,96,r96,r96
|
|
||||||
F97,$02,97,r97,r97
|
|
||||||
F98,$02,98,r98,r98
|
|
||||||
F99,$02,99,r99,r99
|
|
||||||
F100,$02,100,r100,r100
|
|
||||||
F101,$02,101,r101,r101
|
|
||||||
F102,$02,102,r102,r102
|
|
||||||
F103,$02,103,r103,r103
|
|
||||||
F104,$02,104,r104,r104
|
|
||||||
F105,$02,105,r105,r105
|
|
||||||
F106,$02,106,r106,r106
|
|
||||||
F107,$02,107,r107,r107
|
|
||||||
F108,$02,108,r108,r108
|
|
||||||
F109,$02,109,r109,r109
|
|
||||||
F110,$02,110,r110,r110
|
|
||||||
F111,$02,111,r111,r111
|
|
||||||
F112,$02,112,r112,r112
|
|
||||||
F113,$02,113,r113,r113
|
|
||||||
F114,$02,114,r114,r114
|
|
||||||
F115,$02,115,r115,r115
|
|
||||||
F116,$02,116,r116,r116
|
|
||||||
F117,$02,117,r117,r117
|
|
||||||
F118,$02,118,r118,r118
|
|
||||||
F119,$02,119,r119,r119
|
|
||||||
F120,$02,120,r120,r120
|
|
||||||
F121,$02,121,r121,r121
|
|
||||||
F122,$02,122,r122,r122
|
|
||||||
F123,$02,123,r123,r123
|
|
||||||
F124,$02,124,r124,r124
|
|
||||||
F125,$02,125,r125,r125
|
|
||||||
F126,$02,126,r126,r126
|
|
||||||
F127,$02,127,r127,r127
|
|
||||||
@ -1,216 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 2014 by Florian Klaempfl
|
|
||||||
|
|
||||||
Symbol table overrides for IA64
|
|
||||||
|
|
||||||
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 symcpu;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
symtype,symdef,symsym;
|
|
||||||
|
|
||||||
type
|
|
||||||
{ defs }
|
|
||||||
tcpufiledef = class(tfiledef)
|
|
||||||
end;
|
|
||||||
tcpufiledefclass = class of tcpufiledef;
|
|
||||||
|
|
||||||
tcpuvariantdef = class(tvariantdef)
|
|
||||||
end;
|
|
||||||
tcpuvariantdefclass = class of tcpuvariantdef;
|
|
||||||
|
|
||||||
tcpuformaldef = class(tformaldef)
|
|
||||||
end;
|
|
||||||
tcpuformaldefclass = class of tcpuformaldef;
|
|
||||||
|
|
||||||
tcpuforwarddef = class(tforwarddef)
|
|
||||||
end;
|
|
||||||
tcpuforwarddefclass = class of tcpuforwarddef;
|
|
||||||
|
|
||||||
tcpuundefineddef = class(tundefineddef)
|
|
||||||
end;
|
|
||||||
tcpuundefineddefclass = class of tcpuundefineddef;
|
|
||||||
|
|
||||||
tcpuerrordef = class(terrordef)
|
|
||||||
end;
|
|
||||||
tcpuerrordefclass = class of tcpuerrordef;
|
|
||||||
|
|
||||||
tcpupointerdef = class(tpointerdef)
|
|
||||||
end;
|
|
||||||
tcpupointerdefclass = class of tcpupointerdef;
|
|
||||||
|
|
||||||
tcpurecorddef = class(trecorddef)
|
|
||||||
end;
|
|
||||||
tcpurecorddefclass = class of tcpurecorddef;
|
|
||||||
|
|
||||||
tcpuimplementedinterface = class(timplementedinterface)
|
|
||||||
end;
|
|
||||||
tcpuimplementedinterfaceclass = class of tcpuimplementedinterface;
|
|
||||||
|
|
||||||
tcpuobjectdef = class(tobjectdef)
|
|
||||||
end;
|
|
||||||
tcpuobjectdefclass = class of tcpuobjectdef;
|
|
||||||
|
|
||||||
tcpuclassrefdef = class(tclassrefdef)
|
|
||||||
end;
|
|
||||||
tcpuclassrefdefclass = class of tcpuclassrefdef;
|
|
||||||
|
|
||||||
tcpuarraydef = class(tarraydef)
|
|
||||||
end;
|
|
||||||
tcpuarraydefclass = class of tcpuarraydef;
|
|
||||||
|
|
||||||
tcpuorddef = class(torddef)
|
|
||||||
end;
|
|
||||||
tcpuorddefclass = class of tcpuorddef;
|
|
||||||
|
|
||||||
tcpufloatdef = class(tfloatdef)
|
|
||||||
end;
|
|
||||||
tcpufloatdefclass = class of tcpufloatdef;
|
|
||||||
|
|
||||||
tcpuprocvardef = class(tprocvardef)
|
|
||||||
end;
|
|
||||||
tcpuprocvardefclass = class of tcpuprocvardef;
|
|
||||||
|
|
||||||
tcpuprocdef = class(tprocdef)
|
|
||||||
end;
|
|
||||||
tcpuprocdefclass = class of tcpuprocdef;
|
|
||||||
|
|
||||||
tcpustringdef = class(tstringdef)
|
|
||||||
end;
|
|
||||||
tcpustringdefclass = class of tcpustringdef;
|
|
||||||
|
|
||||||
tcpuenumdef = class(tenumdef)
|
|
||||||
end;
|
|
||||||
tcpuenumdefclass = class of tcpuenumdef;
|
|
||||||
|
|
||||||
tcpusetdef = class(tsetdef)
|
|
||||||
end;
|
|
||||||
tcpusetdefclass = class of tcpusetdef;
|
|
||||||
|
|
||||||
{ syms }
|
|
||||||
tcpulabelsym = class(tlabelsym)
|
|
||||||
end;
|
|
||||||
tcpulabelsymclass = class of tcpulabelsym;
|
|
||||||
|
|
||||||
tcpuunitsym = class(tunitsym)
|
|
||||||
end;
|
|
||||||
tcpuunitsymclass = class of tcpuunitsym;
|
|
||||||
|
|
||||||
tcpuprogramparasym = class(tprogramparasym)
|
|
||||||
end;
|
|
||||||
tcpuprogramparasymclass = class(tprogramparasym);
|
|
||||||
|
|
||||||
tcpunamespacesym = class(tnamespacesym)
|
|
||||||
end;
|
|
||||||
tcpunamespacesymclass = class of tcpunamespacesym;
|
|
||||||
|
|
||||||
tcpuprocsym = class(tprocsym)
|
|
||||||
end;
|
|
||||||
tcpuprocsymclass = class of tcpuprocsym;
|
|
||||||
|
|
||||||
tcputypesym = class(ttypesym)
|
|
||||||
end;
|
|
||||||
tcpuypesymclass = class of tcputypesym;
|
|
||||||
|
|
||||||
tcpufieldvarsym = class(tfieldvarsym)
|
|
||||||
end;
|
|
||||||
tcpufieldvarsymclass = class of tcpufieldvarsym;
|
|
||||||
|
|
||||||
tcpulocalvarsym = class(tlocalvarsym)
|
|
||||||
end;
|
|
||||||
tcpulocalvarsymclass = class of tcpulocalvarsym;
|
|
||||||
|
|
||||||
tcpuparavarsym = class(tparavarsym)
|
|
||||||
end;
|
|
||||||
tcpuparavarsymclass = class of tcpuparavarsym;
|
|
||||||
|
|
||||||
tcpustaticvarsym = class(tstaticvarsym)
|
|
||||||
end;
|
|
||||||
tcpustaticvarsymclass = class of tcpustaticvarsym;
|
|
||||||
|
|
||||||
tcpuabsolutevarsym = class(tabsolutevarsym)
|
|
||||||
end;
|
|
||||||
tcpuabsolutevarsymclass = class of tcpuabsolutevarsym;
|
|
||||||
|
|
||||||
tcpupropertysym = class(tpropertysym)
|
|
||||||
end;
|
|
||||||
tcpupropertysymclass = class of tcpupropertysym;
|
|
||||||
|
|
||||||
tcpuconstsym = class(tconstsym)
|
|
||||||
end;
|
|
||||||
tcpuconstsymclass = class of tcpuconstsym;
|
|
||||||
|
|
||||||
tcpuenumsym = class(tenumsym)
|
|
||||||
end;
|
|
||||||
tcpuenumsymclass = class of tcpuenumsym;
|
|
||||||
|
|
||||||
tcpusyssym = class(tsyssym)
|
|
||||||
end;
|
|
||||||
tcpusyssymclass = class of tcpusyssym;
|
|
||||||
|
|
||||||
|
|
||||||
const
|
|
||||||
pbestrealtype : ^tdef = @s64floattype;
|
|
||||||
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
begin
|
|
||||||
{ used tdef classes }
|
|
||||||
cfiledef:=tcpufiledef;
|
|
||||||
cvariantdef:=tcpuvariantdef;
|
|
||||||
cformaldef:=tcpuformaldef;
|
|
||||||
cforwarddef:=tcpuforwarddef;
|
|
||||||
cundefineddef:=tcpuundefineddef;
|
|
||||||
cerrordef:=tcpuerrordef;
|
|
||||||
cpointerdef:=tcpupointerdef;
|
|
||||||
crecorddef:=tcpurecorddef;
|
|
||||||
cimplementedinterface:=tcpuimplementedinterface;
|
|
||||||
cobjectdef:=tcpuobjectdef;
|
|
||||||
cclassrefdef:=tcpuclassrefdef;
|
|
||||||
carraydef:=tcpuarraydef;
|
|
||||||
corddef:=tcpuorddef;
|
|
||||||
cfloatdef:=tcpufloatdef;
|
|
||||||
cprocvardef:=tcpuprocvardef;
|
|
||||||
cprocdef:=tcpuprocdef;
|
|
||||||
cstringdef:=tcpustringdef;
|
|
||||||
cenumdef:=tcpuenumdef;
|
|
||||||
csetdef:=tcpusetdef;
|
|
||||||
|
|
||||||
{ used tsym classes }
|
|
||||||
clabelsym:=tcpulabelsym;
|
|
||||||
cunitsym:=tcpuunitsym;
|
|
||||||
cprogramparasym:=tcpuprogramparasym;
|
|
||||||
cnamespacesym:=tcpunamespacesym;
|
|
||||||
cprocsym:=tcpuprocsym;
|
|
||||||
ctypesym:=tcputypesym;
|
|
||||||
cfieldvarsym:=tcpufieldvarsym;
|
|
||||||
clocalvarsym:=tcpulocalvarsym;
|
|
||||||
cparavarsym:=tcpuparavarsym;
|
|
||||||
cstaticvarsym:=tcpustaticvarsym;
|
|
||||||
cabsolutevarsym:=tcpuabsolutevarsym;
|
|
||||||
cpropertysym:=tcpupropertysym;
|
|
||||||
cconstsym:=tcpuconstsym;
|
|
||||||
cenumsym:=tcpuenumsym;
|
|
||||||
csyssym:=tcpusyssym;
|
|
||||||
end.
|
|
||||||
|
|
||||||
@ -1,248 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2001 by Florian Klaempfl and Pierre Muller
|
|
||||||
|
|
||||||
virtual instruction set family assembler instructions
|
|
||||||
|
|
||||||
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 aasmcpu;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
cclasses,aasmtai,aasmdata,
|
|
||||||
aasmbase,globals,verbose,
|
|
||||||
cpubase,cpuinfo;
|
|
||||||
|
|
||||||
|
|
||||||
type
|
|
||||||
|
|
||||||
taicpu = class(taicpu_abstract)
|
|
||||||
opsize : topsize;
|
|
||||||
constructor op_none(op : tasmop;_size : topsize);
|
|
||||||
|
|
||||||
constructor op_reg(op : tasmop;_size : topsize;_op1 : tregister);
|
|
||||||
constructor op_const(op : tasmop;_size : topsize;_op1 : longint);
|
|
||||||
constructor op_ref(op : tasmop;_size : topsize;_op1 : treference);
|
|
||||||
|
|
||||||
constructor op_reg_reg(op : tasmop;_size : topsize;_op1,_op2 : tregister);
|
|
||||||
constructor op_reg_ref(op : tasmop;_size : topsize;_op1 : tregister;_op2 : treference);
|
|
||||||
constructor op_ref_reg(op : tasmop;_size : topsize;_op1 : treference;_op2 : tregister);
|
|
||||||
|
|
||||||
constructor op_const_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister);
|
|
||||||
constructor op_const_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : treference);
|
|
||||||
|
|
||||||
|
|
||||||
{ this is for Jmp instructions }
|
|
||||||
constructor op_cond_sym(op : tasmop;cond:TAsmCond;_size : topsize;_op1 : tasmsymbol);
|
|
||||||
|
|
||||||
constructor op_sym(op : tasmop;_size : topsize;_op1 : tasmsymbol);
|
|
||||||
{ for DBxx opcodes }
|
|
||||||
constructor op_reg_sym(op: tasmop; _size : topsize; _op1: tregister; _op2 :tasmsymbol);
|
|
||||||
constructor op_sym_ofs_reg(op : tasmop;_size : topsize;_op1 : tasmsymbol;_op1ofs:longint;_op2 : tregister);
|
|
||||||
|
|
||||||
constructor op_sym_ofs(op : tasmop;_size : topsize;_op1 : tasmsymbol;_op1ofs:longint);
|
|
||||||
constructor op_sym_ofs_ref(op : tasmop;_size : topsize;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference);
|
|
||||||
|
|
||||||
private
|
|
||||||
procedure init(_size : topsize); { this need to be called by all constructor }
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
tai_align = class(tai_align_abstract)
|
|
||||||
{ nothing to add }
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure InitAsm;
|
|
||||||
procedure DoneAsm;
|
|
||||||
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Taicpu Constructors
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
procedure taicpu.init(_size : topsize);
|
|
||||||
begin
|
|
||||||
typ:=ait_instruction;
|
|
||||||
is_jmp:=false;
|
|
||||||
opsize:=_size;
|
|
||||||
ops:=0;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_none(op : tasmop;_size : topsize);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_reg(op : tasmop;_size : topsize;_op1 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
ops:=1;
|
|
||||||
loadreg(0,_op1);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_const(op : tasmop;_size : topsize;_op1 : longint);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
ops:=1;
|
|
||||||
loadconst(0,aword(_op1));
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_ref(op : tasmop;_size : topsize;_op1 : treference);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
ops:=1;
|
|
||||||
loadref(0,_op1);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_reg(op : tasmop;_size : topsize;_op1,_op2 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
ops:=2;
|
|
||||||
loadreg(0,_op1);
|
|
||||||
loadreg(1,_op2);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_ref(op : tasmop;_size : topsize;_op1 : tregister;_op2 : treference);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
ops:=2;
|
|
||||||
loadreg(0,_op1);
|
|
||||||
loadref(1,_op2);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_const_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
ops:=2;
|
|
||||||
loadconst(0,aword(_op1));
|
|
||||||
loadreg(1,_op2);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_const_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : treference);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
ops:=2;
|
|
||||||
loadconst(0,aword(_op1));
|
|
||||||
loadref(1,_op2);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_ref_reg(op : tasmop;_size : topsize;_op1 : treference;_op2 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
ops:=2;
|
|
||||||
loadref(0,_op1);
|
|
||||||
loadreg(1,_op2);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_sym(op : tasmop;_size : topsize;_op1 : tasmsymbol);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
ops:=1;
|
|
||||||
loadsymbol(0,_op1,0);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_reg_sym(op: tasmop; _size : topsize; _op1: tregister; _op2 :tasmsymbol);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
init(_size);
|
|
||||||
ops:=2;
|
|
||||||
loadreg(0,_op1);
|
|
||||||
loadsymbol(1,_op2,0);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_sym_ofs_ref(op : tasmop;_size : topsize;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
init(_size);
|
|
||||||
ops:=2;
|
|
||||||
loadsymbol(0,_op1,_op1ofs);
|
|
||||||
loadref(1,_op2);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_sym_ofs(op : tasmop;_size : topsize;_op1 : tasmsymbol;_op1ofs:longint);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
init(_size);
|
|
||||||
ops:=1;
|
|
||||||
loadsymbol(0,_op1,_op1ofs);
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor taicpu.op_sym_ofs_reg(op : tasmop;_size : topsize;_op1 : tasmsymbol;_op1ofs:longint;_op2 : tregister);
|
|
||||||
begin
|
|
||||||
inherited create(op);;
|
|
||||||
init(_size);
|
|
||||||
ops:=2;
|
|
||||||
loadreg(0,_op2);
|
|
||||||
loadsymbol(1,_op1,_op1ofs);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor taicpu.op_cond_sym(op : tasmop;cond:TAsmCond;_size : topsize;_op1 : tasmsymbol);
|
|
||||||
begin
|
|
||||||
inherited create(op);
|
|
||||||
init(_size);
|
|
||||||
condition:=cond;
|
|
||||||
ops:=1;
|
|
||||||
loadsymbol(0,_op1,0);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
procedure InitAsm;
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure DoneAsm;
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,609 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2002 by the Free Pascal dev. team
|
|
||||||
|
|
||||||
Contains the base types for the virtual instruction set
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
****************************************************************************
|
|
||||||
}
|
|
||||||
{ This Unit contains the base types for the Virtual Instruction machine
|
|
||||||
}
|
|
||||||
unit cpubase;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
strings,cutils,cclasses,aasmbase,cpuinfo,cginfo;
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Assembler Opcodes
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
type
|
|
||||||
TAsmOp=(a_none,a_beqs,a_bges,a_bgts,a_bles,a_blts,a_bnes,
|
|
||||||
a_bras,a_rets,a_bccs,a_bcss,a_bvcs,a_bvss,a_bbss,
|
|
||||||
a_bass,a_bats,a_bbts,a_beql,a_bgel,a_bgtl,a_blel,
|
|
||||||
a_bltl,a_bnel,a_bral,a_bsrl,a_bbsl,a_basl,a_batl,
|
|
||||||
a_bbtl,a_add,a_addc,a_and,a_asr,a_lsl,a_lsr,a_cmp,
|
|
||||||
a_sub,a_subb,a_divs,a_divu,a_mod,a_move,a_muls,a_mulu,
|
|
||||||
a_neg,a_not,a_or,a_xor,a_fadd,a_fcmp,a_fdiv,a_fmove,
|
|
||||||
a_fmul,a_fneg,a_fsub,a_fldd,a_flds,a_lbzx,a_lbsx,a_llsx,
|
|
||||||
a_llzx,a_lwsx,a_lwzx,a_fstd,a_fsts,a_stb,a_stl,a_stw,
|
|
||||||
a_syscall,a_nop,a_lims,a_orhi,a_lilo,a_call,a_popl,
|
|
||||||
a_pushl,
|
|
||||||
{ these are simplified mnemonics }
|
|
||||||
a_lea,a_limm,a_bxx
|
|
||||||
);
|
|
||||||
|
|
||||||
{# This should define the array of instructions as string }
|
|
||||||
op2strtable=array[tasmop] of string[8];
|
|
||||||
|
|
||||||
Const
|
|
||||||
{# First value of opcode enumeration }
|
|
||||||
firstop = low(tasmop);
|
|
||||||
{# Last value of opcode enumeration }
|
|
||||||
lastop = high(tasmop);
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Registers
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
type
|
|
||||||
toldregister = (R_NO,R_R0,R_R1,R_R2,R_R3,
|
|
||||||
R_R4,R_R5,R_R6,R_R7,
|
|
||||||
R_R8,R_R9,R_R10,R_R11,
|
|
||||||
R_CCR,R_SP,R_FP,R_PC,
|
|
||||||
R_FP0,R_FP1,R_FP2,R_FP3,
|
|
||||||
R_FP4,R_FP5,R_FP6,R_FP7,
|
|
||||||
R_FP8,R_FP9,R_FP10,R_FP11,
|
|
||||||
R_FP12,R_FP13,R_FP14,R_FP15,
|
|
||||||
R_INTREGISTER,R_FPUREGISTER
|
|
||||||
);
|
|
||||||
|
|
||||||
{# Set type definition for registers }
|
|
||||||
tregisterset = set of Toldregister;
|
|
||||||
Tnewregister=word;
|
|
||||||
|
|
||||||
tregister=record
|
|
||||||
enum:toldregister;
|
|
||||||
number:Tnewregister;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ A type to store register locations for 64 Bit values. }
|
|
||||||
tregister64 = packed record
|
|
||||||
reglo,reghi : tregister;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Tsuperregister=byte;
|
|
||||||
Tsubregister=byte;
|
|
||||||
|
|
||||||
Tsupregset=set of Tsuperregister;
|
|
||||||
|
|
||||||
{ alias for compact code }
|
|
||||||
treg64 = tregister64;
|
|
||||||
|
|
||||||
{# Type definition for the array of string of register nnames }
|
|
||||||
treg2strtable = array[toldregister] of string[5];
|
|
||||||
|
|
||||||
Const
|
|
||||||
|
|
||||||
{Special registers:}
|
|
||||||
NR_NO = $0000; {Invalid register}
|
|
||||||
|
|
||||||
{Normal registers:}
|
|
||||||
|
|
||||||
{General purpose registers:}
|
|
||||||
NR_R0 = $0100; NR_R1 = $0200; NR_R2 = $0300;
|
|
||||||
NR_R3 = $0400; NR_R4 = $0500; NR_R5 = $0600;
|
|
||||||
NR_R6 = $0700; NR_R7 = $0800; NR_R8 = $0900;
|
|
||||||
NR_R9 = $0A00; NR_R10 = $0B00; NR_R11 = $0C00;
|
|
||||||
NR_SP = $0D00; NR_FP = $0E00;
|
|
||||||
|
|
||||||
{Super registers:}
|
|
||||||
RS_R0 = $01; RS_R1 = $02; RS_R2 = $03;
|
|
||||||
RS_R3 = $04; RS_R4 = $05; RS_R5 = $06;
|
|
||||||
RS_R6 = $07; RS_R7 = $08; RS_R8 = $09;
|
|
||||||
RS_R9 = $0A; RS_R10 = $0B; RS_R11 = $0C;
|
|
||||||
RS_SP = $0D; RS_FP = $0E;
|
|
||||||
|
|
||||||
{Subregisters:}
|
|
||||||
R_SUBL = $00;
|
|
||||||
R_SUBW = $01;
|
|
||||||
R_SUBD = $02;
|
|
||||||
|
|
||||||
{# First register in the tregister enumeration }
|
|
||||||
firstreg = low(toldregister);
|
|
||||||
{# Last register in the tregister enumeration }
|
|
||||||
lastreg = high(toldregister);
|
|
||||||
|
|
||||||
first_supreg = $01;
|
|
||||||
last_supreg = $0c;
|
|
||||||
|
|
||||||
|
|
||||||
std_reg2str : treg2strtable = ('',
|
|
||||||
'r0','r1','r2','r3','r4','r5','r6','r7','r8','r9','r10','r11','ccr',
|
|
||||||
'sp','fp','pc','fp0','fp1','fp2','fp3','fp4','fp5','fp6','fp7',
|
|
||||||
'fp8','fp9','fp10','fp11','fp12','fp13','fp14','fp15','',''
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Conditions
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
type
|
|
||||||
TAsmCond=(C_None,
|
|
||||||
C_EQ, { equal }
|
|
||||||
C_NE, { not equal }
|
|
||||||
C_GE, { greater or equal (signed) }
|
|
||||||
C_GT, { greater than (signed) }
|
|
||||||
C_LE, { less or equal (signed) }
|
|
||||||
C_LT, { less than (signed) }
|
|
||||||
C_LS, { lower or same (unordered) }
|
|
||||||
C_AS, { above or same (unordered) }
|
|
||||||
C_AT, { above than (unordered) }
|
|
||||||
C_BT, { below than (unordered) }
|
|
||||||
C_CC, { carry clear }
|
|
||||||
C_CS { carry set }
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
const
|
|
||||||
cond2str:array[TAsmCond] of string[3]=('',
|
|
||||||
'eq','ne','ge','gt','le','lt','ls','as',
|
|
||||||
'at','bt','cc','cs');
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Flags
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
type
|
|
||||||
TResFlags = (
|
|
||||||
F_E, { zero flag = equal }
|
|
||||||
F_NE, { !zero_flag = not equal }
|
|
||||||
F_G, { greater (signed) }
|
|
||||||
F_L, { less (signed) }
|
|
||||||
F_GE,
|
|
||||||
F_LE,
|
|
||||||
F_C, { carry flag }
|
|
||||||
F_NC, { !carry flag }
|
|
||||||
F_A, { greater (unsigned) }
|
|
||||||
F_AE,
|
|
||||||
F_B, { less (unsigned) }
|
|
||||||
F_BE
|
|
||||||
);
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Reference
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
type
|
|
||||||
trefoptions=(ref_none,ref_parafixup,ref_localfixup,ref_selffixup);
|
|
||||||
|
|
||||||
{ reference record }
|
|
||||||
preference = ^treference;
|
|
||||||
treference = packed record
|
|
||||||
base,
|
|
||||||
index : tregister;
|
|
||||||
offset : longint;
|
|
||||||
symbol : tasmsymbol;
|
|
||||||
offsetfixup : longint;
|
|
||||||
options : trefoptions;
|
|
||||||
alignment : byte;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ reference record }
|
|
||||||
pparareference = ^tparareference;
|
|
||||||
tparareference = packed record
|
|
||||||
index : tregister;
|
|
||||||
offset : aword;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Operand
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
type
|
|
||||||
toptype=(top_none,top_reg,top_ref,top_const,top_symbol,top_bool);
|
|
||||||
|
|
||||||
toper=record
|
|
||||||
ot : longint;
|
|
||||||
case typ : toptype of
|
|
||||||
top_none : ();
|
|
||||||
top_reg : (reg:tregister);
|
|
||||||
top_ref : (ref:^treference);
|
|
||||||
top_const : (val:aword);
|
|
||||||
top_symbol : (sym:tasmsymbol;symofs:longint);
|
|
||||||
top_bool : (b: boolean);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Operand Sizes
|
|
||||||
*****************************************************************************}
|
|
||||||
{ S_NO = No Size of operand }
|
|
||||||
{ S_B = 8-bit size operand }
|
|
||||||
{ S_W = 16-bit size operand }
|
|
||||||
{ S_L = 32-bit size operand }
|
|
||||||
{ Floating point types }
|
|
||||||
{ S_FS = single type (32 bit) }
|
|
||||||
{ S_FD = double/64bit integer }
|
|
||||||
{ S_FX = Extended type }
|
|
||||||
topsize = (S_NO,S_B,S_W,S_L,S_FS,S_FD,S_FX,S_IQ);
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Generic Location
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
type
|
|
||||||
TLoc=(
|
|
||||||
{ added for tracking problems}
|
|
||||||
LOC_INVALID,
|
|
||||||
{ ordinal constant }
|
|
||||||
LOC_CONSTANT,
|
|
||||||
{ in a processor register }
|
|
||||||
LOC_REGISTER,
|
|
||||||
{ Constant register which shouldn't be modified }
|
|
||||||
LOC_CREGISTER,
|
|
||||||
{ FPU register}
|
|
||||||
LOC_FPUREGISTER,
|
|
||||||
{ Constant FPU register which shouldn't be modified }
|
|
||||||
LOC_CFPUREGISTER,
|
|
||||||
{ multimedia register }
|
|
||||||
LOC_MMREGISTER,
|
|
||||||
{ Constant multimedia reg which shouldn't be modified }
|
|
||||||
LOC_CMMREGISTER,
|
|
||||||
{ in memory }
|
|
||||||
LOC_REFERENCE,
|
|
||||||
{ in memory (constant) }
|
|
||||||
LOC_CREFERENCE,
|
|
||||||
{ boolean results only, jump to false or true label }
|
|
||||||
LOC_JUMP,
|
|
||||||
{ boolean results only, flags are set }
|
|
||||||
LOC_FLAGS
|
|
||||||
);
|
|
||||||
|
|
||||||
{ tparamlocation describes where a parameter for a procedure is stored.
|
|
||||||
References are given from the caller's point of view. The usual
|
|
||||||
TLocation isn't used, because contains a lot of unnessary fields.
|
|
||||||
}
|
|
||||||
tparalocation = packed record
|
|
||||||
size : TCGSize;
|
|
||||||
{ The location type where the parameter is passed, usually
|
|
||||||
LOC_REFERENCE,LOC_REGISTER or LOC_FPUREGISTER
|
|
||||||
}
|
|
||||||
loc : TLoc;
|
|
||||||
{ The stack pointer must be decreased by this value before
|
|
||||||
the parameter is copied to the given destination.
|
|
||||||
This allows to "encode" pushes with tparalocation.
|
|
||||||
On the PowerPC, this field is unsed but it is there
|
|
||||||
because several generic code accesses it.
|
|
||||||
}
|
|
||||||
sp_fixup : longint;
|
|
||||||
case TLoc of
|
|
||||||
LOC_REFERENCE : (reference : tparareference);
|
|
||||||
LOC_FPUREGISTER, LOC_CFPUREGISTER, LOC_MMREGISTER, LOC_CMMREGISTER,
|
|
||||||
LOC_REGISTER,LOC_CREGISTER : (
|
|
||||||
case longint of
|
|
||||||
1 : (register,register64.reghi : tregister);
|
|
||||||
{ overlay a register64.reglo }
|
|
||||||
2 : (register64.reglo : tregister);
|
|
||||||
{ overlay a 64 Bit register type }
|
|
||||||
3 : (reg64 : tregister64);
|
|
||||||
4 : (register64 : tregister64);
|
|
||||||
);
|
|
||||||
end;
|
|
||||||
|
|
||||||
treglocation = packed record
|
|
||||||
case longint of
|
|
||||||
1 : (register,register64.reghi : tregister);
|
|
||||||
{ overlay a register64.reglo }
|
|
||||||
2 : (register64.reglo : tregister);
|
|
||||||
{ overlay a 64 Bit register type }
|
|
||||||
3 : (reg64 : tregister64);
|
|
||||||
4 : (register64 : tregister64);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
tlocation = packed record
|
|
||||||
size : TCGSize;
|
|
||||||
loc : tloc;
|
|
||||||
case tloc of
|
|
||||||
LOC_CREFERENCE,LOC_REFERENCE : (reference : treference);
|
|
||||||
LOC_CONSTANT : (
|
|
||||||
case longint of
|
|
||||||
1 : (value : AWord);
|
|
||||||
{ can't do this, this layout depends on the host cpu. Use }
|
|
||||||
{ lo(valueqword)/hi(valueqword) instead (JM) }
|
|
||||||
{ 2 : (valuelow, valuehigh:AWord); }
|
|
||||||
{ overlay a complete 64 Bit value }
|
|
||||||
3 : (valueqword : qword);
|
|
||||||
);
|
|
||||||
LOC_FPUREGISTER, LOC_CFPUREGISTER, LOC_MMREGISTER, LOC_CMMREGISTER,
|
|
||||||
LOC_REGISTER,LOC_CREGISTER : (
|
|
||||||
case longint of
|
|
||||||
1 : (register64.reglo,register64.reghi : tregister);
|
|
||||||
2 : (register : tregister);
|
|
||||||
{ overlay a 64 Bit register type }
|
|
||||||
3 : (reg64 : tregister64);
|
|
||||||
4 : (register64 : tregister64);
|
|
||||||
);
|
|
||||||
LOC_FLAGS : (resflags : tresflags);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Constants
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
const
|
|
||||||
max_operands = 2;
|
|
||||||
|
|
||||||
lvaluelocations = [LOC_REFERENCE, LOC_CREGISTER, LOC_CFPUREGISTER,
|
|
||||||
LOC_CMMREGISTER];
|
|
||||||
|
|
||||||
{# Constant defining possibly all registers which might require saving }
|
|
||||||
ALL_REGISTERS = [R_FP0..R_FP15];
|
|
||||||
|
|
||||||
general_registers = [R_R0..R_R11];
|
|
||||||
|
|
||||||
{# low and high of the available maximum width integer general purpose }
|
|
||||||
{ registers }
|
|
||||||
LoGPReg = R_R0;
|
|
||||||
HiGPReg = R_R11;
|
|
||||||
|
|
||||||
{# low and high of every possible width general purpose register (same as }
|
|
||||||
{ above on most architctures apart from the 80x86) }
|
|
||||||
LoReg = R_R0;
|
|
||||||
HiReg = R_R11;
|
|
||||||
|
|
||||||
maxintregs = 12;
|
|
||||||
maxfpuregs = 16;
|
|
||||||
maxaddrregs = 0;
|
|
||||||
|
|
||||||
maxvarregs = 10;
|
|
||||||
varregs : Array [1..maxvarregs] of toldregister =
|
|
||||||
(R_R2,R_R3,R_R4,R_R5,R_R6,R_R7,R_R8,R_R9,R_R10,R_R11);
|
|
||||||
|
|
||||||
maxfpuvarregs = 15;
|
|
||||||
fpuvarregs : Array [1..maxfpuvarregs] of toldregister =
|
|
||||||
(R_FP1,R_FP2,R_FP3,
|
|
||||||
R_FP4,R_FP5,R_FP6,
|
|
||||||
R_FP7,R_FP8,R_FP9,
|
|
||||||
R_FP10,R_FP11,R_FP12,
|
|
||||||
R_FP13,R_FP14,R_FP15);
|
|
||||||
|
|
||||||
|
|
||||||
max_param_regs_int = 0;
|
|
||||||
|
|
||||||
max_param_regs_fpu = 0;
|
|
||||||
|
|
||||||
max_param_regs_mm = 0;
|
|
||||||
|
|
||||||
{# Registers which are defined as scratch and no need to save across
|
|
||||||
routine calls or in assembler blocks.
|
|
||||||
}
|
|
||||||
max_scratch_regs = 2;
|
|
||||||
scratch_regs: Array[1..max_scratch_regs] of Tsuperregister = (RS_R0,RS_R1);
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Default generic sizes
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
{# Defines the default address size for a processor, }
|
|
||||||
OS_ADDR = OS_32;
|
|
||||||
{# the natural int size for a processor,
|
|
||||||
has to match osuinttype/ossinttype as initialized in psystem }
|
|
||||||
OS_INT = OS_32;
|
|
||||||
{# the maximum float size for a processor, }
|
|
||||||
OS_FLOAT = OS_F64;
|
|
||||||
{# the size of a vector register for a processor }
|
|
||||||
OS_VECTOR = OS_NO;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
GDB Information
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
{# Register indexes for stabs information, when some
|
|
||||||
parameters or variables are stored in registers.
|
|
||||||
|
|
||||||
Currently unsupported by abstract machine
|
|
||||||
}
|
|
||||||
|
|
||||||
stab_regindex : array[toldregister] of shortint =
|
|
||||||
(-1,
|
|
||||||
{ r0..r11 }
|
|
||||||
-1,-1,-1,-1,-1,-1,
|
|
||||||
-1,-1,-1,-1,-1,-1,
|
|
||||||
{ sp,fp,ccr,pc }
|
|
||||||
-1,-1,-1,-1,
|
|
||||||
{ FP0..FP7 }
|
|
||||||
-1,-1,-1,-1,-1,-1,-1,-1,
|
|
||||||
{ FP8..FP15 }
|
|
||||||
-1,-1,-1,-1,-1,-1,-1,-1,
|
|
||||||
{ invalid }
|
|
||||||
-1,-1
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Generic Register names
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
{# Stack pointer register }
|
|
||||||
stack_pointer_reg = R_SP;
|
|
||||||
NR_STACK_POINTER_REG = NR_SP;
|
|
||||||
RS_STACK_POINTER_REG = RS_SP;
|
|
||||||
{# Frame pointer register }
|
|
||||||
frame_pointer_reg = R_FP;
|
|
||||||
NR_FRAME_POINTER_REG = NR_FP;
|
|
||||||
RS_FRAME_POINTER_REG = RS_FP;
|
|
||||||
{# Self pointer register : contains the instance address of an
|
|
||||||
object or class. }
|
|
||||||
self_pointer_reg = R_R11;
|
|
||||||
NR_SELF_POINTER_REG = NR_R11;
|
|
||||||
RS_SELF_POINTER_REG = RS_R11;
|
|
||||||
{# Register for addressing absolute data in a position independant way,
|
|
||||||
such as in PIC code. The exact meaning is ABI specific.
|
|
||||||
}
|
|
||||||
pic_offset_reg = R_R10;
|
|
||||||
{# Results are returned in this register (32-bit values) }
|
|
||||||
accumulator = R_R0;
|
|
||||||
NR_ACCUMULATOR = NR_R0;
|
|
||||||
RS_ACCUMULATOR = RS_R0;
|
|
||||||
{the return_result_reg, is used inside the called function to store its return
|
|
||||||
value when that is a scalar value otherwise a pointer to the address of the
|
|
||||||
result is placed inside it}
|
|
||||||
return_result_reg = accumulator;
|
|
||||||
|
|
||||||
{the function_result_reg contains the function result after a call to a scalar
|
|
||||||
function othewise it contains a pointer to the returned result}
|
|
||||||
function_result_reg = accumulator;
|
|
||||||
{# Hi-Results are returned in this register (64-bit value high register) }
|
|
||||||
accumulatorhigh = R_R1;
|
|
||||||
NR_ACCUMULATORHIGH = NR_R1;
|
|
||||||
RS_ACCUMULATORHIGH = RS_R1;
|
|
||||||
fpu_result_reg = R_FP0;
|
|
||||||
mmresultreg = R_NO;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
GCC /ABI linking information
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
{# Registers which must be saved when calling a routine declared as
|
|
||||||
cppdecl, cdecl, stdcall, safecall, palmossyscall. The registers
|
|
||||||
saved should be the ones as defined in the target ABI and / or GCC.
|
|
||||||
|
|
||||||
This value can be deduced from CALLED_USED_REGISTERS array in the
|
|
||||||
GCC source.
|
|
||||||
}
|
|
||||||
std_saved_registers = [RS_R0,RS_R1,RS_R10,RS_R11];
|
|
||||||
{# Required parameter alignment when calling a routine declared as
|
|
||||||
stdcall and cdecl. The alignment value should be the one defined
|
|
||||||
by GCC or the target ABI.
|
|
||||||
|
|
||||||
The value of this constant is equal to the constant
|
|
||||||
PARM_BOUNDARY / BITS_PER_UNIT in the GCC source.
|
|
||||||
}
|
|
||||||
std_param_align = 4; { for 32-bit version only }
|
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Helpers
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
function is_calljmp(o:tasmop):boolean;
|
|
||||||
|
|
||||||
procedure inverse_flags(var r : TResFlags);
|
|
||||||
function flags_to_cond(const f: TResFlags) : TAsmCond;
|
|
||||||
procedure convert_register_to_enum(var r:Tregister);
|
|
||||||
function cgsize2subreg(s:Tcgsize):Tsubregister;
|
|
||||||
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
verbose;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
|
||||||
Helpers
|
|
||||||
*****************************************************************************}
|
|
||||||
|
|
||||||
function is_calljmp(o:tasmop):boolean;
|
|
||||||
begin
|
|
||||||
is_calljmp := false;
|
|
||||||
if o in [a_bxx,a_call,a_beqs..a_bbtl] then
|
|
||||||
is_calljmp := true;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure inverse_flags(var r: TResFlags);
|
|
||||||
const flagsinvers : array[F_E..F_BE] of tresflags =
|
|
||||||
(F_NE,F_E,
|
|
||||||
F_LE,F_GE,
|
|
||||||
F_L,F_G,
|
|
||||||
F_NC,F_C,
|
|
||||||
F_BE,F_B,
|
|
||||||
F_AE,F_A);
|
|
||||||
begin
|
|
||||||
r:=flagsinvers[r];
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function flags_to_cond(const f: TResFlags) : TAsmCond;
|
|
||||||
const flags2cond : array[tresflags] of tasmcond =
|
|
||||||
(
|
|
||||||
{F_E} C_EQ,
|
|
||||||
{F_NE} C_NE,
|
|
||||||
{F_G } C_GT,
|
|
||||||
{F_L } C_LT,
|
|
||||||
{F_GE} C_GE,
|
|
||||||
{F_LE} C_LE,
|
|
||||||
{F_C} C_CS,
|
|
||||||
{F_NC} C_CC,
|
|
||||||
{F_A} C_AT,
|
|
||||||
{F_AE} C_AS,
|
|
||||||
{F_B} C_BT,
|
|
||||||
{F_BE} C_LS);
|
|
||||||
begin
|
|
||||||
flags_to_cond := flags2cond[f];
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure convert_register_to_enum(var r:Tregister);
|
|
||||||
|
|
||||||
begin
|
|
||||||
if r.enum = R_INTREGISTER then
|
|
||||||
case r.number of
|
|
||||||
NR_NO: r.enum:= R_NO;
|
|
||||||
NR_R0: r.enum:= R_R0;
|
|
||||||
NR_R1: r.enum:= R_R1;
|
|
||||||
NR_R2: r.enum:= R_R2;
|
|
||||||
NR_R3: r.enum:= R_R3;
|
|
||||||
NR_R4: r.enum:= R_R4;
|
|
||||||
NR_R5: r.enum:= R_R5;
|
|
||||||
NR_R6: r.enum:= R_R6;
|
|
||||||
NR_R7: r.enum:= R_R7;
|
|
||||||
NR_R8: r.enum:= R_R8;
|
|
||||||
NR_R9: r.enum:= R_R9;
|
|
||||||
NR_R10: r.enum:= R_R10;
|
|
||||||
NR_R11: r.enum:= R_R11;
|
|
||||||
else
|
|
||||||
internalerror(200301082);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function cgsize2subreg(s:Tcgsize):Tsubregister;
|
|
||||||
|
|
||||||
begin
|
|
||||||
case s of
|
|
||||||
OS_8,OS_S8:
|
|
||||||
cgsize2subreg:=R_SUBL;
|
|
||||||
OS_16,OS_S16:
|
|
||||||
cgsize2subreg:=R_SUBW;
|
|
||||||
OS_32,OS_S32:
|
|
||||||
cgsize2subreg:=R_SUBD;
|
|
||||||
else
|
|
||||||
internalerror(200301231);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,79 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 1998-2002 by the Free Pascal development team
|
|
||||||
|
|
||||||
Basic Processor information for the virtual instruction set
|
|
||||||
|
|
||||||
See the file COPYING.FPC, included in this distribution,
|
|
||||||
for details about the copyright.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
**********************************************************************}
|
|
||||||
|
|
||||||
Unit CPUInfo;
|
|
||||||
|
|
||||||
Interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
globtype;
|
|
||||||
|
|
||||||
Type
|
|
||||||
{ Architecture word - Native unsigned type }
|
|
||||||
AWord = Longword;
|
|
||||||
PAWord = ^AWord;
|
|
||||||
|
|
||||||
{ this must be an ordinal type with the same size as a pointer }
|
|
||||||
{ to allow some dirty type casts for example when using }
|
|
||||||
{ tconstsym.value }
|
|
||||||
{ Note: must be unsigned!! Otherwise, ugly code like }
|
|
||||||
{ pointer(-1) will result in a pointer with the value }
|
|
||||||
{ $fffffffffffffff on a 32bit machine if the compiler uses }
|
|
||||||
{ int64 constants internally (JM) }
|
|
||||||
TConstPtrUInt = Longword;
|
|
||||||
|
|
||||||
bestreal = double;
|
|
||||||
{$if FPC_FULLVERSION>20700}
|
|
||||||
bestrealrec = TDoubleRec;
|
|
||||||
{$endif FPC_FULLVERSION>20700}
|
|
||||||
ts32real = single;
|
|
||||||
ts64real = double;
|
|
||||||
ts80real = extended;
|
|
||||||
ts64comp = comp;
|
|
||||||
|
|
||||||
pbestreal=^bestreal;
|
|
||||||
|
|
||||||
{ possible supported processors for this target }
|
|
||||||
tcputype = (cpu_none);
|
|
||||||
|
|
||||||
tcontrollertype =
|
|
||||||
(ct_none
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
Const
|
|
||||||
{ Is there support for dealing with multiple microcontrollers available }
|
|
||||||
{ for this platform? }
|
|
||||||
ControllerSupport = false;
|
|
||||||
{# Size of native extended floating point type }
|
|
||||||
extended_size = 8;
|
|
||||||
{# Size of a pointer }
|
|
||||||
sizeof(aint) = 4;
|
|
||||||
{# Size of a multimedia register }
|
|
||||||
mmreg_size = 8;
|
|
||||||
{ target cpu string (used by compiler options) }
|
|
||||||
target_cpu_string = 'vis';
|
|
||||||
|
|
||||||
{ We know that there are fields after sramsize
|
|
||||||
but we don't care about this warning }
|
|
||||||
{$PUSH}
|
|
||||||
{$WARN 3177 OFF}
|
|
||||||
embedded_controllers : array [tcontrollertype] of tcontrollerdatatype =
|
|
||||||
(
|
|
||||||
(controllertypestr:''; controllerunitstr:''; flashbase:0; flashsize:0; srambase:0; sramsize:0));
|
|
||||||
{$POP}
|
|
||||||
|
|
||||||
Implementation
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,49 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 2000-2002 by Florian Klaempfl
|
|
||||||
|
|
||||||
Includes the Virtual instrution set code generator
|
|
||||||
|
|
||||||
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 cpunode;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
{ generic nodes }
|
|
||||||
ncgbas,ncgld,ncgflw,ncgcnv,ncgmem,ncgcon,ncgcal,ncgset,ncginl,
|
|
||||||
{ to be able to only parts of the generic code,
|
|
||||||
the processor specific nodes must be included
|
|
||||||
after the generic one (FK)
|
|
||||||
}
|
|
||||||
// nvisadd,
|
|
||||||
// nviscal,
|
|
||||||
// nviscon,
|
|
||||||
// nvisflw,
|
|
||||||
// nvismem,
|
|
||||||
// nvisinl,
|
|
||||||
// nvismat,
|
|
||||||
// nviscnv,
|
|
||||||
{ symtable }
|
|
||||||
symcpu
|
|
||||||
;
|
|
||||||
|
|
||||||
end.
|
|
||||||
@ -1,69 +0,0 @@
|
|||||||
{
|
|
||||||
Copyright (c) 2002 by Florian Klaempfl
|
|
||||||
|
|
||||||
Generates the argument location information for the
|
|
||||||
virtual instruction set machine
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
****************************************************************************
|
|
||||||
}
|
|
||||||
{ Generates the argument location information for 680x0.
|
|
||||||
}
|
|
||||||
unit cpupara;
|
|
||||||
|
|
||||||
{$i fpcdefs.inc}
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
cpubase,
|
|
||||||
symdef,paramgr;
|
|
||||||
|
|
||||||
type
|
|
||||||
{ Returns the location for the nr-st 32 Bit int parameter
|
|
||||||
if every parameter before is an 32 Bit int parameter as well
|
|
||||||
and if the calling conventions for the helper routines of the
|
|
||||||
rtl are used.
|
|
||||||
}
|
|
||||||
tcpuparamanager = class(tparamanager)
|
|
||||||
procedure create_param_loc_info(p : tabstractprocdef);override;
|
|
||||||
function getselflocation(p : tabstractprocdef) : tparalocation;override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
uses
|
|
||||||
verbose,
|
|
||||||
globals,
|
|
||||||
globtype,
|
|
||||||
systems,
|
|
||||||
cpuinfo,cginfo,cgbase,
|
|
||||||
defutil;
|
|
||||||
|
|
||||||
procedure tcpuparamanager.create_param_loc_info(p : tabstractprocdef);
|
|
||||||
var
|
|
||||||
param_offset : integer;
|
|
||||||
hp : tparaitem;
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
function tcpuparamanager.getselflocation(p : tabstractprocdef) : tparalocation;
|
|
||||||
begin
|
|
||||||
end;
|
|
||||||
|
|
||||||
begin
|
|
||||||
paramanager:=tcpuparamanager.create;
|
|
||||||
end.
|
|
||||||
Loading…
Reference in New Issue
Block a user