summaryrefslogtreecommitdiff
path: root/compiler/cgutils.pas
diff options
context:
space:
mode:
authorfpc <fpc@3ad0048d-3df7-0310-abae-a5850022a9f2>2005-05-16 18:37:41 +0000
committerfpc <fpc@3ad0048d-3df7-0310-abae-a5850022a9f2>2005-05-16 18:37:41 +0000
commitf206a9c2b1ae1d8727ca27a96d448b61fdb4c766 (patch)
treef28256ff9964c1fc7c0f7fb00891268a117b745d /compiler/cgutils.pas
downloadfpc-f206a9c2b1ae1d8727ca27a96d448b61fdb4c766.tar.gz
initial import
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@1 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/cgutils.pas')
-rw-r--r--compiler/cgutils.pas195
1 files changed, 195 insertions, 0 deletions
diff --git a/compiler/cgutils.pas b/compiler/cgutils.pas
new file mode 100644
index 0000000000..7769fc40cf
--- /dev/null
+++ b/compiler/cgutils.pas
@@ -0,0 +1,195 @@
+{
+ $Id: cgutils.pas,v 1.6 2005/02/14 17:13:06 peter Exp $
+ Copyright (c) 1998-2004 by Florian Klaempfl
+
+ Some basic types and constants for the code generation
+
+ 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 exports some helper routines which are used across the code generator }
+unit cgutils;
+
+{$i fpcdefs.inc}
+
+ interface
+
+ uses
+ globtype,
+ cclasses,
+ aasmbase,
+ cpubase,cgbase;
+
+ type
+ { reference record, reordered for best alignment }
+ preference = ^treference;
+ treference = record
+ offset : aint;
+ symbol,
+ relsymbol : tasmsymbol;
+ segment,
+ base,
+ index : tregister;
+ refaddr : trefaddr;
+ scalefactor : byte;
+{$ifdef arm}
+ symboldata : tlinkedlistitem;
+ signindex : shortint;
+ shiftimm : byte;
+ addressmode : taddressmode;
+ shiftmode : tshiftmode;
+{$endif arm}
+{$ifdef m68k}
+ { indexed increment and decrement mode }
+ { (An)+ and -(An) }
+ direction : tdirection;
+{$endif m68k}
+ end;
+
+ tlocation = record
+ loc : TCGLoc;
+ size : TCGSize;
+ case TCGLoc of
+ LOC_FLAGS : (resflags : tresflags);
+ LOC_CONSTANT : (
+ case longint of
+{$ifdef FPC_BIG_ENDIAN}
+ 1 : (_valuedummy,value : aint);
+{$else FPC_BIG_ENDIAN}
+ 1 : (value : aint);
+{$endif FPC_BIG_ENDIAN}
+ 2 : (value64 : Int64);
+ );
+ 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 : tregister;
+{$ifdef m68k}
+ { some m68k OSes require that the result is returned in d0 and a0
+ the second location must be stored here }
+ registeralias : tregister;
+{$endif m68k}
+ );
+{$ifndef cpu64bit}
+ { overlay a 64 Bit register type }
+ 2 : (register64 : tregister64);
+{$endif cpu64bit}
+ );
+ end;
+
+
+ { trerefence handling }
+
+ {# Clear to zero a treference }
+ procedure reference_reset(var ref : treference);
+ {# Clear to zero a treference, and set is base address
+ to base register.
+ }
+ procedure reference_reset_base(var ref : treference;base : tregister;offset : longint);
+ procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset : longint);
+ { This routine verifies if two references are the same, and
+ if so, returns TRUE, otherwise returns false.
+ }
+ function references_equal(sref : treference;dref : treference) : boolean;
+
+ { tlocation handling }
+
+ procedure location_reset(var l : tlocation;lt:TCGLoc;lsize:TCGSize);
+ procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
+ procedure location_swap(var destloc,sourceloc : tlocation);
+
+
+
+implementation
+
+{****************************************************************************
+ TReference
+****************************************************************************}
+
+ procedure reference_reset(var ref : treference);
+ begin
+ FillChar(ref,sizeof(treference),0);
+{$ifdef arm}
+ ref.signindex:=1;
+{$endif arm}
+ end;
+
+
+ procedure reference_reset_base(var ref : treference;base : tregister;offset : longint);
+ begin
+ reference_reset(ref);
+ ref.base:=base;
+ ref.offset:=offset;
+ end;
+
+
+ procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset : longint);
+ begin
+ reference_reset(ref);
+ ref.symbol:=sym;
+ ref.offset:=offset;
+ end;
+
+
+ function references_equal(sref : treference;dref : treference):boolean;
+ begin
+ references_equal:=CompareByte(sref,dref,sizeof(treference))=0;
+ end;
+
+
+{****************************************************************************
+ TLocation
+****************************************************************************}
+
+ procedure location_reset(var l : tlocation;lt:TCGLoc;lsize:TCGSize);
+ begin
+ FillChar(l,sizeof(tlocation),0);
+ l.loc:=lt;
+ l.size:=lsize;
+{$ifdef arm}
+ if l.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
+ l.reference.signindex:=1;
+{$endif arm}
+ end;
+
+
+ procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
+ begin
+ destloc:=sourceloc;
+ end;
+
+
+ procedure location_swap(var destloc,sourceloc : tlocation);
+ var
+ swapl : tlocation;
+ begin
+ swapl := destloc;
+ destloc := sourceloc;
+ sourceloc := swapl;
+ end;
+
+
+
+end.
+{
+ $Log: cgutils.pas,v $
+ Revision 1.6 2005/02/14 17:13:06 peter
+ * truncate log
+
+}