* builtin_new: Removed i386 asm_builtin_new define
[cacao.git] / src / vm / builtin.h
1 /* src/vm/builtin.h - prototypes of builtin functions
2
3    Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4    R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5    C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6    Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
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.
14
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.
19
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., 59 Temple Place - Suite 330, Boston, MA
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: Reinhard Grafl
28
29    Changes: Edwin Steiner
30             Christian Thalinger
31
32    $Id: builtin.h 3133 2005-08-23 14:34:49Z cacao $
33
34 */
35
36
37 #ifndef _BUILTIN_H
38 #define _BUILTIN_H
39
40 #include "arch.h"
41 #include "config.h"
42 #include "toolbox/logging.h"
43
44 #if defined(USE_THREADS)
45 # if defined(NATIVE_THREADS)
46 #  include "threads/native/threads.h"
47 # else
48 #  include "threads/green/threads.h"
49 # endif
50 #endif
51
52 #include "vm/jit/stacktrace.h"
53
54
55 /* define infinity for floating point numbers */
56
57 #define FLT_NAN     0x7fc00000
58 #define FLT_POSINF  0x7f800000
59 #define FLT_NEGINF  0xff800000
60
61 /* define infinity for double floating point numbers */
62
63 #define DBL_NAN     0x7ff8000000000000LL
64 #define DBL_POSINF  0x7ff0000000000000LL
65 #define DBL_NEGINF  0xfff0000000000000LL
66
67
68 /* float versions are not defined in GNU classpath's fdlibm */
69
70 #define copysignf    copysign
71 #define finitef      finite
72 #define fmodf        fmod
73 #define isnanf       isnan
74
75
76 /* builtin functions table ****************************************************/
77
78 typedef struct builtintable_entry builtintable_entry;
79
80 struct builtintable_entry {
81         s4           opcode;                /* opcode which is replaced           */
82         functionptr  fp;                    /* function pointer of builtin        */
83         char        *descriptor;
84         char        *name;
85         methoddesc  *md;
86 };
87
88
89 /* function prototypes ********************************************************/
90
91 bool builtin_init(void);
92
93 builtintable_entry *builtintable_get_internal(functionptr fp);
94 builtintable_entry *builtintable_get_automatic(s4 opcode);
95
96
97 /**********************************************************************/
98 /* BUILTIN FUNCTIONS                                                  */
99 /**********************************************************************/
100
101 /* NOTE: Builtin functions which are used in the BUILTIN* opcodes must
102  * have a BUILTIN_... macro defined as seen below. In code dealing
103  * with the BUILTIN* opcodes the functions may only be addressed by
104  * these macros, never by their actual name! (This helps to make this
105  * code more portable.)
106  *
107  * C and assembler code which does not deal with the BUILTIN* opcodes,
108  * can use the builtin functions normally (like all other functions).
109  *
110  * IMPORTANT:
111  * For each builtin function which is used in a BUILTIN* opcode there
112  * must be an entry in the builtin_desc table in jit/jit.c.
113  *
114  * Below each prototype is either the BUILTIN_ macro definition or a
115  * comment specifiying that this function is not used in BUILTIN*
116  * opcodes.
117  *
118  * (The BUILTIN* opcodes are ICMD_BUILTIN1, ICMD_BUILTIN2 and
119  * ICMD_BUILTIN3.)
120  */
121
122 s4 builtin_instanceof(java_objectheader *obj, classinfo *class);
123 #define BUILTIN_instanceof (functionptr) builtin_instanceof
124 s4 builtin_isanysubclass (classinfo *sub, classinfo *super);
125 /* NOT AN OP */
126 s4 builtin_isanysubclass_vftbl (vftbl_t *sub, vftbl_t *super);
127 /* NOT AN OP */
128 s4 builtin_checkcast(java_objectheader *obj, classinfo *class);
129 /* NOT AN OP */
130 s4 builtin_arrayinstanceof(java_objectheader *obj, vftbl_t *target);
131 #define BUILTIN_arrayinstanceof (functionptr) builtin_arrayinstanceof
132 s4 builtin_arraycheckcast(java_objectheader *o, vftbl_t *target);
133 #define BUILTIN_arraycheckcast (functionptr) builtin_arraycheckcast
134
135 java_objectheader *builtin_throw_exception(java_objectheader *exception);
136 /* NOT AN OP */
137 java_objectheader *builtin_trace_exception(java_objectheader *xptr,
138                                                                                    methodinfo *m,
139                                                                                    void *pos,
140                                                                                    s4 line,
141                                                                                    s4 noindent);
142 /* NOT AN OP */
143
144 java_objectheader *builtin_new(classinfo *c);
145 #define BUILTIN_new (functionptr) builtin_new
146
147 java_arrayheader *builtin_newarray(s4 size, vftbl_t *arrayvftbl);
148 #define BUILTIN_newarray (functionptr) builtin_newarray
149
150 java_objectarray *builtin_anewarray(s4 size, classinfo *component);
151 #define BUILTIN_anewarray (functionptr) builtin_anewarray
152
153 java_booleanarray *builtin_newarray_boolean(s4 size);
154 #define BUILTIN_newarray_boolean (functionptr) builtin_newarray_boolean
155 java_chararray *builtin_newarray_char(s4 size);
156 #define BUILTIN_newarray_char (functionptr) builtin_newarray_char
157 java_floatarray *builtin_newarray_float(s4 size);
158 #define BUILTIN_newarray_float (functionptr) builtin_newarray_float
159 java_doublearray *builtin_newarray_double(s4 size);
160 #define BUILTIN_newarray_double (functionptr) builtin_newarray_double
161 java_bytearray *builtin_newarray_byte(s4 size);
162 #define BUILTIN_newarray_byte (functionptr) builtin_newarray_byte
163 java_shortarray *builtin_newarray_short(s4 size);
164 #define BUILTIN_newarray_short (functionptr) builtin_newarray_short
165 java_intarray *builtin_newarray_int(s4 size);
166 #define BUILTIN_newarray_int (functionptr) builtin_newarray_int
167 java_longarray *builtin_newarray_long(s4 size);
168 #define BUILTIN_newarray_long (functionptr) builtin_newarray_long
169
170 java_arrayheader *builtin_multianewarray(int n, vftbl_t *arrayvftbl, long *dims);
171 #define BUILTIN_multianewarray (functionptr) builtin_multianewarray
172
173 s4 builtin_canstore(java_objectarray *a, java_objectheader *o);
174 #define BUILTIN_canstore (functionptr) builtin_canstore
175
176 #if defined(TRACE_ARGS_NUM)
177 void builtin_trace_args(s8 a0, s8 a1,
178 #if TRACE_ARGS_NUM >= 4
179                                                 s8 a2, s8 a3,
180 #endif /* TRACE_ARGS_NUM >= 4 */
181 #if TRACE_ARGS_NUM >= 6
182                                                 s8 a4, s8 a5,
183 #endif /* TRACE_ARGS_NUM >= 6 */
184 #if TRACE_ARGS_NUM == 8
185                                                 s8 a6, s8 a7,
186 #endif /* TRACE_ARGS_NUM == 8 */
187                                                 methodinfo *m);
188 /* NOT AN OP */
189 #endif /* defined(TRACE_ARGS_NUM) */
190
191 void builtin_displaymethodstop(methodinfo *m, s8 l, double d, float f);
192 /* NOT AN OP */
193
194 #if defined(USE_THREADS)
195 void builtin_monitorenter(java_objectheader *o);
196 #define BUILTIN_monitorenter (functionptr) builtin_monitorenter
197 void builtin_staticmonitorenter(classinfo *c);
198 #define BUILTIN_staticmonitorenter (functionptr) builtin_staticmonitorenter
199 void builtin_monitorexit(java_objectheader *o);
200 #define BUILTIN_monitorexit (functionptr) builtin_monitorexit
201 #endif
202
203 s4 builtin_idiv(s4 a, s4 b);
204 #define BUILTIN_idiv (functionptr) builtin_idiv
205 s4 builtin_irem(s4 a, s4 b);
206 #define BUILTIN_irem (functionptr) builtin_irem
207
208 s8 builtin_ladd(s8 a, s8 b);
209 #define BUILTIN_ladd (functionptr) builtin_ladd
210 s8 builtin_lsub(s8 a, s8 b);
211 #define BUILTIN_lsub (functionptr) builtin_lsub
212 s8 builtin_lmul(s8 a, s8 b);
213 #define BUILTIN_lmul (functionptr) builtin_lmul
214
215 s8 builtin_ldiv(s8 a, s8 b);
216 #define BUILTIN_ldiv (functionptr) builtin_ldiv
217 s8 builtin_lrem(s8 a, s8 b);
218 #define BUILTIN_lrem (functionptr) builtin_lrem
219
220 s8 builtin_lshl(s8 a, s4 b);
221 #define BUILTIN_lshl (functionptr) builtin_lshl
222 s8 builtin_lshr(s8 a, s4 b);
223 #define BUILTIN_lshr (functionptr) builtin_lshr
224 s8 builtin_lushr(s8 a, s4 b);
225 #define BUILTIN_lushr (functionptr) builtin_lushr
226 s8 builtin_land(s8 a, s8 b);
227 #define BUILTIN_land (functionptr) builtin_land
228 s8 builtin_lor(s8 a, s8 b);
229 #define BUILTIN_lor (functionptr) builtin_lor
230 s8 builtin_lxor(s8 a, s8 b);
231 #define BUILTIN_lxor (functionptr) builtin_lxor
232 s8 builtin_lneg(s8 a);
233 #define BUILTIN_lneg (functionptr) builtin_lneg
234 s4 builtin_lcmp(s8 a, s8 b);
235 #define BUILTIN_lcmp (functionptr) builtin_lcmp
236
237 float builtin_fadd(float a, float b);
238 #define BUILTIN_fadd (functionptr) builtin_fadd
239 float builtin_fsub(float a, float b);
240 #define BUILTIN_fsub (functionptr) builtin_fsub
241 float builtin_fmul(float a, float b);
242 #define BUILTIN_fmul (functionptr) builtin_fmul
243 float builtin_fdiv(float a, float b);
244 #define BUILTIN_fdiv (functionptr) builtin_fdiv
245 float builtin_fneg(float a);         
246 #define BUILTIN_fneg (functionptr) builtin_fneg
247 s4 builtin_fcmpl(float a, float b);  
248 #define BUILTIN_fcmpl (functionptr) builtin_fcmpl
249 s4 builtin_fcmpg(float a, float b);  
250 #define BUILTIN_fcmpg (functionptr) builtin_fcmpg
251 float builtin_frem(float a, float b);
252 #define BUILTIN_frem (functionptr) builtin_frem
253
254 double builtin_dadd(double a, double b);
255 #define BUILTIN_dadd (functionptr) builtin_dadd
256 double builtin_dsub(double a, double b);
257 #define BUILTIN_dsub (functionptr) builtin_dsub
258 double builtin_dmul(double a, double b);
259 #define BUILTIN_dmul (functionptr) builtin_dmul
260 double builtin_ddiv(double a, double b);
261 #define BUILTIN_ddiv (functionptr) builtin_ddiv
262 double builtin_dneg(double a);          
263 #define BUILTIN_dneg (functionptr) builtin_dneg
264 s4 builtin_dcmpl(double a, double b);   
265 #define BUILTIN_dcmpl (functionptr) builtin_dcmpl
266 s4 builtin_dcmpg(double a, double b);   
267 #define BUILTIN_dcmpg (functionptr) builtin_dcmpg
268 double builtin_drem(double a, double b);
269 #define BUILTIN_drem (functionptr) builtin_drem
270
271 s8       builtin_i2l(s4 i);
272 /* NOT AN OP */
273 float    builtin_i2f(s4 i);
274 #define BUILTIN_i2f (functionptr) builtin_i2f
275 double   builtin_i2d(s4 i);
276 #define BUILTIN_i2d (functionptr) builtin_i2d
277 s4       builtin_l2i(s8 l);
278 /* NOT AN OP */
279 float    builtin_l2f(s8 l);
280 #define BUILTIN_l2f (functionptr) builtin_l2f
281 double   builtin_l2d(s8 l);
282 #define BUILTIN_l2d (functionptr) builtin_l2d
283
284 s4       builtin_f2i(float a);
285 #define BUILTIN_f2i (functionptr) builtin_f2i
286 s4       asm_builtin_f2i(float a);
287 /* NOT AN OP */
288 s8       builtin_f2l(float a);
289 #define BUILTIN_f2l (functionptr) builtin_f2l
290 s8       asm_builtin_f2l(float a);
291 /* NOT AN OP */
292
293 double   builtin_f2d(float a);
294 #define BUILTIN_f2d (functionptr) builtin_f2d
295
296 s4       builtin_d2i(double a);
297 #define BUILTIN_d2i (functionptr) builtin_d2i
298 s4       asm_builtin_d2i(double a);
299 /* NOT AN OP */
300 s8       builtin_d2l(double a);
301 #define BUILTIN_d2l (functionptr) builtin_d2l
302 s8       asm_builtin_d2l(double a);
303 /* NOT AN OP */
304
305 float    builtin_d2f(double a);
306 #define BUILTIN_d2f (functionptr) builtin_d2f
307
308 java_arrayheader *builtin_clone_array(void *env, java_arrayheader *o);
309 /* NOT AN OP */
310
311 /* conversion helper functions */
312 inline float intBitsToFloat(s4 i);
313 inline float longBitsToDouble(s8 l);
314
315 /* this is a wrapper for calls from asmpart */
316 java_objectheader **builtin_asm_get_exceptionptrptr(void);
317
318 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
319 static inline java_objectheader **builtin_get_exceptionptrptr(void);
320 static inline u1 *builtin_get_dontfillinexceptionstacktrace(void);
321 /* NOT AN OP */
322 static inline methodinfo **builtin_get_threadrootmethod(void);
323 /* NOT AN OP */
324
325 inline java_objectheader **builtin_get_exceptionptrptr(void)
326 {
327         return &THREADINFO->_exceptionptr;
328 }
329
330 inline u1 *builtin_get_dontfillinexceptionstacktrace(void)
331 {
332         return &THREADINFO->_dontfillinexceptionstacktrace;
333 }
334
335 inline methodinfo **builtin_get_threadrootmethod(void)
336 {
337         return &THREADINFO->_threadrootmethod;
338 }
339 #endif
340
341
342 /* returns the root method of a thread. this is used in asmpart.S and delivers the abort condition
343    for the stack unwinding for getClassContext and getClassLoader. For the main thread this is the main function.
344    Otherwhise it is the thread's run method (at least that's how I see it) (jowenn) */
345 methodinfo *builtin_asm_get_threadrootmethod(void);
346
347 /* returns the current top element of the stack frame info list (needed for unwinding across native functions) */
348 /* on i386 this is a pointer to a structure 
349                 ------------------------------------------------
350                 | return adress out of native stub              |
351                 | pointer to method info                        | either i have to save an arbitrary adress within this native stub or the pointer to the method info, both are equaly costly, I have chosen the method  info (JOWENN)
352                 | pointer to thread specific top of this list   |<----stack frame begin
353 points here---->| previous element in list                      |
354                 ------------------------------------------------
355 */
356 void *builtin_asm_get_stackframeinfo(void);
357 stacktraceelement *builtin_stacktrace_copy(stacktraceelement **el,
358                                                                                    stacktraceelement *begin,
359                                                                                    stacktraceelement *end);
360
361 #endif /* _BUILTIN_H */
362
363
364 /*
365  * These are local overrides for various environment variables in Emacs.
366  * Please do not remove this and leave it at the end of the file, where
367  * Emacs will automagically detect them.
368  * ---------------------------------------------------------------------
369  * Local variables:
370  * mode: c
371  * indent-tabs-mode: t
372  * c-basic-offset: 4
373  * tab-width: 4
374  * End:
375  */