78 #include "fdlibm/fdlibm.h"
79 #if defined(__CYGWIN__) && defined(Bias)
83 using namespace cacao;
87 #define copysignf copysign
88 #define finitef finite
124 if (!descpool.
add_class(utf8::java_lang_Object))
127 if (!descpool.
add_class(utf8::java_lang_Class))
136 if (descpool.
add_method(bte->descriptor) == -1)
143 if (descpool.
add_method(bte->descriptor) == -1)
152 if (descpool.
add_method(bte->descriptor) == -1)
279 for (bte = builtintable_internal; bte->
fp != NULL; bte++) {
307 first = builtintable_automatic;
308 last = builtintable_automatic + entries;
310 while (entries > 0) {
312 middle = first + half;
314 if (middle->
opcode < opcode) {
322 return (first != last ? first : NULL);
332 #if defined(ENABLE_JIT)
352 mr = iptr->
sx.
s23.s3.fmiref;
361 for (bte = builtintable_function; bte->
fp != NULL; bte++) {
369 iptr->
sx.
s23.s3.bte = bte;
609 if (*(
vftbl_t **) ((uint8_t *) s + t->subtype_offset) == t)
613 if (t->subtype_offset !=
OFFSET(
vftbl_t, subtype_display[DISPLAY_SIZE]))
615 return s->subtype_depth >= t->subtype_depth && s->subtype_overflow[t->subtype_depth - DISPLAY_SIZE] == t;
652 valuevftbl = o->
vftbl;
659 if (valuevftbl == componentvftbl)
664 baseval = componentvftbl->
baseval;
674 result = fast_subtype_check(valuevftbl, componentvftbl);
677 result = diffval <= (uint32_t) componentvftbl->
diffval;
683 else if (valuedesc == NULL) {
725 valuevftbl = o->
vftbl;
729 if (valuevftbl == elementvftbl)
734 baseval = elementvftbl->
baseval;
743 result = fast_subtype_check(valuevftbl, elementvftbl);
746 result = diffval <= (uint32_t) elementvftbl->
diffval;
777 valuevftbl = o->
vftbl;
781 if (valuevftbl == elementvftbl)
787 result = fast_subtype_check(valuevftbl, elementvftbl);
790 result = diffval <= (uint32_t) elementvftbl->
diffval;
819 #if defined(ENABLE_CYCLES_STATS)
820 u8 cycles_start, cycles_end;
859 #if !defined(ENABLE_GC_CACAO) && defined(ENABLE_HANDLES)
877 #if defined(ENABLE_ESCAPE_REASON)
879 print_escape_reasons();
884 #if defined(ENABLE_TLH)
888 # if defined(ENABLE_CYCLES_STATS)
889 u8 cycles_start, cycles_end;
912 # if !defined(NDEBUG)
934 # if !defined(ENABLE_GC_CACAO) && defined(ENABLE_HANDLES)
984 #if defined(ENABLE_CYCLES_STATS)
985 u8 cycles_start, cycles_end;
1045 Array a(size, arrayclass);
1064 #define BUILTIN_NEWARRAY_TYPE(type, name) \
1065 java_handle_##type##array_t *builtin_newarray_##type(int32_t size) \
1067 name##Array a(size); \
1068 return a.get_handle(); \
1104 int32_t
size = (int32_t) dims[0];
1105 Array a(size, arrayclass);
1125 for (i = 0; i <
size; i++) {
1127 #if defined(__MIPS__) && (SIZEOF_VOID_P == 4)
1164 for (i = 0; i < n; i++) {
1165 #if defined(__MIPS__) && (SIZEOF_VOID_P == 4)
1167 size = (
s4) dims[i * 2];
1169 size = (
s4) dims[i];
1195 #if !defined(NDEBUG)
1196 #ifdef TRACE_ARGS_NUM
1197 void builtin_verbosecall_enter(
s8 a0,
s8 a1,
1209 log_text(
"builtin_verbosecall_enter: Do not call me anymore!");
1223 #if !defined(NDEBUG)
1226 log_text(
"builtin_verbosecall_exit: Do not call me anymore!");
1242 #if !SUPPORT_DIVISION || defined(DISABLE_GC)
1270 #if !SUPPORT_LONG_ADD
1300 #if !SUPPORT_LONG_MUL
1312 #if !(SUPPORT_DIVISION && SUPPORT_LONG_DIV) || defined (DISABLE_GC)
1333 #if !SUPPORT_LONG_SHIFT
1356 c = ((
u8) a) >> (b & 63);
1528 #if !SUPPORT_FLOAT || !SUPPORT_FLOAT_CMP || defined(ENABLE_INTRP)
1560 if (a > b)
return 1;
1561 if (a == b)
return 0;
1581 if (finite(b))
return a + b;
1585 if (finite(b))
return a;
1587 if (copysign(1.0, a)==copysign(1.0, b))
return a;
1605 if (finite(b))
return a * b;
1608 else return copysign(b, copysign(1.0, b) * a);
1614 else return copysign(a, copysign(1.0, a) * b);
1617 return copysign(a, copysign(1.0, a) * copysign(1.0, b));
1651 if (copysign(1.0, a) == copysign(1.0, b))
1664 }
else if (finite(b)) {
1670 if (copysign(1.0, a) == copysign(1.0, b))
1709 return copysign(a, -copysign(1.0, a));
1716 #if !SUPPORT_DOUBLE || !SUPPORT_DOUBLE_CMP || defined(ENABLE_INTRP)
1725 if (!finite(a) || !finite(b)) {
1726 a = finite(a) ? 0 : copysign(1.0, a);
1727 b = finite(b) ? 0 : copysign(1.0, b);
1748 if (!finite(a) || !finite(b)) {
1749 a = finite(a) ? 0 : copysign(1.0, a);
1750 b = finite(b) ? 0 : copysign(1.0, b);
1772 #if !(SUPPORT_FLOAT && SUPPORT_I2F)
1775 float f = (float) a;
1781 #if !(SUPPORT_DOUBLE && SUPPORT_I2D)
1784 double d = (double) a;
1790 #if !(SUPPORT_FLOAT && SUPPORT_L2F)
1793 float f = (float) a;
1799 #if !(SUPPORT_DOUBLE && SUPPORT_L2D)
1802 double d = (double) a;
1808 #if !(SUPPORT_FLOAT && SUPPORT_F2I) || defined(ENABLE_INTRP) || defined(DISABLE_GC)
1836 #if !(SUPPORT_FLOAT && SUPPORT_F2L) || defined(DISABLE_GC)
1864 #if !(SUPPORT_DOUBLE && SUPPORT_D2I) || defined(ENABLE_INTRP) || defined(DISABLE_GC)
1870 if (a >= 2147483647)
1872 if (a <= (-2147483647-1))
1873 return (-2147483647-1);
1878 d = copysign(1.0, a);
1881 return (-2147483647-1);
1886 #if !(SUPPORT_DOUBLE && SUPPORT_D2L) || defined(DISABLE_GC)
1892 if (a >= 9223372036854775807LL)
1893 return 9223372036854775807LL;
1894 if (a <= (-9223372036854775807LL-1))
1895 return (-9223372036854775807LL-1);
1900 d = copysign(1.0, a);
1902 return 9223372036854775807LL;
1903 return (-9223372036854775807LL-1);
1908 #if !(SUPPORT_FLOAT && SUPPORT_DOUBLE)
1911 if (
finitef(a))
return (
double) a;
1953 if ((src == NULL) || (dest == NULL)) {
1970 if ((srcStart < 0) || (destStart < 0) || (len < 0)) {
1976 if ((((uint32_t) srcStart + (uint32_t) len) > (uint32_t) sa.
get_length()) ||
1977 (((uint32_t) destStart + (uint32_t) len) > (uint32_t) da.
get_length())) {
1996 ((
u1 *)
LLNI_DIRECT(src)) + dataoffset + componentsize * srcStart,
1997 u1, (
size_t) len * componentsize);
2007 if (destStart <= srcStart) {
2008 for (i = 0; i < len; i++) {
2024 for (i = len - 1; i >= 0; i--) {
2048 if (gettimeofday(&tv, NULL) == -1)
2049 vm_abort(
"gettimeofday failed: %s", strerror(errno));
2051 usecs = (
s8) tv.tv_sec * (1000 * 1000) + (
s8) tv.tv_usec;
2053 return usecs * 1000;
2104 #if !defined(ENABLE_GC_CACAO) && defined(ENABLE_HANDLES)
2114 #if defined(ENABLE_GC_CACAO)
2147 #if defined(ENABLE_GC_CACAO)
2159 #if defined(ENABLE_CYCLES_STATS)
2160 void builtin_print_cycles_stats(FILE *file)
2162 fprintf(file,
"builtin cylce count statistics:\n");
double builtin_drem(double a, double b)
methodptr * interfacetable[1]
void trace_exception_builtin(java_handle_t *h)
bool builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o)
bool builtin_instanceof(java_handle_t *o, classinfo *c)
bool builtintable_replace_function(void *iptr_)
float builtin_fsub(float a, float b)
static bool builtintable_init(void)
s8 builtin_lmul(s8 a, s8 b)
s4 builtin_dcmpl(double a, double b)
bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
#define RT_TIMER_STOP(var)
Stop the timer var.
bool builtin_checkcast(java_handle_t *o, classinfo *c)
double builtin_f2d(float a)
void exceptions_throw_arraystoreexception(void)
virtual java_handle_array_t * get_handle() const
s4 builtin_idiv(s4 a, s4 b)
#define CYCLES_STATS_GET(var)
s4 builtin_irem(s4 a, s4 b)
#define CYCLES_STATS_COUNT(name, cyclesexpr)
double builtin_dneg(double a)
s8 builtin_lushr(s8 a, s4 b)
java_object_t * builtin_fast_new(classinfo *c)
#define CYCLES_STATS_PRINT(name, file)
s4 builtin_dcmpg(double a, double b)
Actual implementation of access class for Java Object arrays.
double builtin_ddiv(double a, double b)
void exceptions_throw_clonenotsupportedexception(void)
typedef void(JNICALL *jvmtiEventSingleStep)(jvmtiEnv *jvmti_env
T get_element(int32_t index)
void exceptions_throw_instantiationerror(classinfo *c)
#define RT_TIMER_START(var)
Start the timer var.
s4 builtin_lcmp(s8 a, s8 b)
#define LLNI_CRITICAL_END
bool builtin_fast_arraycheckcast(java_object_t *o, classinfo *targetclass)
methodinfo * method_new_builtin(builtintable_entry *bte)
java_object_t * builtin_retrieve_exception(void)
void set_element(int32_t index, T value)
classinfo * class_java_lang_Object
static void builtintable_sort_automatic(void)
bool class_is_arraycompatible(arraydescriptor *desc, arraydescriptor *target)
JNIEnv jthread jobject jclass jlong size
static float intBitsToFloat(s4 i)
double builtin_dmul(double a, double b)
#define TRACESUBSYSTEMINITIALIZATION(text)
java_handle_t * builtin_new(classinfo *c)
void vm_abort(const char *text,...)
#define RT_REGISTER_GROUP(var, name, description)
Register a new (toplevel) group.
#define CYCLES_STATS_PRINT_OVERHEAD(name, file)
void(* functionptr)(void)
void * heap_alloc(u4 size, u4 references, methodinfo *finalizer, bool collect)
#define UNLOCK_CLASSRENUMBER_LOCK
float builtin_fdiv(float a, float b)
#define LLNI_class_get(obj, variable)
#define LLNI_QUICKWRAP(obj)
static int builtintable_comparator(const void *a, const void *b)
builtintable_entry * builtintable_get_internal(functionptr fp)
#define builtin_throw_exception
int32_t get_length() const
#define RT_REGISTER_GROUP_TIMER(var, name, description, group)
Register a new timer.
s8 builtin_lsub(s8 a, s8 b)
void exceptions_set_exception(java_handle_t *e)
float builtin_d2f(double a)
#define BUILTINTABLE_FLAG_EXCEPTION
#define BUILTIN_NEWARRAY_TYPE(type, name)
void exceptions_throw_nullpointerexception(void)
bool builtin_fast_arrayinstanceof(java_object_t *o, classinfo *targetclass)
s8 builtin_nanotime(void)
#define MMOVE(dest, src, type, num)
#define exceptions_get_and_clear_exception
static Utf8String from_utf8(const char *, size_t)
Fieldref, Methodref and InterfaceMethodref.
bool class_isanysubclass(classinfo *sub, classinfo *super)
s4 builtin_fcmpg(float a, float b)
bool builtin_arrayinstanceof(java_handle_t *h, classinfo *targetclass)
float builtin_fneg(float a)
union instruction::@12 sx
bool initialize_class(classinfo *c)
const Utf8String descriptor
void exceptions_throw_negativearraysizeexception(void)
arraydescriptor * arraydesc
This file contains the real-time timing utilities.
s8 builtin_lshr(s8 a, s4 b)
#define BUILTINTABLE_FLAG_STUB
#define LOCK_CLASSRENUMBER_LOCK
s8 builtin_lrem(s8 a, s8 b)
void exceptions_throw_arrayindexoutofboundsexception(void)
This is a generic accessor class for Java arrays (of unspecified type), which can be used to safely o...
#define METHODREF_CLASSNAME(fmiref)
double builtin_dadd(double a, double b)
#define LLNI_vftbl_direct(obj)
bool builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
ssize_t add_method(Utf8String desc)
s8 builtin_ladd(s8 a, s8 b)
s8 builtin_lshl(s8 a, s4 b)
s8 builtin_ldiv(s8 a, s8 b)
java_handle_t * builtin_java_new(java_handle_t *clazz)
void builtin_verbosecall_exit(s8 l, double d, float f, methodinfo *m)
classinfo * link_class(classinfo *c)
void heap_init_objectheader(java_object_t *o, u4 bytelength)
double builtin_dsub(double a, double b)
void builtin_arraycopy(java_handle_t *src, s4 srcStart, java_handle_t *dest, s4 destStart, s4 len)
static void generate(methodinfo *m, builtintable_entry *bte)
Wrapper for codegen_emit_stub_native.
methoddesc * parse_method_descriptor(Utf8String desc, s4 mflags, constant_classref *thisclass)
#define LLNI_CRITICAL_START
java_handle_objectarray_t * builtin_multianewarray(int n, java_handle_t *arrayclazz, long *dims)
#define INSTRUCTION_IS_UNRESOLVED(iptr)
struct instruction::@12::@13 s23
s8 builtin_currenttimemillis(void)
#define CYCLES_STATS_DECLARE(name, nbins, divisor)
static float longBitsToDouble(s8 l)
s4 builtin_fcmpl(float a, float b)
java_handle_t * builtin_clone(void *env, java_handle_t *o)
float builtin_fmul(float a, float b)
#define LLNI_classinfo_unwrap(clazz)
bool add_class(Utf8String name)
#define MCOPY(dest, src, type, num)
static java_handle_array_t * builtin_multianewarray_intern(int n, classinfo *arrayclass, long *dims)
bool builtin_fast_canstore_onedim_class(java_objectarray_t *a, java_object_t *o)
constant_classref * create_classrefs(s4 *count)
java_handle_array_t * builtin_java_newarray(int32_t size, java_handle_t *arrayclazz)
builtintable_entry * builtintable_get_automatic(s4 opcode)
void log_message_class(const char *msg, classinfo *c)
classinfo * class_java_lang_Cloneable
float builtin_fadd(float a, float b)
void alloc_parsed_descriptors()
float builtin_frem(float a, float b)