* src/vm/jit/optimizing/profile.c (native/jni.h): Removed.
[cacao.git] / src / vm / jit / asmpart.h
index 23936504c8878bdd5d208133d521e06aae599af6..2a4a2395fd8e94258155ecaf4068e31ffcfad4ec 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/asmpart.h - prototypes for machine specfic functions
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Reinhard Grafl
-            Andreas Krall
-
-   Changes: Christian Thalinger
-
-   $Id: asmpart.h 4357 2006-01-22 23:33:38Z twisti $
+   $Id: asmpart.h 7338 2007-02-13 00:17:22Z twisti $
 
 */
 
 #include "config.h"
 #include "vm/types.h"
 
-
-#if defined(USE_THREADS)
-# if defined(NATIVE_THREADS)
-#  include "threads/native/threads.h"
-# else
-#  include "threads/green/threads.h"
-# endif
+#if defined(ENABLE_THREADS)
+# include "threads/critical.h"
 #endif
 
 #include "vm/global.h"
-#include "vm/linker.h"
-#include "vm/resolve.h"
-#include "vm/jit/stacktrace.h"
+#include "vm/vm.h"
+
+#include "vm/jit/replace.h"
+
+#include "vmcore/linker.h"
 
 
 /* some macros ****************************************************************/
 #if defined(ENABLE_JIT)
 # if defined(ENABLE_INTRP)
 
-#  define ASM_CALLJAVAFUNCTION(m,a0,a1,a2,a3) \
-    do { \
-        if (opt_intrp) \
-            (void) intrp_asm_calljavafunction((m), (a0), (a1), (a2), (a3)); \
-        else \
-            (void) asm_calljavafunction((m), (a0), (a1), (a2), (a3)); \
-    } while (0)
-
-#  define ASM_CALLJAVAFUNCTION_ADR(o,m,a0,a1,a2,a3) \
-    do { \
-        if (opt_intrp) \
-            (o) = intrp_asm_calljavafunction((m), (a0), (a1), (a2), (a3)); \
-        else \
-            (o) = asm_calljavafunction((m), (a0), (a1), (a2), (a3)); \
-    } while (0)
-
-#  define ASM_CALLJAVAFUNCTION_INT(i,m,a0,a1,a2,a3) \
-    do { \
-        if (opt_intrp) \
-            (i) = intrp_asm_calljavafunction_int((m), (a0), (a1), (a2), (a3)); \
-        else \
-            (i) = asm_calljavafunction_int((m), (a0), (a1), (a2), (a3)); \
-    } while (0)
-
-
-#  define ASM_CALLJAVAFUNCTION2(m,count,x,callblock) \
-    do { \
-        if (opt_intrp) \
-            (void) intrp_asm_calljavafunction2((m), (count), (x), (callblock)); \
-        else \
-            (void) asm_calljavafunction2((m), (count), (x), (callblock)); \
-    } while (0)
-
-#  define ASM_CALLJAVAFUNCTION2_ADR(o,m,count,x,callblock) \
-    do { \
-        if (opt_intrp) \
-            (o) = intrp_asm_calljavafunction2((m), (count), (x), (callblock)); \
-        else \
-            (o) = asm_calljavafunction2((m), (count), (x), (callblock)); \
-    } while (0)
-
-#  define ASM_CALLJAVAFUNCTION2_INT(i,m,count,x,callblock) \
-    do { \
-        if (opt_intrp) \
-            (i) = intrp_asm_calljavafunction2int((m), (count), (x), (callblock)); \
-        else \
-            (i) = asm_calljavafunction2int((m), (count), (x), (callblock)); \
-    } while (0)
-
-#  define ASM_CALLJAVAFUNCTION2_LONG(l,m,count,x,callblock) \
-    do { \
-        if (opt_intrp) \
-            (l) = intrp_asm_calljavafunction2long((m), (count), (x), (callblock)); \
-        else \
-            (l) = asm_calljavafunction2long((m), (count), (x), (callblock)); \
-    } while (0)
-
-#  define ASM_CALLJAVAFUNCTION2_FLOAT(f,m,count,x,callblock) \
-    do { \
-        if (opt_intrp) \
-            (f) = intrp_asm_calljavafunction2float((m), (count), (x), (callblock)); \
-        else \
-            (f) = asm_calljavafunction2float((m), (count), (x), (callblock)); \
-    } while (0)
-
-#  define ASM_CALLJAVAFUNCTION2_DOUBLE(d,m,count,x,callblock) \
-    do { \
-        if (opt_intrp) \
-            (d) = intrp_asm_calljavafunction2double((m), (count), (x), (callblock)); \
-        else \
-            (d) = asm_calljavafunction2double((m), (count), (x), (callblock)); \
-    } while (0)
-
-
 #  define ASM_GETCLASSVALUES_ATOMIC(super,sub,out) \
     do { \
         if (opt_intrp) \
 
 # else /* defined(ENABLE_INTRP) */
 
-#  define ASM_CALLJAVAFUNCTION(m,a0,a1,a2,a3) \
-    (void) asm_calljavafunction((m), (a0), (a1), (a2), (a3))
-
-#  define ASM_CALLJAVAFUNCTION_ADR(o,m,a0,a1,a2,a3) \
-    (o) = asm_calljavafunction((m), (a0), (a1), (a2), (a3))
-
-#  define ASM_CALLJAVAFUNCTION_INT(i,m,a0,a1,a2,a3) \
-    (i) = asm_calljavafunction_int((m), (a0), (a1), (a2), (a3))
-
-
-#  define ASM_CALLJAVAFUNCTION2(m,count,x,callblock) \
-    (void) asm_calljavafunction2((m), (count), (x), (callblock))
-
-#  define ASM_CALLJAVAFUNCTION2_ADR(o,m,count,x,callblock) \
-    (o) = asm_calljavafunction2((m), (count), (x), (callblock))
-
-#  define ASM_CALLJAVAFUNCTION2_INT(i,m,count,x,callblock) \
-    (i) = asm_calljavafunction2int((m), (count), (x), (callblock))
-
-#  define ASM_CALLJAVAFUNCTION2_LONG(l,m,count,x,callblock) \
-    (l) = asm_calljavafunction2long((m), (count), (x), (callblock))
-
-#  define ASM_CALLJAVAFUNCTION2_FLOAT(f,m,count,x,callblock) \
-    (f) = asm_calljavafunction2float((m), (count), (x), (callblock))
-
-#  define ASM_CALLJAVAFUNCTION2_DOUBLE(d,m,count,x,callblock) \
-    (d) = asm_calljavafunction2double((m), (count), (x), (callblock))
-
-
 #  define ASM_GETCLASSVALUES_ATOMIC(super,sub,out) \
     asm_getclassvalues_atomic((super), (sub), (out))
 
 
 #else /* defined(ENABLE_JIT) */
 
-# define ASM_CALLJAVAFUNCTION(m,a0,a1,a2,a3) \
-    (void) intrp_asm_calljavafunction((m), (a0), (a1), (a2), (a3))
-
-# define ASM_CALLJAVAFUNCTION_ADR(o,m,a0,a1,a2,a3) \
-    (o) = intrp_asm_calljavafunction((m), (a0), (a1), (a2), (a3))
-
-# define ASM_CALLJAVAFUNCTION_INT(i,m,a0,a1,a2,a3) \
-    (i) = intrp_asm_calljavafunction_int((m), (a0), (a1), (a2), (a3))
-
-
-# define ASM_CALLJAVAFUNCTION2(m,count,x,callblock) \
-    (void) intrp_asm_calljavafunction2((m), (count), (x), (callblock))
-
-# define ASM_CALLJAVAFUNCTION2_ADR(o,m,count,x,callblock) \
-    (o) = intrp_asm_calljavafunction2((m), (count), (x), (callblock))
-
-# define ASM_CALLJAVAFUNCTION2_INT(i,m,count,x,callblock) \
-    (i) = intrp_asm_calljavafunction2int((m), (count), (x), (callblock))
-
-# define ASM_CALLJAVAFUNCTION2_LONG(l,m,count,x,callblock) \
-    (l) = intrp_asm_calljavafunction2long((m), (count), (x), (callblock))
-
-# define ASM_CALLJAVAFUNCTION2_FLOAT(f,m,count,x,callblock) \
-    (f) = intrp_asm_calljavafunction2float((m), (count), (x), (callblock))
-
-# define ASM_CALLJAVAFUNCTION2_DOUBLE(d,m,count,x,callblock) \
-    (d) = intrp_asm_calljavafunction2double((m), (count), (x), (callblock))
-
-
 #  define ASM_GETCLASSVALUES_ATOMIC(super,sub,out) \
     intrp_asm_getclassvalues_atomic((super), (sub), (out))
 
@@ -224,15 +82,10 @@ struct castinfo {
 };
 
 
-#if defined(__ALPHA__)
-/* 
-   determines if the byte support instruction set (21164a and higher)
-   is available.
-*/
-int has_no_x_instr_set(void);
-void asm_sync_instruction_cache(void);
-#endif
+/* function prototypes ********************************************************/
 
+/* machine dependent initialization */
+s4   asm_md_init(void);
 
 /* 
    invokes the compiler for untranslated JavaVM methods.
@@ -241,100 +94,64 @@ void asm_sync_instruction_cache(void);
 */
 void asm_call_jit_compiler(void);
 
-
-/* 
-   This function calls a Java-method (which possibly needs compilation)
-   with up to 4 parameters. This function calls a Java-method (which
-   possibly needs compilation) with up to 4 parameters.
-*/
-
 #if defined(ENABLE_JIT)
-java_objectheader *asm_calljavafunction(methodinfo *m,
-                                                                               void *arg1, void *arg2,
-                                                                               void *arg3, void *arg4);
+java_objectheader *asm_vm_call_method(methodinfo *m, s4 vmargscount,
+                                                                         vm_arg *vmargs);
+
+s4     asm_vm_call_method_int(methodinfo *m, s4 vmargscount, vm_arg *vmargs);
+s8     asm_vm_call_method_long(methodinfo *m, s4 vmargscount, vm_arg *vmargs);
+float  asm_vm_call_method_float(methodinfo *m, s4 vmargscount, vm_arg *vmargs);
+double asm_vm_call_method_double(methodinfo *m, s4 vmargscount, vm_arg *vmargs);
 
-s4 asm_calljavafunction_int(methodinfo *m,
-                                                       void *arg1, void *arg2,
-                                                       void *arg3, void *arg4);
+void   asm_vm_call_method_exception_handler(void);
 #endif
 
 #if defined(ENABLE_INTRP)
-java_objectheader *intrp_asm_calljavafunction(methodinfo *m,
-                                                                                         void *arg1, void *arg2,
-                                                                                         void *arg3, void *arg4);
-
-s4 intrp_asm_calljavafunction_int(methodinfo *m,
-                                                                 void *arg1, void *arg2,
-                                                                 void *arg3, void *arg4);
+java_objectheader *intrp_asm_vm_call_method(methodinfo *m, s4 vmargscount,
+                                                                                       vm_arg *vmargs);
+
+s4     intrp_asm_vm_call_method_int(methodinfo *m, s4 vmargscount,
+                                                                       vm_arg *vmargs);
+s8     intrp_asm_vm_call_method_long(methodinfo *m, s4 vmargscount,
+                                                                        vm_arg *vmargs);
+float  intrp_asm_vm_call_method_float(methodinfo *m, s4 vmargscount,
+                                                                         vm_arg *vmargs);
+double intrp_asm_vm_call_method_double(methodinfo *m, s4 vmargscount,
+                                                                          vm_arg *vmargs);
 #endif
 
-
-/* 
-   This function calls a Java-method (which possibly needs compilation)
-   with up to 4 parameters. This function calls a Java-method (which
-   possibly needs compilation) with up to 4 parameters. 
-   also supports a return value
-*/
+/* exception handling functions */
 
 #if defined(ENABLE_JIT)
-java_objectheader *asm_calljavafunction2(methodinfo *m, u4 count, u4 size,
-                                                                                jni_callblock *callblock);
-
-s4 asm_calljavafunction2int(methodinfo *m, u4 count, u4 size,
-                                                       jni_callblock *callblock);
-
-s8 asm_calljavafunction2long(methodinfo *m, u4 count, u4 size,
-                                                        jni_callblock *callblock);
-
-float asm_calljavafunction2float(methodinfo *m, u4 count, u4 size,
-                                                                jni_callblock *callblock);
-
-double asm_calljavafunction2double(methodinfo *m, u4 count, u4 size,
-                                                                  jni_callblock *callblock);
+void asm_handle_exception(void);
+void asm_handle_nat_exception(void);
 #endif
 
-#if defined(ENABLE_INTRP)
-java_objectheader *intrp_asm_calljavafunction2(methodinfo *m, u4 count, u4 size,
-                                                                                          jni_callblock *callblock);
-
-s4 intrp_asm_calljavafunction2int(methodinfo *m, u4 count, u4 size,
-                                                                 jni_callblock *callblock);
-
-s8 intrp_asm_calljavafunction2long(methodinfo *m, u4 count, u4 size,
-                                                                  jni_callblock *callblock);
-
-float intrp_asm_calljavafunction2float(methodinfo *m, u4 count, u4 size,
-                                                                          jni_callblock *callblock);
-
-double intrp_asm_calljavafunction2double(methodinfo *m, u4 count, u4 size,
-                                                                                jni_callblock *callblock);
+/* stub for throwing AbstractMethodError's */
+#if defined(ENABLE_JIT)
+void asm_abstractmethoderror(void);
 #endif
 
-
-/* We need these two labels in codegen.inc to add the asm_calljavafunction*'s
-   into the methodtable */
-#if defined(__I386__) || defined(__X86_64__)
-void calljava_xhandler(void);
-void calljava_xhandler2(void);
+#if defined(ENABLE_INTRP)
+void intrp_asm_abstractmethoderror(void);
 #endif
 
-/* exception handling functions */
+/* wrapper for code patching functions */
+void asm_patcher_wrapper(void);
 
-#if defined(ENABLE_JIT)
-void asm_handle_exception(void);
-void asm_handle_nat_exception(void);
+/* functions for on-stack replacement */
+#if defined(ENABLE_REPLACEMENT)
+void asm_replacement_out(void);
+void asm_replacement_in(executionstate_t *es, replace_safestack_t *st);
 #endif
 
-/* wrapper for code patching functions */
-void asm_wrapper_patcher(void);
-
-void *asm_switchstackandcall(void *stack, void *func, void **stacktopsave, void * p);
+long asm_compare_and_swap(volatile long *p, long oldval, long newval);
+void asm_memory_barrier(void);
 
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
-extern threadcritnode asm_criticalsections;
+#if defined(ENABLE_THREADS)
+extern critical_section_node_t asm_criticalsections;
 #endif
 
-
 #if defined(ENABLE_JIT)
 void asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out);
 #endif
@@ -343,14 +160,10 @@ void asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out);
 void intrp_asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out);
 #endif
 
+/* cache flush function */
+void asm_cacheflush(u1 *addr, s4 nbytes);
 
-#if defined(USE_THREADS) && !defined(NATIVE_THREADS)
-void asm_perform_threadswitch(u1 **from, u1 **to, u1 **stackTop);
-u1*  asm_initialize_thread_stack(void *func, u1 *stack);
-#endif
-
-/* may be required on some architectures (at least for PowerPC and ARM) */
-void asm_cacheflush(void *p, s4 size);
+u8 asm_get_cycle_count(void);
 
 #endif /* _ASMPART_H */
 
@@ -366,4 +179,5 @@ void asm_cacheflush(void *p, s4 size);
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */