Merged trunk and subtype.
[cacao.git] / src / vm / jit / reg.h
1 /* src/vm/jit/reg.h - register allocator header
2
3    Copyright (C) 1996-2005, 2006, 2007, 2008
4    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5
6    This file is part of CACAO.
7
8    This program is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2, or (at
11    your option) any later version.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23 */
24
25
26 #ifndef _REG_H
27 #define _REG_H
28
29 /* forward typedefs ***********************************************************/
30
31 typedef struct varinfo varinfo;
32 typedef struct registerdata registerdata;
33
34
35 #include "config.h"
36 #include "vm/types.h"
37
38 #include "arch.h"
39
40 #include "vm/jit/jit.hpp"
41 #include "vm/jit/verify/typeinfo.h"
42
43
44 /************************* pseudo variable structure **************************/
45
46 struct varinfo {
47         s4 type;                   /* basic type of variable                     */
48         s4 flags;                  /* flags (SAVED, INMEMORY)                    */
49         union {
50                 s4 regoff;             /* register number or memory offset           */
51                 s4 i;
52                 s8 l;
53                 float f;
54                 double d;
55                 basicblock *retaddr;
56                 s4 ii[2];
57         } vv;
58 #if defined(ENABLE_VERIFIER)
59         typeinfo_t typeinfo;       /* type info for reference types              */
60 #endif
61 };
62
63 typedef struct varinfo varinfo5[5];
64
65
66 struct registerdata {
67         int intreg_ret;                 /* register to return integer values      */
68         int fltreg_ret;                 /* register for return float values       */
69
70         int *tmpintregs;                /* scratch integer registers              */
71         int *savintregs;                /* saved integer registers                */
72         int *tmpfltregs;                /* scratch float registers                */
73         int *savfltregs;                /* saved float registers                  */
74         int *freeargintregs;            /* free argument integer registers        */
75         int *freetmpintregs;            /* free scratch integer registers         */
76         int *freesavintregs;            /* free saved integer registers           */
77         int *freeargfltregs;            /* free argument float registers          */
78         int *freetmpfltregs;            /* free scratch float registers           */
79         int *freesavfltregs;            /* free saved float registers             */
80
81 #ifdef HAS_ADDRESS_REGISTER_FILE
82         int adrreg_ret;                 /* register to return address values      */
83
84         int *argadrregs;                /* argument address registers             */
85         int *tmpadrregs;                /* scratch address registers              */
86         int *savadrregs;                /* saved address registers                */
87         int *freeargadrregs;            /* free argument address registers        */
88         int *freetmpadrregs;            /* free scratch address registers         */
89         int *freesavadrregs;            /* free saved address registers           */
90
91         int *adrusedinout;              /* is this adr register uses as INOUT?    */
92
93         int argadrreguse;               /* used argument address register count   */
94         int tmpadrreguse;               /* used scratch address register count    */
95         int savadrreguse;               /* used saved address register count      */
96
97         int freetmpadrtop;              /* free scratch address register count    */
98         int freesavadrtop;              /* free saved address register count      */
99         int freeargadrtop;              /* free argument address register count   */
100 #endif
101
102 #if defined(HAS_4BYTE_STACKSLOT)
103         int *freemem_2;
104         int freememtop_2;
105 #endif
106         int *freemem;                   /* free scratch memory                    */
107         int freememtop;                 /* free memory count                      */
108
109         int memuse;                     /* used memory count                      */
110
111         int argintreguse;               /* used argument integer register count   */
112         int tmpintreguse;               /* used scratch integer register count    */
113         int savintreguse;               /* used saved integer register count      */
114         int argfltreguse;               /* used argument float register count     */
115         int tmpfltreguse;               /* used scratch float register count      */
116         int savfltreguse;               /* used saved float register count        */
117
118         int freearginttop;              /* free argument integer register count   */
119         int freeargflttop;              /* free argument float register count     */
120         int freetmpinttop;              /* free scratch integer register count    */
121         int freesavinttop;              /* free saved integer register count      */
122         int freetmpflttop;              /* free scratch float register count      */
123         int freesavflttop;              /* free saved float register count        */
124
125         int *intusedinout;              /* is this int register uses as INOUT?    */
126         int *fltusedinout;              /* is this flt register uses as INOUT?    */
127         int *regisoutvar;               /* true if reg. is outvar of this block   */
128         int *regcopycount;              /* counts copies of each register regoff  */
129         int *memcopycount;              /* counts copies of each INMEMORY regoff  */
130         int memcopycountsize;           /* size of memcopycount buffer            */
131 };
132
133
134 /* function prototypes ********************************************************/
135
136 #ifdef __cplusplus
137 extern "C" {
138 #endif
139
140 void reg_setup(jitdata *jd);
141
142 #ifdef __cplusplus
143 }
144 #endif
145
146 #endif /* _REG_H */
147
148
149 /*
150  * These are local overrides for various environment variables in Emacs.
151  * Please do not remove this and leave it at the end of the file, where
152  * Emacs will automagically detect them.
153  * ---------------------------------------------------------------------
154  * Local variables:
155  * mode: c
156  * indent-tabs-mode: t
157  * c-basic-offset: 4
158  * tab-width: 4
159  * End:
160  * vim:noexpandtab:sw=4:ts=4:
161  */