1 /* src/vm/builtin.h - prototypes of builtin functions
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
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., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Reinhard Grafl
29 Changes: Edwin Steiner
32 $Id: builtin.h 2558 2005-06-06 15:00:29Z twisti $
42 #include "toolbox/logging.h"
44 #if defined(USE_THREADS)
45 # if defined(NATIVE_THREADS)
46 # include "threads/native/threads.h"
48 # include "threads/green/threads.h"
52 #include "vm/jit/stacktrace.h"
55 /* define infinity for floating point numbers */
57 #define FLT_NAN 0x7fc00000
58 #define FLT_POSINF 0x7f800000
59 #define FLT_NEGINF 0xff800000
61 /* define infinity for double floating point numbers */
63 #define DBL_NAN 0x7ff8000000000000LL
64 #define DBL_POSINF 0x7ff0000000000000LL
65 #define DBL_NEGINF 0xfff0000000000000LL
68 /* float versions are not defined in gnu classpath's fdlibm */
70 #define copysignf copysign
71 #define finitef finite
76 /* builtin functions table ****************************************************/
78 typedef struct builtintable_entry builtintable_entry;
80 struct builtintable_entry {
81 s4 opcode; /* opcode which is replaced */
82 functionptr fp; /* function pointer of builtin */
89 /* function prototypes ********************************************************/
91 bool builtin_init(void);
93 builtintable_entry *builtintable_get_internal(functionptr fp);
94 builtintable_entry *builtintable_get_automatic(s4 opcode);
97 /**********************************************************************/
98 /* BUILTIN FUNCTIONS */
99 /**********************************************************************/
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.)
107 * C and assembler code which does not deal with the BUILTIN* opcodes,
108 * can use the builtin functions normally (like all other functions).
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.
114 * Below each prototype is either the BUILTIN_ macro definition or a
115 * comment specifiying that this function is not used in BUILTIN*
118 * (The BUILTIN* opcodes are ICMD_BUILTIN1, ICMD_BUILTIN2 and
122 s4 builtin_instanceof(java_objectheader *obj, classinfo *class);
123 #define BUILTIN_instanceof (functionptr) builtin_instanceof
124 s4 builtin_isanysubclass (classinfo *sub, classinfo *super);
126 s4 builtin_isanysubclass_vftbl (vftbl_t *sub, vftbl_t *super);
128 s4 builtin_checkcast(java_objectheader *obj, classinfo *class);
130 s4 builtin_arrayinstanceof(java_objectheader *obj, vftbl_t *target);
131 #define BUILTIN_arrayinstanceof (functionptr) builtin_arrayinstanceof
133 s4 builtin_arraycheckcast(java_objectheader *o, vftbl_t *target);
135 s4 asm_builtin_arraycheckcast(java_objectheader *o, vftbl_t *target);
136 #define BUILTIN_arraycheckcast (functionptr) asm_builtin_arraycheckcast
138 java_objectheader *builtin_throw_exception(java_objectheader *exception);
140 java_objectheader *builtin_trace_exception(java_objectheader *xptr,
147 java_objectheader *builtin_new(classinfo *c);
148 /* #if defined(__I386__) */
149 /* java_objectheader *asm_builtin_new(classinfo *c); */
150 /* #define BUILTIN_new (functionptr) asm_builtin_new */
152 #define BUILTIN_new (functionptr) builtin_new
155 java_arrayheader *builtin_newarray(s4 size, vftbl_t *arrayvftbl);
156 #define BUILTIN_newarray (functionptr) builtin_newarray
158 java_objectarray *builtin_anewarray(s4 size, classinfo *component);
159 #define BUILTIN_anewarray (functionptr) builtin_anewarray
161 java_booleanarray *builtin_newarray_boolean(s4 size);
162 #define BUILTIN_newarray_boolean (functionptr) builtin_newarray_boolean
163 java_chararray *builtin_newarray_char(s4 size);
164 #define BUILTIN_newarray_char (functionptr) builtin_newarray_char
165 java_floatarray *builtin_newarray_float(s4 size);
166 #define BUILTIN_newarray_float (functionptr) builtin_newarray_float
167 java_doublearray *builtin_newarray_double(s4 size);
168 #define BUILTIN_newarray_double (functionptr) builtin_newarray_double
169 java_bytearray *builtin_newarray_byte(s4 size);
170 #define BUILTIN_newarray_byte (functionptr) builtin_newarray_byte
171 java_shortarray *builtin_newarray_short(s4 size);
172 #define BUILTIN_newarray_short (functionptr) builtin_newarray_short
173 java_intarray *builtin_newarray_int(s4 size);
174 #define BUILTIN_newarray_int (functionptr) builtin_newarray_int
175 java_longarray *builtin_newarray_long(s4 size);
176 #define BUILTIN_newarray_long (functionptr) builtin_newarray_long
177 java_arrayheader *builtin_multianewarray(int n, vftbl_t *arrayvftbl, long *dims);
178 #define BUILTIN_multianewarray (functionptr) builtin_multianewarray
180 s4 builtin_canstore(java_objectarray *a, java_objectheader *o);
182 void asm_builtin_aastore(java_objectarray *a, s4 index, java_objectheader *o);
183 #define BUILTIN_aastore (functionptr) asm_builtin_aastore
185 #if defined(TRACE_ARGS_NUM)
186 void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
187 #if TRACE_ARGS_NUM >= 6
189 #endif /* TRACE_ARGS_NUM >= 6 */
190 #if TRACE_ARGS_NUM == 8
192 #endif /* TRACE_ARGS_NUM == 8 */
195 #endif /* defined(TRACE_ARGS_NUM) */
197 void builtin_displaymethodstop(methodinfo *m, s8 l, double d, float f);
200 #if defined(USE_THREADS)
201 void builtin_monitorenter(java_objectheader *o);
202 #define BUILTIN_monitorenter (functionptr) builtin_monitorenter
203 void builtin_staticmonitorenter(classinfo *c);
204 #define BUILTIN_staticmonitorenter (functionptr) builtin_staticmonitorenter
205 void builtin_monitorexit(java_objectheader *o);
206 #define BUILTIN_monitorexit (functionptr) builtin_monitorexit
209 s4 builtin_idiv(s4 a, s4 b);
211 s4 asm_builtin_idiv(s4 a, s4 b);
212 #define BUILTIN_idiv (functionptr) asm_builtin_idiv
213 s4 builtin_irem(s4 a, s4 b);
215 s4 asm_builtin_irem(s4 a, s4 b);
216 #define BUILTIN_irem (functionptr) asm_builtin_irem
218 s8 builtin_ladd(s8 a, s8 b);
219 #define BUILTIN_ladd (functionptr) builtin_ladd
220 s8 builtin_lsub(s8 a, s8 b);
221 #define BUILTIN_lsub (functionptr) builtin_lsub
222 s8 builtin_lmul(s8 a, s8 b);
223 #define BUILTIN_lmul (functionptr) builtin_lmul
224 s8 builtin_ldiv(s8 a, s8 b);
226 s8 asm_builtin_ldiv(s8 a, s8 b);
227 #define BUILTIN_ldiv (functionptr) asm_builtin_ldiv
228 s8 builtin_lrem(s8 a, s8 b);
230 s8 asm_builtin_lrem(s8 a, s8 b);
231 #define BUILTIN_lrem (functionptr) asm_builtin_lrem
232 s8 builtin_lshl(s8 a, s4 b);
233 #define BUILTIN_lshl (functionptr) builtin_lshl
234 s8 builtin_lshr(s8 a, s4 b);
235 #define BUILTIN_lshr (functionptr) builtin_lshr
236 s8 builtin_lushr(s8 a, s4 b);
237 #define BUILTIN_lushr (functionptr) builtin_lushr
238 s8 builtin_land(s8 a, s8 b);
239 #define BUILTIN_land (functionptr) builtin_land
240 s8 builtin_lor(s8 a, s8 b);
241 #define BUILTIN_lor (functionptr) builtin_lor
242 s8 builtin_lxor(s8 a, s8 b);
243 #define BUILTIN_lxor (functionptr) builtin_lxor
244 s8 builtin_lneg(s8 a);
245 #define BUILTIN_lneg (functionptr) builtin_lneg
246 s4 builtin_lcmp(s8 a, s8 b);
247 #define BUILTIN_lcmp (functionptr) builtin_lcmp
249 float builtin_fadd(float a, float b);
250 #define BUILTIN_fadd (functionptr) builtin_fadd
251 float builtin_fsub(float a, float b);
252 #define BUILTIN_fsub (functionptr) builtin_fsub
253 float builtin_fmul(float a, float b);
254 #define BUILTIN_fmul (functionptr) builtin_fmul
255 float builtin_fdiv(float a, float b);
256 #define BUILTIN_fdiv (functionptr) builtin_fdiv
257 float builtin_fneg(float a);
258 #define BUILTIN_fneg (functionptr) builtin_fneg
259 s4 builtin_fcmpl(float a, float b);
260 #define BUILTIN_fcmpl (functionptr) builtin_fcmpl
261 s4 builtin_fcmpg(float a, float b);
262 #define BUILTIN_fcmpg (functionptr) builtin_fcmpg
263 float builtin_frem(float a, float b);
264 #define BUILTIN_frem (functionptr) builtin_frem
266 double builtin_dadd(double a, double b);
267 #define BUILTIN_dadd (functionptr) builtin_dadd
268 double builtin_dsub(double a, double b);
269 #define BUILTIN_dsub (functionptr) builtin_dsub
270 double builtin_dmul(double a, double b);
271 #define BUILTIN_dmul (functionptr) builtin_dmul
272 double builtin_ddiv(double a, double b);
273 #define BUILTIN_ddiv (functionptr) builtin_ddiv
274 double builtin_dneg(double a);
275 #define BUILTIN_dneg (functionptr) builtin_dneg
276 s4 builtin_dcmpl(double a, double b);
277 #define BUILTIN_dcmpl (functionptr) builtin_dcmpl
278 s4 builtin_dcmpg(double a, double b);
279 #define BUILTIN_dcmpg (functionptr) builtin_dcmpg
280 double builtin_drem(double a, double b);
281 #define BUILTIN_drem (functionptr) builtin_drem
283 s8 builtin_i2l(s4 i);
285 float builtin_i2f(s4 i);
286 #define BUILTIN_i2f (functionptr) builtin_i2f
287 double builtin_i2d(s4 i);
288 #define BUILTIN_i2d (functionptr) builtin_i2d
289 s4 builtin_l2i(s8 l);
291 float builtin_l2f(s8 l);
292 #define BUILTIN_l2f (functionptr) builtin_l2f
293 double builtin_l2d(s8 l);
294 #define BUILTIN_l2d (functionptr) builtin_l2d
296 s4 builtin_f2i(float a);
297 #define BUILTIN_f2i (functionptr) builtin_f2i
298 s4 asm_builtin_f2i(float a);
300 s8 builtin_f2l(float a);
301 #define BUILTIN_f2l (functionptr) builtin_f2l
302 s8 asm_builtin_f2l(float a);
305 double builtin_f2d(float a);
306 #define BUILTIN_f2d (functionptr) builtin_f2d
308 s4 builtin_d2i(double a);
309 #define BUILTIN_d2i (functionptr) builtin_d2i
310 s4 asm_builtin_d2i(double a);
312 s8 builtin_d2l(double a);
313 #define BUILTIN_d2l (functionptr) builtin_d2l
314 s8 asm_builtin_d2l(double a);
317 float builtin_d2f(double a);
318 #define BUILTIN_d2f (functionptr) builtin_d2f
320 java_arrayheader *builtin_clone_array(void *env, java_arrayheader *o);
323 /* builtin_dummy just exits if it is executed. */
324 s4 builtin_dummy(void);
327 /* conversion helper functions */
328 inline float intBitsToFloat(s4 i);
329 inline float longBitsToDouble(s8 l);
331 /* this is a wrapper for calls from asmpart */
332 java_objectheader **builtin_asm_get_exceptionptrptr(void);
334 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
335 static inline java_objectheader **builtin_get_exceptionptrptr(void);
336 static inline u1 *builtin_get_dontfillinexceptionstacktrace(void);
338 static inline methodinfo **builtin_get_threadrootmethod(void);
341 inline java_objectheader **builtin_get_exceptionptrptr(void)
343 return &THREADINFO->_exceptionptr;
346 inline u1 *builtin_get_dontfillinexceptionstacktrace(void)
348 return &THREADINFO->_dontfillinexceptionstacktrace;
351 inline methodinfo **builtin_get_threadrootmethod(void)
353 return &THREADINFO->_threadrootmethod;
358 /* returns the root method of a thread. this is used in asmpart.S and delivers the abort condition
359 for the stack unwinding for getClassContext and getClassLoader. For the main thread this is the main function.
360 Otherwhise it is the thread's run method (at least that's how I see it) (jowenn) */
361 methodinfo *builtin_asm_get_threadrootmethod(void);
363 /* returns the current top element of the stack frame info list (needed for unwinding across native functions) */
364 /* on i386 this is a pointer to a structure
365 ------------------------------------------------
366 | return adress out of native stub |
367 | 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)
368 | pointer to thread specific top of this list |<----stack frame begin
369 points here---->| previous element in list |
370 ------------------------------------------------
372 void *builtin_asm_get_stackframeinfo(void);
373 stacktraceelement *builtin_stacktrace_copy(stacktraceelement **,stacktraceelement *begin, stacktraceelement *end);
374 #endif /* _BUILTIN_H */
378 * These are local overrides for various environment variables in Emacs.
379 * Please do not remove this and leave it at the end of the file, where
380 * Emacs will automagically detect them.
381 * ---------------------------------------------------------------------
384 * indent-tabs-mode: t