Renamed builtin_nmultianewarray to builtin_multianewarray.
[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 2329 2005-04-21 22:41:19Z twisti $
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 /**********************************************************************/
77 /* BUILTIN FUNCTIONS TABLE                                            */
78 /**********************************************************************/
79
80 /* IMPORTANT:
81  * For each builtin function which is used in a BUILTIN* opcode there
82  * must be an entry in the builtin_desc table in jit/jit.c.
83  */
84  
85 typedef struct builtin_descriptor builtin_descriptor;
86
87 /* There is a builtin_descriptor in builtin_desc for every builtin
88  * function used in BUILTIN* opcodes.
89  */
90 struct builtin_descriptor {
91         int         opcode;   /* opcode which is replaced by this builtin */
92                               /* (255 means no automatic replacement,     */
93                               /*    0 means end of list.)                 */
94         functionptr builtin;  /* the builtin function (specify BUILTIN_...*/
95                               /* macro)                                   */
96         int         icmd;     /* the BUILTIN* opcode to use (# of args)   */
97         u1          type_s1;  /* type of 1st argument                     */
98         u1          type_s2;  /* type of 2nd argument, or TYPE_VOID       */
99         u1          type_s3;  /* type of 3rd argument, or TYPE_VOID       */
100         u1          type_d;   /* type of result (may be TYPE_VOID)        */
101         bool        supported;/* is <opcode> supported without builtin?   */
102         bool        isfloat;  /* is this a floating point operation?      */
103         char        *name;    /* display name of the builtin function     */
104 };
105
106 extern builtin_descriptor builtin_desc[];
107
108 /**********************************************************************/
109 /* GLOBAL VARIABLES                                                   */
110 /**********************************************************************/
111
112 #if defined(USEBUILTINTABLE)
113 void sort_builtintable(void);
114 builtin_descriptor *find_builtin(int opcode);
115 #endif /* defined(USEBUILTINTABLE) */
116
117
118 /**********************************************************************/
119 /* BUILTIN FUNCTIONS                                                  */
120 /**********************************************************************/
121
122 /* NOTE: Builtin functions which are used in the BUILTIN* opcodes must
123  * have a BUILTIN_... macro defined as seen below. In code dealing
124  * with the BUILTIN* opcodes the functions may only be addressed by
125  * these macros, never by their actual name! (This helps to make this
126  * code more portable.)
127  *
128  * C and assembler code which does not deal with the BUILTIN* opcodes,
129  * can use the builtin functions normally (like all other functions).
130  *
131  * IMPORTANT:
132  * For each builtin function which is used in a BUILTIN* opcode there
133  * must be an entry in the builtin_desc table in jit/jit.c.
134  *
135  * Below each prototype is either the BUILTIN_ macro definition or a
136  * comment specifiying that this function is not used in BUILTIN*
137  * opcodes.
138  *
139  * (The BUILTIN* opcodes are ICMD_BUILTIN1, ICMD_BUILTIN2 and
140  * ICMD_BUILTIN3.)
141  */
142
143 s4 builtin_instanceof(java_objectheader *obj, classinfo *class);
144 #define BUILTIN_instanceof (functionptr) builtin_instanceof
145 s4 builtin_isanysubclass (classinfo *sub, classinfo *super);
146 /* NOT AN OP */
147 s4 builtin_isanysubclass_vftbl (vftbl_t *sub, vftbl_t *super);
148 /* NOT AN OP */
149 s4 builtin_checkcast(java_objectheader *obj, classinfo *class);
150 /* NOT AN OP */
151 s4 builtin_arrayinstanceof(java_objectheader *obj, vftbl_t *target);
152 #define BUILTIN_arrayinstanceof (functionptr) builtin_arrayinstanceof
153
154 #if defined(__I386__)
155 s4 asm_builtin_arrayinstanceof(java_objectheader *obj, classinfo *class); /* XXX ? */
156 #undef  BUILTIN_arrayinstanceof
157 #define BUILTIN_arrayinstanceof (functionptr) asm_builtin_arrayinstanceof
158 #endif
159
160 s4 builtin_checkarraycast(java_objectheader *obj, vftbl_t *target);
161 /* NOT AN OP */
162 s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl_t *target);
163 #define BUILTIN_checkarraycast (functionptr) asm_builtin_checkarraycast
164
165 java_objectheader *builtin_throw_exception(java_objectheader *exception);
166 /* NOT AN OP */
167 java_objectheader *builtin_trace_exception(java_objectheader *xptr,
168                                                                                    methodinfo *m,
169                                                                                    void *pos,
170                                                                                    s4 line,
171                                                                                    s4 noindent);
172 /* NOT AN OP */
173
174 java_objectheader *builtin_new(classinfo *c);
175 /*  #if defined(__I386__) */
176 /*  java_objectheader *asm_builtin_new(classinfo *c); */
177 /*  #define BUILTIN_new (functionptr) asm_builtin_new */
178 /*  #else */
179 #define BUILTIN_new (functionptr) builtin_new
180 /*  #endif */
181
182 java_arrayheader *builtin_newarray(s4 size, vftbl_t *arrayvftbl);
183 #define BUILTIN_newarray (functionptr) builtin_newarray
184
185 java_objectarray *builtin_anewarray(s4 size, classinfo *component);
186 #define BUILTIN_anewarray (functionptr) builtin_anewarray
187
188 #if defined(__I386__)
189 void asm_builtin_newarray(s4 size, vftbl_t *arrayvftbl);
190 #undef  BUILTIN_newarray
191 #define BUILTIN_newarray (functionptr) asm_builtin_newarray
192 #endif
193
194 java_booleanarray *builtin_newarray_boolean(s4 size);
195 #define BUILTIN_newarray_boolean (functionptr) builtin_newarray_boolean
196 java_chararray *builtin_newarray_char(s4 size);
197 #define BUILTIN_newarray_char (functionptr) builtin_newarray_char
198 java_floatarray *builtin_newarray_float(s4 size);
199 #define BUILTIN_newarray_float (functionptr) builtin_newarray_float
200 java_doublearray *builtin_newarray_double(s4 size);
201 #define BUILTIN_newarray_double (functionptr) builtin_newarray_double
202 java_bytearray *builtin_newarray_byte(s4 size);
203 #define BUILTIN_newarray_byte (functionptr) builtin_newarray_byte
204 java_shortarray *builtin_newarray_short(s4 size);
205 #define BUILTIN_newarray_short (functionptr) builtin_newarray_short
206 java_intarray *builtin_newarray_int(s4 size);
207 #define BUILTIN_newarray_int (functionptr) builtin_newarray_int
208 java_longarray *builtin_newarray_long(s4 size);
209 #define BUILTIN_newarray_long (functionptr) builtin_newarray_long
210 java_arrayheader *builtin_multianewarray(int n, vftbl_t *arrayvftbl, long *dims);
211 #define BUILTIN_multianewarray (functionptr) builtin_multianewarray
212 /*  java_arrayheader *builtin_nmultianewarray(int n, classinfo *arrayclass, long *dims); */
213 /* NOT AN OP */
214
215 s4 builtin_canstore(java_objectarray *a, java_objectheader *o);
216 /* NOT AN OP */
217 void asm_builtin_aastore(java_objectarray *a, s4 index, java_objectheader *o);
218 #define BUILTIN_aastore (functionptr) asm_builtin_aastore
219
220 #if defined(TRACE_ARGS_NUM)
221 void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
222 #if TRACE_ARGS_NUM >= 6
223                                                 s8 a4, s8 a5,
224 #endif /* TRACE_ARGS_NUM >= 6 */
225 #if TRACE_ARGS_NUM == 8
226                                                 s8 a6, s8 a7,
227 #endif /* TRACE_ARGS_NUM == 8 */
228                                                 methodinfo *m);
229 /* NOT AN OP */
230 #endif /* defined(TRACE_ARGS_NUM) */
231 void builtin_displaymethodstart(methodinfo *m);
232 /* NOT AN OP */
233 void builtin_displaymethodstop(methodinfo *m, s8 l, double d, float f);
234 /* NOT AN OP */
235
236 #if defined(USE_THREADS)
237 void builtin_monitorenter(java_objectheader *o);
238 /* NOT AN OP */
239 void builtin_staticmonitorenter(classinfo *c);
240 /* NOT AN OP */
241 void asm_builtin_monitorenter(java_objectheader *o);
242 #define BUILTIN_monitorenter (functionptr) asm_builtin_monitorenter
243 void *builtin_monitorexit(java_objectheader *o);
244 /* NOT AN OP */
245 void *asm_builtin_monitorexit(java_objectheader *o);
246 #define BUILTIN_monitorexit (functionptr) asm_builtin_monitorexit
247 #endif
248
249 s4 builtin_idiv(s4 a, s4 b);
250 /* NOT AN OP */
251 s4 asm_builtin_idiv(s4 a, s4 b);
252 #define BUILTIN_idiv (functionptr) asm_builtin_idiv
253 s4 builtin_irem(s4 a, s4 b);
254 /* NOT AN OP */
255 s4 asm_builtin_irem(s4 a, s4 b);
256 #define BUILTIN_irem (functionptr) asm_builtin_irem
257
258 s8 builtin_ladd(s8 a, s8 b);
259 #define BUILTIN_ladd (functionptr) builtin_ladd
260 s8 builtin_lsub(s8 a, s8 b);
261 #define BUILTIN_lsub (functionptr) builtin_lsub
262 s8 builtin_lmul(s8 a, s8 b);
263 #define BUILTIN_lmul (functionptr) builtin_lmul
264 s8 builtin_ldiv(s8 a, s8 b);
265 /* NOT AN OP */
266 s8 asm_builtin_ldiv(s8 a, s8 b);
267 #define BUILTIN_ldiv (functionptr) asm_builtin_ldiv
268 s8 builtin_lrem(s8 a, s8 b);
269 /* NOT AN OP */
270 s8 asm_builtin_lrem(s8 a, s8 b);
271 #define BUILTIN_lrem (functionptr) asm_builtin_lrem
272 s8 builtin_lshl(s8 a, s4 b);
273 #define BUILTIN_lshl (functionptr) builtin_lshl
274 s8 builtin_lshr(s8 a, s4 b);
275 #define BUILTIN_lshr (functionptr) builtin_lshr
276 s8 builtin_lushr(s8 a, s4 b);
277 #define BUILTIN_lushr (functionptr) builtin_lushr
278 s8 builtin_land(s8 a, s8 b);
279 #define BUILTIN_land (functionptr) builtin_land
280 s8 builtin_lor(s8 a, s8 b);
281 #define BUILTIN_lor (functionptr) builtin_lor
282 s8 builtin_lxor(s8 a, s8 b);
283 #define BUILTIN_lxor (functionptr) builtin_lxor
284 s8 builtin_lneg(s8 a);
285 #define BUILTIN_lneg (functionptr) builtin_lneg
286 s4 builtin_lcmp(s8 a, s8 b);
287 #define BUILTIN_lcmp (functionptr) builtin_lcmp
288
289 float builtin_fadd(float a, float b);
290 #define BUILTIN_fadd (functionptr) builtin_fadd
291 float builtin_fsub(float a, float b);
292 #define BUILTIN_fsub (functionptr) builtin_fsub
293 float builtin_fmul(float a, float b);
294 #define BUILTIN_fmul (functionptr) builtin_fmul
295 float builtin_fdiv(float a, float b);
296 #define BUILTIN_fdiv (functionptr) builtin_fdiv
297 float builtin_fneg(float a);         
298 #define BUILTIN_fneg (functionptr) builtin_fneg
299 s4 builtin_fcmpl(float a, float b);  
300 #define BUILTIN_fcmpl (functionptr) builtin_fcmpl
301 s4 builtin_fcmpg(float a, float b);  
302 #define BUILTIN_fcmpg (functionptr) builtin_fcmpg
303 float builtin_frem(float a, float b);
304 #define BUILTIN_frem (functionptr) builtin_frem
305
306 double builtin_dadd(double a, double b);
307 #define BUILTIN_dadd (functionptr) builtin_dadd
308 double builtin_dsub(double a, double b);
309 #define BUILTIN_dsub (functionptr) builtin_dsub
310 double builtin_dmul(double a, double b);
311 #define BUILTIN_dmul (functionptr) builtin_dmul
312 double builtin_ddiv(double a, double b);
313 #define BUILTIN_ddiv (functionptr) builtin_ddiv
314 double builtin_dneg(double a);          
315 #define BUILTIN_dneg (functionptr) builtin_dneg
316 s4 builtin_dcmpl(double a, double b);   
317 #define BUILTIN_dcmpl (functionptr) builtin_dcmpl
318 s4 builtin_dcmpg(double a, double b);   
319 #define BUILTIN_dcmpg (functionptr) builtin_dcmpg
320 double builtin_drem(double a, double b);
321 #define BUILTIN_drem (functionptr) builtin_drem
322
323 s8       builtin_i2l(s4 i);
324 /* NOT AN OP */
325 float    builtin_i2f(s4 i);
326 #define BUILTIN_i2f (functionptr) builtin_i2f
327 double   builtin_i2d(s4 i);
328 #define BUILTIN_i2d (functionptr) builtin_i2d
329 s4       builtin_l2i(s8 l);
330 /* NOT AN OP */
331 float    builtin_l2f(s8 l);
332 #define BUILTIN_l2f (functionptr) builtin_l2f
333 double   builtin_l2d(s8 l);
334 #define BUILTIN_l2d (functionptr) builtin_l2d
335
336 s4       builtin_f2i(float a);
337 #define BUILTIN_f2i (functionptr) builtin_f2i
338 s4       asm_builtin_f2i(float a);
339 /* NOT AN OP */
340 s8       builtin_f2l(float a);
341 #define BUILTIN_f2l (functionptr) builtin_f2l
342 s8       asm_builtin_f2l(float a);
343 /* NOT AN OP */
344
345 double   builtin_f2d(float a);
346 #define BUILTIN_f2d (functionptr) builtin_f2d
347
348 s4       builtin_d2i(double a);
349 #define BUILTIN_d2i (functionptr) builtin_d2i
350 s4       asm_builtin_d2i(double a);
351 /* NOT AN OP */
352 s8       builtin_d2l(double a);
353 #define BUILTIN_d2l (functionptr) builtin_d2l
354 s8       asm_builtin_d2l(double a);
355 /* NOT AN OP */
356
357 float    builtin_d2f(double a);
358 #define BUILTIN_d2f (functionptr) builtin_d2f
359
360 java_arrayheader *builtin_clone_array(void *env, java_arrayheader *o);
361 /* NOT AN OP */
362
363 /* builtin_dummy just panics if it is executed. */
364 s4 builtin_dummy(void);
365 /* NOT AN OP */
366
367 /* conversion helper functions */
368 inline float intBitsToFloat(s4 i);
369 inline float longBitsToDouble(s8 l);
370
371 /* this is a wrapper for calls from asmpart */
372 java_objectheader **builtin_asm_get_exceptionptrptr(void);
373
374 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
375 static inline java_objectheader **builtin_get_exceptionptrptr(void);
376 /* NOT AN OP */
377 static inline methodinfo **builtin_get_threadrootmethod(void);
378 /* NOT AN OP */
379
380 inline java_objectheader **builtin_get_exceptionptrptr(void)
381 {
382         return &THREADINFO->_exceptionptr;
383 }
384
385 inline methodinfo **builtin_get_threadrootmethod(void)
386 {
387         return &THREADINFO->_threadrootmethod;
388 }
389 #endif
390
391
392 /* returns the root method of a thread. this is used in asmpart.S and delivers the abort condition
393    for the stack unwinding for getClassContext and getClassLoader. For the main thread this is the main function.
394    Otherwhise it is the thread's run method (at least that's how I see it) (jowenn) */
395 methodinfo *builtin_asm_get_threadrootmethod(void);
396
397 /* returns the current top element of the stack frame info list (needed for unwinding across native functions) */
398 /* on i386 this is a pointer to a structure 
399                 ------------------------------------------------
400                 | return adress out of native stub              |
401                 | 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)
402                 | pointer to thread specific top of this list   |<----stack frame begin
403 points here---->| previous element in list                      |
404                 ------------------------------------------------
405 */
406 void *builtin_asm_get_stackframeinfo(void);
407 stacktraceelement *builtin_stacktrace_copy(stacktraceelement **,stacktraceelement *begin, stacktraceelement *end);
408 #endif /* _BUILTIN_H */
409
410
411 /*
412  * These are local overrides for various environment variables in Emacs.
413  * Please do not remove this and leave it at the end of the file, where
414  * Emacs will automagically detect them.
415  * ---------------------------------------------------------------------
416  * Local variables:
417  * mode: c
418  * indent-tabs-mode: t
419  * c-basic-offset: 4
420  * tab-width: 4
421  * End:
422  */