1 /* builtin.h - prototypes of builtin functions
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
5 M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
6 P. Tomsich, J. Wenninger
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
31 $Id: builtin.h 963 2004-03-15 07:37:49Z jowenn $
40 #include "toolbox/loging.h"
43 /* define infinity for floating point numbers */
45 #define FLT_NAN 0x7fc00000
46 #define FLT_POSINF 0x7f800000
47 #define FLT_NEGINF 0xff800000
49 /* define infinity for double floating point numbers */
51 #define DBL_NAN 0x7ff8000000000000LL
52 #define DBL_POSINF 0x7ff0000000000000LL
53 #define DBL_NEGINF 0xfff0000000000000LL
56 /* float versions are not defined in gnu classpath's fdlibm */
58 #define copysignf copysign
59 #define finitef finite
64 /**********************************************************************/
65 /* BUILTIN FUNCTIONS TABLE */
66 /**********************************************************************/
69 * For each builtin function which is used in a BUILTIN* opcode there
70 * must be an entry in the builtin_desc table in jit/jit.c.
73 typedef struct builtin_descriptor builtin_descriptor;
75 /* There is a builtin_descriptor in builtin_desc for every builtin
76 * function used in BUILTIN* opcodes.
78 struct builtin_descriptor {
79 int opcode; /* opcode which is replaced by this builtin */
80 /* (255 means no automatic replacement, */
81 /* 0 means end of list.) */
82 functionptr builtin; /* the builtin function (specify BUILTIN_...*/
84 int icmd; /* the BUILTIN* opcode to use (# of args) */
85 u1 type_s1; /* type of 1st argument */
86 u1 type_s2; /* type of 2nd argument, or TYPE_VOID */
87 u1 type_s3; /* type of 3rd argument, or TYPE_VOID */
88 u1 type_d; /* type of result (may be TYPE_VOID) */
89 bool supported;/* is <opcode> supported without builtin? */
90 bool isfloat; /* is this a floating point operation? */
91 char *name; /* display name of the builtin function */
94 extern builtin_descriptor builtin_desc[];
96 /**********************************************************************/
97 /* GLOBAL VARIABLES */
98 /**********************************************************************/
100 #define THREADSPECIFIC
101 #define exceptionptr (&_exceptionptr)
102 #define threadrootmethod (&_threadrootmethod)
104 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
107 #undef THREADSPECIFIC
108 #define THREADSPECIFIC __thread
113 #undef threadrootmethod
114 #define exceptionptr builtin_get_exceptionptrptr()
115 #define threadrootmethod builtin_get_threadrootmethod()
119 extern THREADSPECIFIC java_objectheader* _exceptionptr;
120 extern THREADSPECIFIC methodinfo* _threadrootmethod;
121 extern THREADSPECIFIC void* _threadnativestackframeinfo;
124 /**********************************************************************/
125 /* BUILTIN FUNCTIONS */
126 /**********************************************************************/
128 /* NOTE: Builtin functions which are used in the BUILTIN* opcodes must
129 * have a BUILTIN_... macro defined as seen below. In code dealing
130 * with the BUILTIN* opcodes the functions may only be addressed by
131 * these macros, never by their actual name! (This helps to make this
132 * code more portable.)
134 * C and assembler code which does not deal with the BUILTIN* opcodes,
135 * can use the builtin functions normally (like all other functions).
138 * For each builtin function which is used in a BUILTIN* opcode there
139 * must be an entry in the builtin_desc table in jit/jit.c.
141 * Below each prototype is either the BUILTIN_ macro definition or a
142 * comment specifiying that this function is not used in BUILTIN*
145 * (The BUILTIN* opcodes are ICMD_BUILTIN1, ICMD_BUILTIN2 and
149 s4 builtin_instanceof(java_objectheader *obj, classinfo *class);
150 #define BUILTIN_instanceof (functionptr) builtin_instanceof
151 s4 builtin_isanysubclass (classinfo *sub, classinfo *super);
153 s4 builtin_isanysubclass_vftbl (vftbl *sub, vftbl *super);
155 s4 builtin_checkcast(java_objectheader *obj, classinfo *class);
157 s4 builtin_arrayinstanceof(java_objectheader *obj, vftbl *target);
158 #define BUILTIN_arrayinstanceof (functionptr) builtin_arrayinstanceof
160 #if defined(__I386__)
161 s4 asm_builtin_arrayinstanceof(java_objectheader *obj, classinfo *class); /* XXX ? */
162 #undef BUILTIN_arrayinstanceof
163 #define BUILTIN_arrayinstanceof (functionptr) asm_builtin_arrayinstanceof
166 s4 builtin_checkarraycast(java_objectheader *obj, vftbl *target);
168 s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl *target);
169 #define BUILTIN_checkarraycast (functionptr) asm_builtin_checkarraycast
171 java_objectheader *builtin_throw_exception(java_objectheader *exception);
173 java_objectheader *builtin_trace_exception(java_objectheader *_exceptionptr,
175 int *pos, int line, int noindent);
178 static inline java_objectheader **builtin_get_exceptionptrptr();
179 static inline methodinfo **builtin_get_threadrootmethod();
181 void builtin_reset_exceptionptr();
184 java_objectheader *builtin_new(classinfo *c);
186 java_objectheader *asm_builtin_new(classinfo *c);
187 #define BUILTIN_new (functionptr) asm_builtin_new
189 #define BUILTIN_new (functionptr) builtin_new
192 java_arrayheader *builtin_newarray(s4 size, vftbl *arrayvftbl);
193 #define BUILTIN_newarray (functionptr) builtin_newarray
194 java_objectarray *builtin_anewarray(s4 size, classinfo *component);
197 #if defined(__I386__)
198 void asm_builtin_newarray(s4 size, vftbl *arrayvftbl);
199 #undef BUILTIN_newarray
200 #define BUILTIN_newarray (functionptr) asm_builtin_newarray
203 java_booleanarray *builtin_newarray_boolean(s4 size);
204 #define BUILTIN_newarray_boolean (functionptr) builtin_newarray_boolean
205 java_chararray *builtin_newarray_char(s4 size);
206 #define BUILTIN_newarray_char (functionptr) builtin_newarray_char
207 java_floatarray *builtin_newarray_float(s4 size);
208 #define BUILTIN_newarray_float (functionptr) builtin_newarray_float
209 java_doublearray *builtin_newarray_double(s4 size);
210 #define BUILTIN_newarray_double (functionptr) builtin_newarray_double
211 java_bytearray *builtin_newarray_byte(s4 size);
212 #define BUILTIN_newarray_byte (functionptr) builtin_newarray_byte
213 java_shortarray *builtin_newarray_short(s4 size);
214 #define BUILTIN_newarray_short (functionptr) builtin_newarray_short
215 java_intarray *builtin_newarray_int(s4 size);
216 #define BUILTIN_newarray_int (functionptr) builtin_newarray_int
217 java_longarray *builtin_newarray_long(s4 size);
218 #define BUILTIN_newarray_long (functionptr) builtin_newarray_long
219 java_arrayheader *builtin_nmultianewarray(int n,
220 vftbl *arrayvftbl, long *dims);
223 s4 builtin_canstore(java_objectarray *a, java_objectheader *o);
225 void asm_builtin_aastore(java_objectarray *a, s4 index, java_objectheader *o);
226 #define BUILTIN_aastore (functionptr) asm_builtin_aastore
228 #ifdef TRACE_ARGS_NUM
229 #if TRACE_ARGS_NUM == 6
230 void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5, methodinfo *method);
233 void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5, s8 a6, s8 a7, methodinfo *method);
237 void builtin_displaymethodstart(methodinfo *method);
239 void builtin_displaymethodstop(methodinfo *method, s8 l, double d, float f);
241 /* void builtin_displaymethodstop(methodinfo *method); */
242 void builtin_displaymethodexception(methodinfo *method);
245 void builtin_monitorenter(java_objectheader *o);
247 void asm_builtin_monitorenter(java_objectheader *o);
248 #define BUILTIN_monitorenter (functionptr) asm_builtin_monitorenter
249 void builtin_monitorexit(java_objectheader *o);
251 void asm_builtin_monitorexit(java_objectheader *o);
252 #define BUILTIN_monitorexit (functionptr) asm_builtin_monitorexit
254 s4 builtin_idiv(s4 a, s4 b);
256 s4 asm_builtin_idiv(s4 a, s4 b);
257 #define BUILTIN_idiv (functionptr) asm_builtin_idiv
258 s4 builtin_irem(s4 a, s4 b);
260 s4 asm_builtin_irem(s4 a, s4 b);
261 #define BUILTIN_irem (functionptr) asm_builtin_irem
263 s8 builtin_ladd(s8 a, s8 b);
264 #define BUILTIN_ladd (functionptr) builtin_ladd
265 s8 builtin_lsub(s8 a, s8 b);
266 #define BUILTIN_lsub (functionptr) builtin_lsub
267 s8 builtin_lmul(s8 a, s8 b);
268 #define BUILTIN_lmul (functionptr) builtin_lmul
269 s8 builtin_ldiv(s8 a, s8 b);
271 s8 asm_builtin_ldiv(s8 a, s8 b);
272 #define BUILTIN_ldiv (functionptr) asm_builtin_ldiv
273 s8 builtin_lrem(s8 a, s8 b);
275 s8 asm_builtin_lrem(s8 a, s8 b);
276 #define BUILTIN_lrem (functionptr) asm_builtin_lrem
277 s8 builtin_lshl(s8 a, s4 b);
278 #define BUILTIN_lshl (functionptr) builtin_lshl
279 s8 builtin_lshr(s8 a, s4 b);
280 #define BUILTIN_lshr (functionptr) builtin_lshr
281 s8 builtin_lushr(s8 a, s4 b);
282 #define BUILTIN_lushr (functionptr) builtin_lushr
283 s8 builtin_land(s8 a, s8 b);
284 #define BUILTIN_land (functionptr) builtin_land
285 s8 builtin_lor(s8 a, s8 b);
286 #define BUILTIN_lor (functionptr) builtin_lor
287 s8 builtin_lxor(s8 a, s8 b);
288 #define BUILTIN_lxor (functionptr) builtin_lxor
289 s8 builtin_lneg(s8 a);
290 #define BUILTIN_lneg (functionptr) builtin_lneg
291 s4 builtin_lcmp(s8 a, s8 b);
292 #define BUILTIN_lcmp (functionptr) builtin_lcmp
294 float builtin_fadd(float a, float b);
296 float builtin_fsub(float a, float b);
298 float builtin_fmul(float a, float b);
300 float builtin_fdiv(float a, float b);
302 float builtin_fneg(float a);
304 s4 builtin_fcmpl(float a, float b);
306 s4 builtin_fcmpg(float a, float b);
308 float builtin_frem(float a, float b);
309 #define BUILTIN_frem (functionptr) builtin_frem
311 double builtin_dadd(double a, double b);
313 double builtin_dsub(double a, double b);
315 double builtin_dmul(double a, double b);
317 double builtin_ddiv(double a, double b);
319 double builtin_dneg(double a);
321 s4 builtin_dcmpl(double a, double b);
323 s4 builtin_dcmpg(double a, double b);
325 double builtin_drem(double a, double b);
326 #define BUILTIN_drem (functionptr) builtin_drem
328 s8 builtin_i2l(s4 i);
330 float builtin_i2f(s4 i);
331 #define BUILTIN_i2f (functionptr) builtin_i2f
332 double builtin_i2d(s4 i);
333 #define BUILTIN_i2d (functionptr) builtin_i2d
334 s4 builtin_l2i(s8 l);
336 float builtin_l2f(s8 l);
337 #define BUILTIN_l2f (functionptr) builtin_l2f
338 double builtin_l2d(s8 l);
339 #define BUILTIN_l2d (functionptr) builtin_l2d
341 s4 builtin_f2i(float a);
342 #define BUILTIN_f2i (functionptr) builtin_f2i
343 s4 asm_builtin_f2i(float a);
345 s8 builtin_f2l(float a);
346 #define BUILTIN_f2l (functionptr) builtin_f2l
347 s8 asm_builtin_f2l(float a);
350 double builtin_f2d(float a);
353 s4 builtin_d2i(double a);
354 #define BUILTIN_d2i (functionptr) builtin_d2i
355 s4 asm_builtin_d2i(double a);
357 s8 builtin_d2l(double a);
358 #define BUILTIN_d2l (functionptr) builtin_d2l
359 s8 asm_builtin_d2l(double a);
362 float builtin_d2f(double a);
365 java_arrayheader *builtin_clone_array(void *env, java_arrayheader *o);
368 /* builtin_dummy just panics if it is executed. */
372 /* conversion helper functions */
374 inline float intBitsToFloat(s4 i);
375 inline float longBitsToDouble(s8 l);
378 static inline java_objectheader **builtin_get_exceptionptrptr()
380 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
382 return &_exceptionptr;
384 return &((nativethread*) pthread_getspecific(tkey_exceptionptr))->_exceptionptr;
387 panic("builtin_get_exceptionptrptr should not be used in this configuration");
392 static inline methodinfo **builtin_get_threadrootmethod()
394 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
396 return &_threadrootmethod;
398 return &((nativethread*) pthread_getspecific(tkey_threadrootmethod))->_threadrootmethod;
401 panic("builting_get_threadrootmethod should not be used in this configuration");
406 /* returns the root method of a thread. this is used in asmpart.S and delivers the abort condition
407 for the stack unwinding for getClassContext and getClassLoader. For the main thread this is the main function.
408 Otherwhise it is the thread's run method (at least that's how I see it) (jowenn) */
409 methodinfo *builtin_asm_get_threadrootmethod();
411 /* returns the current top element of the stack frame info list (needed for unwinding across native functions) */
412 /* on i386 this is a pointer to a structure
413 ------------------------------------------------
414 | return adress out of native stub |
415 | 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)
416 | pointer to thread specific top of this list |<----stack frame begin
417 points here---->| previous element in list |
418 ------------------------------------------------
420 void *builtin_asm_get_stackframeinfo();
421 stacktraceelement *builtin_stacktrace_copy(stacktraceelement **,stacktraceelement *begin, stacktraceelement *end);
422 #endif /* _BUILTIN_H */
426 * These are local overrides for various environment variables in Emacs.
427 * Please do not remove this and leave it at the end of the file, where
428 * Emacs will automagically detect them.
429 * ---------------------------------------------------------------------
432 * indent-tabs-mode: t