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