1 /* src/vm/jit/intrp/intrp.h - definitions for Interpreter
3 Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 $Id: intrp.h 7486 2007-03-08 13:50:07Z twisti $
33 /* #define VM_PROFILING */
43 /* we need Cell in some headers below */
45 #if SIZEOF_VOID_P == 8
51 #include "vm/global.h"
53 #include "vm/jit/codegen-common.h"
55 #include "vmcore/class.h"
56 #include "vmcore/method.h"
57 #include "vmcore/references.h"
58 #include "vm/resolve.h"
59 #include "vmcore/linker.h"
66 #define MAYBE_UNUSED __attribute__((unused))
71 #if SIZEOF_VOID_P == 4
82 #define FETCH_DCELL_T(d_,lo,hi,t_) ({ \
84 _d.cells.low = (lo); \
85 _d.cells.high = (hi); \
89 #define STORE_DCELL_T(d_,lo,hi,t_) ({ \
92 (lo) = _d.cells.low; \
93 (hi) = _d.cells.high; \
96 #else /* SIZEOF_VOID_P == 4 */
105 #define FETCH_DCELL_T(d_,lo,hi,t_) ({ (d_) = ((Double_Store)(lo)).t_; })
106 #define STORE_DCELL_T(d_,lo,hi,t_) ({ (lo) = ((Double_Store)(d_)).low; })
108 #endif /* SIZEOF_VOID_P == 4 */
111 #if defined(ENABLE_THREADS)
113 #define global_sp (THREADOBJECT->_global_sp)
115 #else /* defined(ENABLE_THREADS) */
117 #define MAX_STACK_SIZE 128*1024
118 static char stack[MAX_STACK_SIZE];
120 static Cell *_global_sp = (Cell *)(stack+MAX_STACK_SIZE);
121 #define global_sp _global_sp
123 #endif /* defined(ENABLE_THREADS) */
125 #define CLEAR_global_sp (global_sp=NULL)
128 #define vm_twoCell2l(hi,lo,d_) FETCH_DCELL_T(d_,lo,hi,l);
129 #define vm_twoCell2d(hi,lo,d_) FETCH_DCELL_T(d_,lo,hi,d);
131 #define vm_l2twoCell(d_,hi,lo) STORE_DCELL_T(d_,lo,hi,l);
132 #define vm_d2twoCell(d_,hi,lo) STORE_DCELL_T(d_,lo,hi,d);
134 #define vm_Cell2v(cell, v) ((v)=(Cell)(cell))
135 #define vm_Cell2b(cell, b) ((b)=(u1)(Cell)(cell))
136 #define vm_Cell2i(cell, i) ((i)=(s4)(Cell)(cell))
138 #define vm_Cell2aRef(x1,x2) ((x2) = (java_objectheader *)(x1))
139 #define vm_Cell2aArray(x1,x2) ((x2) = (java_arrayheader * )(x1))
140 #define vm_Cell2aaTarget(x1,x2) ((x2) = (Inst ** )(x1))
141 #define vm_Cell2aClass(x1,x2) ((x2) = (classinfo * )(x1))
142 #define vm_Cell2acr(x1,x2) ((x2) = (constant_classref *)(x1))
143 #define vm_Cell2addr(x1,x2) ((x2) = (u1 * )(x1))
144 #define vm_Cell2af(x1,x2) ((x2) = (functionptr )(x1))
145 #define vm_Cell2afi(x1,x2) ((x2) = (fieldinfo * )(x1))
146 #define vm_Cell2am(x1,x2) ((x2) = (methodinfo * )(x1))
147 #define vm_Cell2acell(x1,x2) ((x2) = (Cell * )(x1))
148 #define vm_Cell2ainst(x1,x2) ((x2) = (Inst * )(x1))
149 #define vm_Cell2auf(x1,x2) ((x2) = (unresolved_field * )(x1))
150 #define vm_Cell2aum(x1,x2) ((x2) = (unresolved_method *)(x1))
151 #define vm_Cell2avftbl(x1,x2) ((x2) = (vftbl_t * )(x1))
153 #define vm_ui2Cell(x1,x2) ((x2) = (Cell)(x1))
154 #define vm_v2Cell(x1,x2) ((x2) = (Cell)(x1))
155 #define vm_b2Cell(x1,x2) ((x2) = (Cell)(x1))
156 #define vm_s2Cell(x1,x2) ((x2) = (Cell)(x1))
157 #define vm_i2Cell(x1,x2) ((x2) = (Cell)(x1))
158 #define vm_aRef2Cell(x1,x2) ((x2) = (Cell)(x1))
159 #define vm_aArray2Cell(x1,x2) ((x2) = (Cell)(x1))
160 #define vm_aaTarget2Cell(x1,x2) ((x2) = (Cell)(x1))
161 #define vm_aClass2Cell(x1,x2) ((x2) = (Cell)(x1))
162 #define vm_acr2Cell(x1,x2) ((x2) = (Cell)(x1))
163 #define vm_addr2Cell(x1,x2) ((x2) = (Cell)(x1))
164 #define vm_af2Cell(x1,x2) ((x2) = (Cell)(x1))
165 #define vm_afi2Cell(x1,x2) ((x2) = (Cell)(x1))
166 #define vm_am2Cell(x1,x2) ((x2) = (Cell)(x1))
167 #define vm_acell2Cell(x1,x2) ((x2) = (Cell)(x1))
168 #define vm_ainst2Cell(x1,x2) ((x2) = (Cell)(x1))
169 #define vm_auf2Cell(x1,x2) ((x2) = (Cell)(x1))
170 #define vm_aum2Cell(x1,x2) ((x2) = (Cell)(x1))
171 #define vm_avftbl2Cell(x1,x2) ((x2) = (Cell)(x1))
173 #define vm_Cell2Cell(x1,x2) ((x2)=(Cell)(x1))
175 #define IMM_ARG(access,value) (access)
177 /* for disassembler and tracer */
178 #define VM_IS_INST(inst, n) ((inst) == vm_prim[n])
181 #define gen_BBSTART (cd->lastmcodeptr = NULL, append_dispatch(cd))
182 #define gen_BBEND (finish_ss(cd))
191 #define access_local_int(_offset) \
192 ( *(Cell*)(((u1 *)fp) + (_offset)) )
194 #define access_local_ref(_offset) \
195 ( *(void **)(((u1 *)fp) + (_offset)) )
197 #define access_local_cell(_offset) \
198 ( *(Cell *)(((u1 *)fp) + (_offset)) )
201 typedef struct block_count block_count;
203 #define vm_f2Cell(x1,x2) ((x2) =(((union Cell_float)(x1)).cell))
204 #define vm_Cell2f(x1,x2) ((x2) =(((union Cell_float)(x1)).f))
206 extern Inst *vm_prim;
207 extern Cell peeptable;
210 /* defined in peephole.c: */
211 void init_peeptable(void);
212 ptrint peephole_opt(ptrint inst1, ptrint inst2, Cell peeptable);
214 /* defined in engine.c: */
215 java_objectheader *engine(Inst *ip0, Cell * sp, Cell * fp);
217 /* defined in disass.c: */
218 void vm_disassemble(Inst *ip, Inst *endp, Inst vm_prim[]);
219 Inst *vm_disassemble_inst(Inst *ip, Inst vm_prim[]);
221 /* print types for disassembler and tracer */
222 void printarg_ui (u4 ui );
223 void printarg_v (Cell v );
224 void printarg_b (s4 b );
225 void printarg_s (s4 s );
226 void printarg_i (s4 i );
227 void printarg_l (s8 l );
228 void printarg_f (float f );
229 void printarg_d (double d );
230 void printarg_aRef (java_objectheader *aRef );
231 void printarg_aArray (java_arrayheader * aArray );
232 void printarg_aaTarget(Inst ** aaTarget);
233 void printarg_aClass (classinfo * aClass );
234 void printarg_acr (constant_classref *acr );
235 void printarg_addr (u1 * addr );
236 void printarg_af (functionptr af );
237 void printarg_afi (fieldinfo * afi );
238 void printarg_am (methodinfo * am );
239 void printarg_acell (Cell * acell );
240 void printarg_ainst (Inst * ainst );
241 void printarg_auf (unresolved_field * auf );
242 void printarg_aum (unresolved_method *aum );
243 void printarg_avftbl (vftbl_t * avftbl );
244 void printarg_Cell (Cell x );
246 /* defined in profile.c: */
247 void vm_uncount_block(Inst *ip);
248 block_count *vm_block_insert(Inst *ip);
250 /* defined in codegen.c: */
251 Cell *nativecall(functionptr f, methodinfo *m, Cell *sp, Inst *ra, Cell *fp, u1 *addrcif);
252 u1 *createcalljavafunction(methodinfo *m);
254 /* defined in asmpart.c: */
255 Inst *intrp_asm_handle_exception(Inst *ip, java_objectheader *o, Cell *fp, Cell **new_spp, Cell **new_fpp);
257 /* defined in dynamic-super.c: */
258 void gen_inst(codegendata *cd, ptrint instr);
259 void append_dispatch(codegendata *cd);
260 void finish_ss(codegendata *cd);
261 void patchersuper_rewrite(Inst *p);
262 void dynamic_super_init(void);
263 void dynamic_super_rewrite(codegendata *cd);
265 #endif /* _INTRP_H */
269 * These are local overrides for various environment variables in Emacs.
270 * Please do not remove this and leave it at the end of the file, where
271 * Emacs will automagically detect them.
272 * ---------------------------------------------------------------------
275 * indent-tabs-mode: t
279 * vim:noexpandtab:sw=4:ts=4: