X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Freg.h;h=3efd2b1ef115ea4f5824ec39ca6bbb95eefd0be6;hb=9e12d9f90582373b79b03fd7c4293f3722454b4f;hp=a52a119689f0d0f8695f3e19ea8b752cf3a1e32b;hpb=efa7516458b2beb35f7195061541759db9d0bd5a;p=cacao.git diff --git a/src/vm/jit/reg.h b/src/vm/jit/reg.h index a52a11968..3efd2b1ef 100644 --- a/src/vm/jit/reg.h +++ b/src/vm/jit/reg.h @@ -1,10 +1,7 @@ -/* jit/reg.h - register allocator header +/* src/vm/jit/reg.h - register allocator header - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 - Institut f. Computersprachen, TU Wien - R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst, - S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, - J. Wenninger + Copyright (C) 1996-2005, 2006, 2007, 2008 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -20,14 +17,8 @@ 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., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. - - Contact: cacao@complang.tuwien.ac.at - - Authors: Christian Thalinger - - $Id: reg.h 1626 2004-11-30 17:25:59Z twisti $ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ @@ -35,47 +26,49 @@ #ifndef _REG_H #define _REG_H -/* We typedef these structures before #includes to resolve circular */ -/* dependencies. */ +/* forward typedefs ***********************************************************/ typedef struct varinfo varinfo; -typedef struct varinfo varinfo5[5]; typedef struct registerdata registerdata; -#include "types.h" -#include "vm/jit/codegen.inc.h" -#include "vm/jit/jit.h" -#include "vm/jit/inline/inline.h" +#include "config.h" +#include "vm/types.h" + +#include "arch.h" + +#include "vm/jit/jit.hpp" +#include "vm/jit/verify/typeinfo.h" /************************* pseudo variable structure **************************/ struct varinfo { - int type; /* basic type of variable */ - int flags; /* flags (SAVED, INMEMORY) */ - int regoff; /* register number or memory offset */ + s4 type; /* basic type of variable */ + s4 flags; /* flags (SAVED, INMEMORY) */ + union { + s4 regoff; /* register number or memory offset */ + s4 i; + s8 l; + float f; + double d; + basicblock *retaddr; + s4 ii[2]; + } vv; +#if defined(ENABLE_VERIFIER) + typeinfo_t typeinfo; /* type info for reference types */ +#endif }; +typedef struct varinfo varinfo5[5]; -struct registerdata { - varinfo5 *locals; - varinfo5 *interfaces; - - int intregsnum; /* absolute number of integer registers */ - int floatregsnum; /* absolute number of float registers */ +struct registerdata { int intreg_ret; /* register to return integer values */ - int intreg_argnum; /* number of integer argument registers */ - - int floatreg_ret; /* register for return float values */ - int fltreg_argnum; /* number of float argument registers */ - + int fltreg_ret; /* register for return float values */ - int *argintregs; /* scratch integer registers */ int *tmpintregs; /* scratch integer registers */ int *savintregs; /* saved integer registers */ - int *argfltregs; /* scratch float registers */ int *tmpfltregs; /* scratch float registers */ int *savfltregs; /* saved float registers */ int *freeargintregs; /* free argument integer registers */ @@ -85,25 +78,35 @@ struct registerdata { int *freetmpfltregs; /* free scratch float registers */ int *freesavfltregs; /* free saved float registers */ -#ifdef USETWOREGS - int *secondregs; /* used for longs in 2 32 bit registers */ +#ifdef HAS_ADDRESS_REGISTER_FILE + int adrreg_ret; /* register to return address values */ + + int *argadrregs; /* argument address registers */ + int *tmpadrregs; /* scratch address registers */ + int *savadrregs; /* saved address registers */ + int *freeargadrregs; /* free argument address registers */ + int *freetmpadrregs; /* free scratch address registers */ + int *freesavadrregs; /* free saved address registers */ + + int *adrusedinout; /* is this adr register uses as INOUT? */ + + int argadrreguse; /* used argument address register count */ + int tmpadrreguse; /* used scratch address register count */ + int savadrreguse; /* used saved address register count */ + + int freetmpadrtop; /* free scratch address register count */ + int freesavadrtop; /* free saved address register count */ + int freeargadrtop; /* free argument address register count */ #endif +#if defined(HAS_4BYTE_STACKSLOT) + int *freemem_2; + int freememtop_2; +#endif int *freemem; /* free scratch memory */ - int memuse; /* used memory count */ - int ifmemuse; /* interface used memory count */ - int maxmemuse; /* maximal used memory count (spills) */ int freememtop; /* free memory count */ - int tmpintregcnt; /* scratch integer register count */ - int savintregcnt; /* saved integer register count */ - int tmpfltregcnt; /* scratch float register count */ - int savfltregcnt; /* saved float register count */ - - int iftmpintregcnt; /* iface scratch integer register count */ - int ifsavintregcnt; /* iface saved integer register count */ - int iftmpfltregcnt; /* iface scratch float register count */ - int ifsavfltregcnt; /* iface saved float register count */ + int memuse; /* used memory count */ int argintreguse; /* used argument integer register count */ int tmpintreguse; /* used scratch integer register count */ @@ -112,29 +115,33 @@ struct registerdata { int tmpfltreguse; /* used scratch float register count */ int savfltreguse; /* used saved float register count */ - int maxargintreguse; /* max used argument int register count */ - int maxtmpintreguse; /* max used scratch int register count */ - int maxsavintreguse; /* max used saved int register count */ - int maxargfltreguse; /* max used argument float register count */ - int maxtmpfltreguse; /* max used scratch float register count */ - int maxsavfltreguse; /* max used saved float register count */ - + int freearginttop; /* free argument integer register count */ + int freeargflttop; /* free argument float register count */ int freetmpinttop; /* free scratch integer register count */ int freesavinttop; /* free saved integer register count */ int freetmpflttop; /* free scratch float register count */ int freesavflttop; /* free saved float register count */ - int arguments_num; /* size of parameter field in the stackframe */ + int *intusedinout; /* is this int register uses as INOUT? */ + int *fltusedinout; /* is this flt register uses as INOUT? */ + int *regisoutvar; /* true if reg. is outvar of this block */ + int *regcopycount; /* counts copies of each register regoff */ + int *memcopycount; /* counts copies of each INMEMORY regoff */ + int memcopycountsize; /* size of memcopycount buffer */ }; -/* function prototypes */ +/* function prototypes ********************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +void reg_setup(jitdata *jd); -void reg_init(); -void reg_setup(methodinfo *m, registerdata *rd, t_inlining_globals *id); -void reg_free(methodinfo *m, registerdata *rd); -void reg_close(); -void regalloc(methodinfo *m, codegendata *cd, registerdata *rd); +#ifdef __cplusplus +} +#endif #endif /* _REG_H */ @@ -150,4 +157,5 @@ void regalloc(methodinfo *m, codegendata *cd, registerdata *rd); * c-basic-offset: 4 * tab-width: 4 * End: + * vim:noexpandtab:sw=4:ts=4: */