CACAO
builtin.hpp
Go to the documentation of this file.
1 /* src/vm/jit/builtin.hpp - prototypes of builtin functions
2 
3  Copyright (C) 1996-2014
4  CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5 
6  This file is part of CACAO.
7 
8  This program is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 2, or (at
11  your option) any later version.
12 
13  This program is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21  02110-1301, USA.
22 
23 */
24 
25 
26 #ifndef _BUILTIN_HPP
27 #define _BUILTIN_HPP
28 
29 /* forward typedefs ***********************************************************/
30 
31 #include <sys/types.h> // for int32_t
32 #include "arch.hpp" // for USES_NEW_SUBTYPE
33 #include "threads/lock.hpp" // for lock_monitor_enter, etc
34 #include "vm/global.hpp" // for functionptr, java_handle_t, etc
35 #include "vm/jit/ir/icmd.hpp" // for ICMD
36 #include "vm/types.hpp" // for s8, s4, u1, u4
37 #include "vm/utf8.hpp" // for Utf8String
38 
39 struct builtintable_entry;
40 struct classinfo;
41 struct methoddesc;
42 struct methodinfo;
43 struct vftbl_t;
44 
45 /* define infinity for floating point numbers */
46 
47 #define FLT_NAN 0x7fc00000
48 #define FLT_POSINF 0x7f800000
49 #define FLT_NEGINF 0xff800000
50 
51 /* define infinity for double floating point numbers */
52 
53 #define DBL_NAN 0x7ff8000000000000LL
54 #define DBL_POSINF 0x7ff0000000000000LL
55 #define DBL_NEGINF 0xfff0000000000000LL
56 
57 
58 /* builtin functions table ****************************************************/
59 
61  ICMD opcode; /* opcode which is replaced */
62  u4 flags; /* e.g. check for exception */
63  functionptr fp; /* function pointer of builtin */
64  u1 *stub; /* pointer to builtin stub code */
65  const char* cclassname; /* char name of the class */
66  const char* cname; /* char name of the function */
67  const char* cdescriptor; /* char name of the descriptor */
68  Utf8String classname; /* class of the function */
69  Utf8String name; /* name of the function */
70  Utf8String descriptor; /* descriptor of the function */
72  functionptr emit_fastpath; /* emitter for fast-path code */
73 };
74 
75 
76 /* builtin table flag defines *************************************************/
77 
78 #define BUILTINTABLE_FLAG_STUB 0x0001 /* builtin needs a stub */
79 #define BUILTINTABLE_FLAG_EXCEPTION 0x0002 /* check for excepion on return */
80 
81 
82 /* function prototypes ********************************************************/
83 
84 extern "C" {
85 
86 bool builtin_init(void);
87 
90 
91 bool builtintable_replace_function(void *iptr);
92 
93 
94 /**********************************************************************/
95 /* BUILTIN FUNCTIONS */
96 /**********************************************************************/
97 
98 /* NOTE: Builtin functions which are used in the BUILTIN* opcodes must
99  * have a BUILTIN_... macro defined as seen below. In code dealing
100  * with the BUILTIN* opcodes the functions may only be addressed by
101  * these macros, never by their actual name! (This helps to make this
102  * code more portable.)
103  *
104  * C and assembler code which does not deal with the BUILTIN* opcodes,
105  * can use the builtin functions normally (like all other functions).
106  *
107  * IMPORTANT:
108  * For each builtin function which is used in a BUILTIN* opcode there
109  * must be an entry in the builtin_desc table in jit/jit.c.
110  *
111  * Below each prototype is either the BUILTIN_ macro definition or a
112  * comment specifiying that this function is not used in BUILTIN*
113  * opcodes.
114  *
115  * (The BUILTIN* opcodes are ICMD_BUILTIN1, ICMD_BUILTIN2 and
116  * ICMD_BUILTIN3.)
117  */
118 
119 #if USES_NEW_SUBTYPE
120 bool fast_subtype_check(vftbl_t*, vftbl_t*);
121 #endif
122 
123 /* From lock.hpp: bool lock_monitor_enter(java_handle_t *); */
124 #define LOCK_monitor_enter (functionptr) lock_monitor_enter
125 #if defined(__X86_64__)
126 # define EMIT_FASTPATH_monitor_enter (functionptr) emit_fastpath_monitor_enter
127 #else
128 # define EMIT_FASTPATH_monitor_enter (functionptr) NULL
129 #endif
130 
131 /* From lock.hpp: bool lock_monitor_exit(java_handle_t *); */
132 #define LOCK_monitor_exit (functionptr) lock_monitor_exit
133 #if defined(__X86_64__)
134 # define EMIT_FASTPATH_monitor_exit (functionptr) emit_fastpath_monitor_exit
135 #else
136 # define EMIT_FASTPATH_monitor_exit (functionptr) NULL
137 #endif
138 
140 /* NOT AN OP */
142 /* NOT AN OP */
143 bool builtin_arrayinstanceof(java_handle_t *h, classinfo *targetclass);
144 /* NOT AN OP */
146 #define BUILTIN_arrayinstanceof (functionptr) builtin_fast_arrayinstanceof
148 #define BUILTIN_arraycheckcast (functionptr) builtin_fast_arraycheckcast
149 
151 /* NOT AN OP */
153 #define BUILTIN_FAST_canstore (functionptr) builtin_fast_canstore
154 
156 /* NOT AN OP */
158 /* NOT AN OP */
159 
161 /* NOT AN OP */
163 #define BUILTIN_new (functionptr) builtin_java_new
164 
165 #if defined(ENABLE_TLH)
166 #define BUILTIN_tlh_new (functionptr) builtin_tlh_new
167 java_handle_t *builtin_tlh_new(classinfo *c);
168 #endif
169 
170 #if defined(ENABLE_ESCAPE_REASON)
171 #define BUILTIN_escape_reason_new (functionptr)builtin_escape_reason_new
172 java_handle_t *builtin_escape_reason_new(classinfo *c);
173 #endif
174 
176 #define BUILTIN_FAST_new (functionptr) builtin_fast_new
177 
179 #define BUILTIN_newarray (functionptr) builtin_java_newarray
180 
182 #define BUILTIN_newarray_boolean (functionptr) builtin_newarray_boolean
184 #define BUILTIN_newarray_char (functionptr) builtin_newarray_char
186 #define BUILTIN_newarray_float (functionptr) builtin_newarray_float
188 #define BUILTIN_newarray_double (functionptr) builtin_newarray_double
190 #define BUILTIN_newarray_byte (functionptr) builtin_newarray_byte
192 #define BUILTIN_newarray_short (functionptr) builtin_newarray_short
194 #define BUILTIN_newarray_int (functionptr) builtin_newarray_int
196 #define BUILTIN_newarray_long (functionptr) builtin_newarray_long
197 
199  java_handle_t *arrayclass,
200  long *dims);
201 #define BUILTIN_multianewarray (functionptr) builtin_multianewarray
202 
203 #if defined(TRACE_ARGS_NUM)
204 void builtin_verbosecall_enter(s8 a0, s8 a1,
205 # if TRACE_ARGS_NUM >= 4
206  s8 a2, s8 a3,
207 # endif
208 # if TRACE_ARGS_NUM >= 6
209  s8 a4, s8 a5,
210 # endif
211 # if TRACE_ARGS_NUM == 8
212  s8 a6, s8 a7,
213 # endif
214  methodinfo *m);
215 /* NOT AN OP */
216 #endif /* defined(TRACE_ARGS_NUM) */
217 
218 void builtin_verbosecall_exit(s8 l, double d, float f, methodinfo *m);
219 /* NOT AN OP */
220 
221 s4 builtin_idiv(s4 a, s4 b);
222 #define BUILTIN_idiv (functionptr) builtin_idiv
223 s4 builtin_irem(s4 a, s4 b);
224 #define BUILTIN_irem (functionptr) builtin_irem
225 
226 s8 builtin_ladd(s8 a, s8 b);
227 #define BUILTIN_ladd (functionptr) builtin_ladd
228 s8 builtin_lsub(s8 a, s8 b);
229 #define BUILTIN_lsub (functionptr) builtin_lsub
230 s8 builtin_lmul(s8 a, s8 b);
231 #define BUILTIN_lmul (functionptr) builtin_lmul
232 
233 s8 builtin_ldiv(s8 a, s8 b);
234 #define BUILTIN_ldiv (functionptr) builtin_ldiv
235 s8 builtin_lrem(s8 a, s8 b);
236 #define BUILTIN_lrem (functionptr) builtin_lrem
237 
238 s8 builtin_lshl(s8 a, s4 b);
239 #define BUILTIN_lshl (functionptr) builtin_lshl
240 s8 builtin_lshr(s8 a, s4 b);
241 #define BUILTIN_lshr (functionptr) builtin_lshr
242 s8 builtin_lushr(s8 a, s4 b);
243 #define BUILTIN_lushr (functionptr) builtin_lushr
244 s8 builtin_land(s8 a, s8 b);
245 #define BUILTIN_land (functionptr) builtin_land
246 s8 builtin_lor(s8 a, s8 b);
247 #define BUILTIN_lor (functionptr) builtin_lor
248 s8 builtin_lxor(s8 a, s8 b);
249 #define BUILTIN_lxor (functionptr) builtin_lxor
250 s8 builtin_lneg(s8 a);
251 #define BUILTIN_lneg (functionptr) builtin_lneg
252 s4 builtin_lcmp(s8 a, s8 b);
253 #define BUILTIN_lcmp (functionptr) builtin_lcmp
254 
255 float builtin_fadd(float a, float b);
256 #define BUILTIN_fadd (functionptr) builtin_fadd
257 float builtin_fsub(float a, float b);
258 #define BUILTIN_fsub (functionptr) builtin_fsub
259 float builtin_fmul(float a, float b);
260 #define BUILTIN_fmul (functionptr) builtin_fmul
261 float builtin_fdiv(float a, float b);
262 #define BUILTIN_fdiv (functionptr) builtin_fdiv
263 float builtin_fneg(float a);
264 #define BUILTIN_fneg (functionptr) builtin_fneg
265 s4 builtin_fcmpl(float a, float b);
266 #define BUILTIN_fcmpl (functionptr) builtin_fcmpl
267 s4 builtin_fcmpg(float a, float b);
268 #define BUILTIN_fcmpg (functionptr) builtin_fcmpg
269 float builtin_frem(float a, float b);
270 #define BUILTIN_frem (functionptr) builtin_frem
271 
272 double builtin_dadd(double a, double b);
273 #define BUILTIN_dadd (functionptr) builtin_dadd
274 double builtin_dsub(double a, double b);
275 #define BUILTIN_dsub (functionptr) builtin_dsub
276 double builtin_dmul(double a, double b);
277 #define BUILTIN_dmul (functionptr) builtin_dmul
278 double builtin_ddiv(double a, double b);
279 #define BUILTIN_ddiv (functionptr) builtin_ddiv
280 double builtin_dneg(double a);
281 #define BUILTIN_dneg (functionptr) builtin_dneg
282 s4 builtin_dcmpl(double a, double b);
283 #define BUILTIN_dcmpl (functionptr) builtin_dcmpl
284 s4 builtin_dcmpg(double a, double b);
285 #define BUILTIN_dcmpg (functionptr) builtin_dcmpg
286 double builtin_drem(double a, double b);
287 #define BUILTIN_drem (functionptr) builtin_drem
288 
289 float builtin_i2f(s4 i);
290 #define BUILTIN_i2f (functionptr) builtin_i2f
291 double builtin_i2d(s4 i);
292 #define BUILTIN_i2d (functionptr) builtin_i2d
293 float builtin_l2f(s8 l);
294 #define BUILTIN_l2f (functionptr) builtin_l2f
295 double builtin_l2d(s8 l);
296 #define BUILTIN_l2d (functionptr) builtin_l2d
297 
298 s4 builtin_f2i(float a);
299 #define BUILTIN_f2i (functionptr) builtin_f2i
300 s4 asm_builtin_f2i(float a);
301 /* NOT AN OP */
302 s8 builtin_f2l(float a);
303 #define BUILTIN_f2l (functionptr) builtin_f2l
304 s8 asm_builtin_f2l(float a);
305 /* NOT AN OP */
306 
307 double builtin_f2d(float a);
308 #define BUILTIN_f2d (functionptr) builtin_f2d
309 
310 s4 builtin_d2i(double a);
311 #define BUILTIN_d2i (functionptr) builtin_d2i
312 s4 asm_builtin_d2i(double a);
313 /* NOT AN OP */
314 s8 builtin_d2l(double a);
315 #define BUILTIN_d2l (functionptr) builtin_d2l
316 s8 asm_builtin_d2l(double a);
317 /* NOT AN OP */
318 
319 float builtin_d2f(double a);
320 #define BUILTIN_d2f (functionptr) builtin_d2f
321 
323 #define BUILTIN_clone (functionptr) builtin_clone
324 
325 void builtin_arraycopy(java_handle_t *src, s4 srcStart,
326  java_handle_t *dest, s4 destStart, s4 len);
327 #define BUILTIN_arraycopy (functionptr) builtin_arraycopy
328 
329 s8 builtin_nanotime(void);
331 #define BUILTIN_currenttimemillis (functionptr) builtin_currenttimemillis
332 
333 #if defined(ENABLE_CYCLES_STATS)
334 void builtin_print_cycles_stats(FILE *file);
335 #endif
336 
337 } // extern "C"
338 
339 #endif // _BUILTIN_HPP
340 
341 
342 /*
343  * These are local overrides for various environment variables in Emacs.
344  * Please do not remove this and leave it at the end of the file, where
345  * Emacs will automagically detect them.
346  * ---------------------------------------------------------------------
347  * Local variables:
348  * mode: c++
349  * indent-tabs-mode: t
350  * c-basic-offset: 4
351  * tab-width: 4
352  * End:
353  * vim:noexpandtab:sw=4:ts=4:
354  */
double builtin_drem(double a, double b)
Definition: builtin.cpp:1764
#define a5
Definition: md-asm.hpp:37
#define a4
Definition: md-asm.hpp:36
bool builtin_instanceof(java_handle_t *o, classinfo *c)
Definition: builtin.cpp:403
ICMD opcode
Definition: builtin.hpp:61
Utf8String classname
Definition: builtin.hpp:68
java_handle_chararray_t * builtin_newarray_char(int32_t size)
s4 asm_builtin_f2i(float a)
bool builtintable_replace_function(void *iptr_)
Definition: builtin.cpp:333
float builtin_fsub(float a, float b)
Definition: builtin.cpp:1427
s8 builtin_lmul(s8 a, s8 b)
Definition: builtin.cpp:1301
s4 builtin_dcmpl(double a, double b)
Definition: builtin.cpp:1717
bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
Definition: builtin.cpp:631
const char * cclassname
Definition: builtin.hpp:65
s8 asm_builtin_d2l(double a)
methoddesc * md
Definition: builtin.hpp:71
bool builtin_checkcast(java_handle_t *o, classinfo *c)
Definition: builtin.cpp:426
double builtin_f2d(float a)
Definition: builtin.cpp:1909
s4 builtin_idiv(s4 a, s4 b)
Definition: builtin.cpp:1243
s4 builtin_irem(s4 a, s4 b)
Definition: builtin.cpp:1252
bool builtin_init(void)
Definition: builtin.cpp:251
double builtin_dneg(double a)
Definition: builtin.cpp:1690
s8 builtin_lushr(s8 a, s4 b)
Definition: builtin.cpp:1352
java_object_t * builtin_fast_new(classinfo *c)
Definition: builtin.cpp:981
s4 builtin_dcmpg(double a, double b)
Definition: builtin.cpp:1740
double builtin_ddiv(double a, double b)
Definition: builtin.cpp:1629
s4 asm_builtin_d2i(double a)
#define builtin_f2l
Definition: md-asm.hpp:115
#define TRACE_ARGS_NUM
Definition: md-abi.hpp:104
s4 builtin_lcmp(s8 a, s8 b)
Definition: builtin.cpp:1363
java_handle_booleanarray_t * builtin_newarray_boolean(int32_t size)
bool builtin_fast_arraycheckcast(java_object_t *o, classinfo *targetclass)
Definition: builtin.cpp:457
uint8_t u1
Definition: types.hpp:40
s8 builtin_lxor(s8 a, s8 b)
java_object_t * builtin_retrieve_exception(void)
Definition: builtin.cpp:550
java_handle_floatarray_t * builtin_newarray_float(int32_t size)
u1 * stub
Definition: builtin.hpp:64
int64_t s8
Definition: types.hpp:48
JNIEnv jthread jobject jclass jlong size
Definition: jvmti.h:387
double builtin_dmul(double a, double b)
Definition: builtin.cpp:1600
java_handle_t * builtin_new(classinfo *c)
Definition: builtin.cpp:816
java_handle_bytearray_t * builtin_newarray_byte(int32_t size)
void(* functionptr)(void)
Definition: global.hpp:39
Utf8String descriptor
Definition: builtin.hpp:70
java_handle_shortarray_t * builtin_newarray_short(int32_t size)
java_handle_intarray_t * builtin_newarray_int(int32_t size)
float builtin_fdiv(float a, float b)
Definition: builtin.cpp:1462
float builtin_i2f(s4 a)
Definition: builtin.cpp:1773
Utf8String name
Definition: builtin.hpp:69
#define a7
Definition: md-asm.hpp:39
JNIEnv jthread jmethodID jlocation jobject exception
Definition: jvmti.h:272
builtintable_entry * builtintable_get_internal(functionptr fp)
Definition: builtin.cpp:275
#define builtin_throw_exception
Definition: md-asm.hpp:100
s8 builtin_lsub(s8 a, s8 b)
Definition: builtin.cpp:1280
float builtin_d2f(double a)
Definition: builtin.cpp:1920
s8 asm_builtin_f2l(float a)
#define a0
Definition: md-asm.hpp:32
s8 builtin_lneg(s8 a)
Definition: builtin.cpp:1289
#define a1
Definition: md-asm.hpp:33
bool builtin_fast_arrayinstanceof(java_object_t *o, classinfo *targetclass)
Definition: builtin.cpp:479
#define a6
Definition: md-asm.hpp:38
s8 builtin_nanotime(void)
Definition: builtin.cpp:2043
MIIterator i
int32_t s4
Definition: types.hpp:45
s8 builtin_lor(s8 a, s8 b)
s4 builtin_fcmpg(float a, float b)
Definition: builtin.cpp:1552
ICMD
Definition: icmd.hpp:37
#define a3
Definition: md-asm.hpp:35
bool builtin_arrayinstanceof(java_handle_t *h, classinfo *targetclass)
Definition: builtin.cpp:494
#define a2
Definition: md-asm.hpp:34
float builtin_fneg(float a)
Definition: builtin.cpp:1517
const char * cdescriptor
Definition: builtin.hpp:67
#define builtin_d2l
Definition: md-asm.hpp:117
double builtin_i2d(s4 a)
Definition: builtin.cpp:1782
s8 builtin_lshr(s8 a, s4 b)
Definition: builtin.cpp:1343
functionptr emit_fastpath
Definition: builtin.hpp:72
uint32_t u4
Definition: types.hpp:46
s8 builtin_lrem(s8 a, s8 b)
Definition: builtin.cpp:1322
double builtin_dadd(double a, double b)
Definition: builtin.cpp:1576
#define builtin_d2i
Definition: md-asm.hpp:116
bool builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
Definition: builtin.cpp:576
s8 builtin_ladd(s8 a, s8 b)
Definition: builtin.cpp:1271
s8 builtin_lshl(s8 a, s4 b)
Definition: builtin.cpp:1334
Definition: builtin.hpp:60
double builtin_l2d(s8 a)
Definition: builtin.cpp:1800
const char * cname
Definition: builtin.hpp:66
s8 builtin_ldiv(s8 a, s8 b)
Definition: builtin.cpp:1313
java_handle_t * builtin_java_new(java_handle_t *clazz)
Definition: builtin.cpp:963
java_handle_doublearray_t * builtin_newarray_double(int32_t size)
void builtin_verbosecall_exit(s8 l, double d, float f, methodinfo *m)
Definition: builtin.cpp:1224
double builtin_dsub(double a, double b)
Definition: builtin.cpp:1594
void builtin_arraycopy(java_handle_t *src, s4 srcStart, java_handle_t *dest, s4 destStart, s4 len)
Definition: builtin.cpp:1946
java_handle_objectarray_t * builtin_multianewarray(int n, java_handle_t *arrayclazz, long *dims)
Definition: builtin.cpp:1154
s8 builtin_land(s8 a, s8 b)
java_handle_longarray_t * builtin_newarray_long(int32_t size)
s8 builtin_currenttimemillis(void)
Definition: builtin.cpp:2063
s4 builtin_fcmpl(float a, float b)
Definition: builtin.cpp:1529
java_handle_t * builtin_clone(void *env, java_handle_t *o)
Definition: builtin.cpp:2081
float builtin_fmul(float a, float b)
Definition: builtin.cpp:1433
#define builtin_f2i
Definition: md-asm.hpp:114
functionptr fp
Definition: builtin.hpp:63
float builtin_l2f(s8 a)
Definition: builtin.cpp:1791
java_handle_array_t * builtin_java_newarray(int32_t size, java_handle_t *arrayclazz)
Definition: builtin.cpp:1037
builtintable_entry * builtintable_get_automatic(s4 opcode)
Definition: builtin.cpp:295
#define fp
Definition: md-asm.hpp:79
u4 flags
Definition: builtin.hpp:62
float builtin_fadd(float a, float b)
Definition: builtin.cpp:1404
float builtin_frem(float a, float b)
Definition: builtin.cpp:1567