Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: vm.c 8099 2007-06-18 18:26:58Z tbfg $
+ $Id: vm.c 8106 2007-06-19 22:50:17Z twisti $
*/
#endif
+/* vm_call_long_array **********************************************************
+
+ Calls a Java method with a variable number of arguments, passed via
+ an argument array, and returns a long (int64_t).
+
+*******************************************************************************/
+
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__)
+s8 vm_call_method_long_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
+{
+ s8 l;
+
+ STATISTICS(count_calls_native_to_java++);
+
+#if defined(ENABLE_JIT)
+# if defined(ENABLE_INTRP)
+ if (opt_intrp)
+ l = intrp_asm_vm_call_method_long(m, vmargscount, vmargs);
+ else
+# endif
+ l = asm_vm_call_method_long(m, vmargscount, vmargs);
+#else
+ l = intrp_asm_vm_call_method_long(m, vmargscount, vmargs);
+#endif
+
+ return l;
+}
+#else
+int64_t vm_call_long_array(methodinfo *m, uint64_t *array)
+{
+ methoddesc *md;
+ int64_t l;
+
+ md = m->parseddesc;
+
+ /* compile the method if not already done */
+
+ if (m->code == NULL)
+ if (!jit_compile(m))
+ return 0;
+
+ STATISTICS(count_calls_native_to_java++);
+
+#if defined(ENABLE_JIT)
+# if defined(ENABLE_INTRP)
+ if (opt_intrp)
+ l = intrp_asm_vm_call_method_long(m, vmargscount, vmargs);
+ else
+# endif
+ l = asm_vm_call_method_long(m->code->entrypoint, array, md->memuse);
+#else
+ l = intrp_asm_vm_call_method_long(m, vmargscount, vmargs);
+#endif
+
+ return l;
+}
+#endif
+
+
/* vm_call_method_long *********************************************************
Calls a Java method with a variable number of arguments and returns
#endif
-/* vm_call_method_long_vmarg ***************************************************
+/* vm_call_float_array *********************************************************
- Calls a Java method with a variable number of arguments, passed via
- a vm_arg array, and returns a long (s8).
+ Calls a Java method with a variable number of arguments and returns
+ an float.
*******************************************************************************/
#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__)
-s8 vm_call_method_long_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
+float vm_call_method_float_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
{
- s8 l;
+ float f;
+
+ vm_abort("IMPLEMENT ME!");
STATISTICS(count_calls_native_to_java++);
#if defined(ENABLE_JIT)
# if defined(ENABLE_INTRP)
if (opt_intrp)
- l = intrp_asm_vm_call_method_long(m, vmargscount, vmargs);
+ f = intrp_asm_vm_call_method_float(m, vmargscount, vmargs);
else
# endif
- l = asm_vm_call_method_long(m, vmargscount, vmargs);
+ f = asm_vm_call_method_float(m, vmargscount, vmargs);
#else
- l = intrp_asm_vm_call_method_long(m, vmargscount, vmargs);
+ f = intrp_asm_vm_call_method_float(m, vmargscount, vmargs);
#endif
- return l;
+ return f;
}
#else
-int64_t vm_call_long_array(methodinfo *m, uint64_t *array)
+float vm_call_float_array(methodinfo *m, uint64_t *array)
{
methoddesc *md;
- int64_t l;
+ float f;
md = m->parseddesc;
#if defined(ENABLE_JIT)
# if defined(ENABLE_INTRP)
if (opt_intrp)
- l = intrp_asm_vm_call_method_long(m, vmargscount, vmargs);
+ f = intrp_asm_vm_call_method_float(m, vmargscount, vmargs);
else
# endif
- l = asm_vm_call_method_long(m->code->entrypoint, array, md->memuse);
+ f = asm_vm_call_method_float(m->code->entrypoint, array, md->memuse);
#else
- l = intrp_asm_vm_call_method_long(m, vmargscount, vmargs);
+ f = intrp_asm_vm_call_method_float(m, vmargscount, vmargs);
#endif
- return l;
+ return f;
}
#endif
*******************************************************************************/
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__)
float vm_call_method_float_valist(methodinfo *m, java_objectheader *o,
va_list ap)
{
return f;
}
+#else
+float vm_call_method_float_valist(methodinfo *m, java_objectheader *o, va_list ap)
+{
+ int32_t dumpsize;
+ uint64_t *array;
+ float f;
+
+ /* mark start of dump memory area */
+
+ dumpsize = dump_size();
+
+ /* fill the argument array from a va_list */
+
+ array = vm_array_from_valist(m, o, ap);
+
+ /* call the Java method */
+
+ f = vm_call_float_array(m, array);
+
+ /* release dump area */
+
+ dump_release(dumpsize);
+
+ return f;
+}
+#endif
/* vm_call_method_float_jvalue *************************************************
*******************************************************************************/
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__)
float vm_call_method_float_jvalue(methodinfo *m, java_objectheader *o,
jvalue *args)
{
return f;
}
+#else
+float vm_call_method_float_jvalue(methodinfo *m, java_objectheader *o, jvalue *args)
+{
+ int32_t dumpsize;
+ uint64_t *array;
+ float f;
+
+ /* mark start of dump memory area */
+
+ dumpsize = dump_size();
+
+ /* fill the argument array from a va_list */
+
+ array = vm_array_from_jvalue(m, o, args);
+
+ /* call the Java method */
+
+ f = vm_call_float_array(m, array);
+
+ /* release dump area */
+
+ dump_release(dumpsize);
+
+ return f;
+}
+#endif
-/* vm_call_method_float_vmarg **************************************************
+/* vm_call_double_array ********************************************************
Calls a Java method with a variable number of arguments and returns
- an float.
+ a double.
*******************************************************************************/
-float vm_call_method_float_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__)
+double vm_call_method_double_vmarg(methodinfo *m, s4 vmargscount,
+ vm_arg *vmargs)
{
- float f;
+ double d;
vm_abort("IMPLEMENT ME!");
#if defined(ENABLE_JIT)
# if defined(ENABLE_INTRP)
if (opt_intrp)
- f = intrp_asm_vm_call_method_float(m, vmargscount, vmargs);
+ d = intrp_asm_vm_call_method_double(m, vmargscount, vmargs);
else
# endif
- f = asm_vm_call_method_float(m, vmargscount, vmargs);
+ d = asm_vm_call_method_double(m, vmargscount, vmargs);
#else
- f = intrp_asm_vm_call_method_float(m, vmargscount, vmargs);
+ d = intrp_asm_vm_call_method_double(m, vmargscount, vmargs);
#endif
- return f;
+ return d;
}
+#else
+double vm_call_double_array(methodinfo *m, uint64_t *array)
+{
+ methoddesc *md;
+ double d;
+
+ md = m->parseddesc;
+
+ /* compile the method if not already done */
+
+ if (m->code == NULL)
+ if (!jit_compile(m))
+ return 0;
+
+ STATISTICS(count_calls_native_to_java++);
+
+#if defined(ENABLE_JIT)
+# if defined(ENABLE_INTRP)
+ if (opt_intrp)
+ d = intrp_asm_vm_call_method_double(m, vmargscount, vmargs);
+ else
+# endif
+ d = asm_vm_call_method_double(m->code->entrypoint, array, md->memuse);
+#else
+ d = intrp_asm_vm_call_method_double(m, vmargscount, vmargs);
+#endif
+
+ return d;
+}
+#endif
/* vm_call_method_double *******************************************************
*******************************************************************************/
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__)
double vm_call_method_double_valist(methodinfo *m, java_objectheader *o,
va_list ap)
{
return d;
}
+#else
+double vm_call_method_double_valist(methodinfo *m, java_objectheader *o, va_list ap)
+{
+ int32_t dumpsize;
+ uint64_t *array;
+ double d;
+
+ /* mark start of dump memory area */
+
+ dumpsize = dump_size();
+
+ /* fill the argument array from a va_list */
+
+ array = vm_array_from_valist(m, o, ap);
+
+ /* call the Java method */
+
+ d = vm_call_double_array(m, array);
+
+ /* release dump area */
+
+ dump_release(dumpsize);
+
+ return d;
+}
+#endif
/* vm_call_method_double_jvalue ************************************************
*******************************************************************************/
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__)
double vm_call_method_double_jvalue(methodinfo *m, java_objectheader *o,
jvalue *args)
{
return d;
}
+#else
+double vm_call_method_double_jvalue(methodinfo *m, java_objectheader *o, jvalue *args)
+{
+ int32_t dumpsize;
+ uint64_t *array;
+ double d;
+ /* mark start of dump memory area */
-/* vm_call_method_double_vmarg *************************************************
+ dumpsize = dump_size();
- Calls a Java method with a variable number of arguments and returns
- a double.
+ /* fill the argument array from a va_list */
-*******************************************************************************/
+ array = vm_array_from_jvalue(m, o, args);
-double vm_call_method_double_vmarg(methodinfo *m, s4 vmargscount,
- vm_arg *vmargs)
-{
- double d;
+ /* call the Java method */
- vm_abort("IMPLEMENT ME!");
+ d = vm_call_double_array(m, array);
- STATISTICS(count_calls_native_to_java++);
+ /* release dump area */
-#if defined(ENABLE_JIT)
-# if defined(ENABLE_INTRP)
- if (opt_intrp)
- d = intrp_asm_vm_call_method_double(m, vmargscount, vmargs);
- else
-# endif
- d = asm_vm_call_method_double(m, vmargscount, vmargs);
-#else
- d = intrp_asm_vm_call_method_double(m, vmargscount, vmargs);
-#endif
+ dump_release(dumpsize);
return d;
}
+#endif
/*