* builtin_new: Removed i386 asm_builtin_new define
[cacao.git] / src / vm / builtin.h
index d734fd286d56e0b5048a7dcfa0f9c03017463313..7cfe035e1b3b1040daf84e517f8df013ca8e3a61 100644 (file)
@@ -1,9 +1,9 @@
-/* builtin.h - prototypes of builtin functions
+/* src/vm/builtin.h - prototypes of builtin functions
 
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
-   M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
-   P. Tomsich, J. Wenninger
+   Copyright (C) 1996-2005 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
 
    This file is part of CACAO.
 
@@ -27,8 +27,9 @@
    Authors: Reinhard Grafl
 
    Changes: Edwin Steiner
+            Christian Thalinger
 
-   $Id: builtin.h 1571 2004-11-23 16:05:04Z twisti $
+   $Id: builtin.h 3133 2005-08-23 14:34:49Z cacao $
 
 */
 
 #ifndef _BUILTIN_H
 #define _BUILTIN_H
 
+#include "arch.h"
 #include "config.h"
 #include "toolbox/logging.h"
-#include "threads/thread.h"
-#include "arch.h"
+
+#if defined(USE_THREADS)
+# if defined(NATIVE_THREADS)
+#  include "threads/native/threads.h"
+# else
+#  include "threads/green/threads.h"
+# endif
+#endif
+
+#include "vm/jit/stacktrace.h"
 
 
 /* define infinity for floating point numbers */
@@ -55,7 +65,7 @@
 #define DBL_NEGINF  0xfff0000000000000LL
 
 
-/* float versions are not defined in gnu classpath's fdlibm */
+/* float versions are not defined in GNU classpath's fdlibm */
 
 #define copysignf    copysign
 #define finitef      finite
 #define isnanf       isnan
 
 
-/**********************************************************************/
-/* BUILTIN FUNCTIONS TABLE                                            */
-/**********************************************************************/
+/* builtin functions table ****************************************************/
 
-/* IMPORTANT:
- * For each builtin function which is used in a BUILTIN* opcode there
- * must be an entry in the builtin_desc table in jit/jit.c.
- */
-typedef struct builtin_descriptor builtin_descriptor;
+typedef struct builtintable_entry builtintable_entry;
 
-/* There is a builtin_descriptor in builtin_desc for every builtin
- * function used in BUILTIN* opcodes.
- */
-struct builtin_descriptor {
-       int         opcode;   /* opcode which is replaced by this builtin */
-                             /* (255 means no automatic replacement,     */
-                             /*    0 means end of list.)                 */
-       functionptr builtin;  /* the builtin function (specify BUILTIN_...*/
-                             /* macro)                                   */
-       int         icmd;     /* the BUILTIN* opcode to use (# of args)   */
-       u1          type_s1;  /* type of 1st argument                     */
-       u1          type_s2;  /* type of 2nd argument, or TYPE_VOID       */
-       u1          type_s3;  /* type of 3rd argument, or TYPE_VOID       */
-       u1          type_d;   /* type of result (may be TYPE_VOID)        */
-       bool        supported;/* is <opcode> supported without builtin?   */
-       bool        isfloat;  /* is this a floating point operation?      */
-       char        *name;    /* display name of the builtin function     */
+struct builtintable_entry {
+       s4           opcode;                /* opcode which is replaced           */
+       functionptr  fp;                    /* function pointer of builtin        */
+       char        *descriptor;
+       char        *name;
+       methoddesc  *md;
 };
 
-extern builtin_descriptor builtin_desc[];
 
-/**********************************************************************/
-/* GLOBAL VARIABLES                                                   */
-/**********************************************************************/
+/* function prototypes ********************************************************/
 
-#define THREADSPECIFIC
-#define exceptionptr (&_exceptionptr)
-#define threadrootmethod (&_threadrootmethod)
+bool builtin_init(void);
 
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
-#ifdef HAVE___THREAD
-
-#undef THREADSPECIFIC
-#define THREADSPECIFIC __thread
-
-#endif
-
-#undef exceptionptr
-#undef threadrootmethod
-#define exceptionptr builtin_get_exceptionptrptr()
-#define threadrootmethod  builtin_get_threadrootmethod()
-#endif
-
-#if !defined(USE_THREADS) || !defined(NATIVE_THREADS)
-extern java_objectheader *_exceptionptr;
-extern methodinfo* _threadrootmethod;
-#endif
+builtintable_entry *builtintable_get_internal(functionptr fp);
+builtintable_entry *builtintable_get_automatic(s4 opcode);
 
 
 /**********************************************************************/
@@ -158,17 +129,8 @@ s4 builtin_checkcast(java_objectheader *obj, classinfo *class);
 /* NOT AN OP */
 s4 builtin_arrayinstanceof(java_objectheader *obj, vftbl_t *target);
 #define BUILTIN_arrayinstanceof (functionptr) builtin_arrayinstanceof
-
-#if defined(__I386__)
-s4 asm_builtin_arrayinstanceof(java_objectheader *obj, classinfo *class); /* XXX ? */
-#undef  BUILTIN_arrayinstanceof
-#define BUILTIN_arrayinstanceof (functionptr) asm_builtin_arrayinstanceof
-#endif
-
-s4 builtin_checkarraycast(java_objectheader *obj, vftbl_t *target);
-/* NOT AN OP */
-s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl_t *target);
-#define BUILTIN_checkarraycast (functionptr) asm_builtin_checkarraycast
+s4 builtin_arraycheckcast(java_objectheader *o, vftbl_t *target);
+#define BUILTIN_arraycheckcast (functionptr) builtin_arraycheckcast
 
 java_objectheader *builtin_throw_exception(java_objectheader *exception);
 /* NOT AN OP */
@@ -180,23 +142,13 @@ java_objectheader *builtin_trace_exception(java_objectheader *xptr,
 /* NOT AN OP */
 
 java_objectheader *builtin_new(classinfo *c);
-#ifdef __I386__
-java_objectheader *asm_builtin_new(classinfo *c);
-#define BUILTIN_new (functionptr) asm_builtin_new
-#else
 #define BUILTIN_new (functionptr) builtin_new
-#endif
 
 java_arrayheader *builtin_newarray(s4 size, vftbl_t *arrayvftbl);
 #define BUILTIN_newarray (functionptr) builtin_newarray
-java_objectarray *builtin_anewarray(s4 size, classinfo *component);
-/* NOT AN OP */
 
-#if defined(__I386__)
-void asm_builtin_newarray(s4 size, vftbl_t *arrayvftbl);
-#undef  BUILTIN_newarray
-#define BUILTIN_newarray (functionptr) asm_builtin_newarray
-#endif
+java_objectarray *builtin_anewarray(s4 size, classinfo *component);
+#define BUILTIN_anewarray (functionptr) builtin_anewarray
 
 java_booleanarray *builtin_newarray_boolean(s4 size);
 #define BUILTIN_newarray_boolean (functionptr) builtin_newarray_boolean
@@ -214,48 +166,44 @@ java_intarray *builtin_newarray_int(s4 size);
 #define BUILTIN_newarray_int (functionptr) builtin_newarray_int
 java_longarray *builtin_newarray_long(s4 size);
 #define BUILTIN_newarray_long (functionptr) builtin_newarray_long
-java_arrayheader *builtin_nmultianewarray(int n, vftbl_t *arrayvftbl, long *dims);
-/*  java_arrayheader *builtin_nmultianewarray(int n, classinfo *arrayclass, long *dims); */
-/* NOT AN OP */
+
+java_arrayheader *builtin_multianewarray(int n, vftbl_t *arrayvftbl, long *dims);
+#define BUILTIN_multianewarray (functionptr) builtin_multianewarray
 
 s4 builtin_canstore(java_objectarray *a, java_objectheader *o);
-/* NOT AN OP */
-void asm_builtin_aastore(java_objectarray *a, s4 index, java_objectheader *o);
-#define BUILTIN_aastore (functionptr) asm_builtin_aastore
+#define BUILTIN_canstore (functionptr) builtin_canstore
+
+#if defined(TRACE_ARGS_NUM)
+void builtin_trace_args(s8 a0, s8 a1,
+#if TRACE_ARGS_NUM >= 4
+                                               s8 a2, s8 a3,
+#endif /* TRACE_ARGS_NUM >= 4 */
+#if TRACE_ARGS_NUM >= 6
+                                               s8 a4, s8 a5,
+#endif /* TRACE_ARGS_NUM >= 6 */
+#if TRACE_ARGS_NUM == 8
+                                               s8 a6, s8 a7,
+#endif /* TRACE_ARGS_NUM == 8 */
+                                               methodinfo *m);
+/* NOT AN OP */
+#endif /* defined(TRACE_ARGS_NUM) */
 
-#ifdef TRACE_ARGS_NUM
-#if TRACE_ARGS_NUM == 6
-void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5, methodinfo *m);
-/* NOT AN OP */
-#else
-void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3, s8 a4, s8 a5, s8 a6, s8 a7, methodinfo *m);
-/* NOT AN OP */
-#endif
-#endif
-void builtin_displaymethodstart(methodinfo *m);
-/* NOT AN OP */
 void builtin_displaymethodstop(methodinfo *m, s8 l, double d, float f);
 /* NOT AN OP */
 
+#if defined(USE_THREADS)
 void builtin_monitorenter(java_objectheader *o);
-/* NOT AN OP */
+#define BUILTIN_monitorenter (functionptr) builtin_monitorenter
 void builtin_staticmonitorenter(classinfo *c);
-/* NOT AN OP */
-void asm_builtin_monitorenter(java_objectheader *o);
-#define BUILTIN_monitorenter (functionptr) asm_builtin_monitorenter
-void *builtin_monitorexit(java_objectheader *o);
-/* NOT AN OP */
-void *asm_builtin_monitorexit(java_objectheader *o);
-#define BUILTIN_monitorexit (functionptr) asm_builtin_monitorexit
+#define BUILTIN_staticmonitorenter (functionptr) builtin_staticmonitorenter
+void builtin_monitorexit(java_objectheader *o);
+#define BUILTIN_monitorexit (functionptr) builtin_monitorexit
+#endif
 
 s4 builtin_idiv(s4 a, s4 b);
-/* NOT AN OP */
-s4 asm_builtin_idiv(s4 a, s4 b);
-#define BUILTIN_idiv (functionptr) asm_builtin_idiv
+#define BUILTIN_idiv (functionptr) builtin_idiv
 s4 builtin_irem(s4 a, s4 b);
-/* NOT AN OP */
-s4 asm_builtin_irem(s4 a, s4 b);
-#define BUILTIN_irem (functionptr) asm_builtin_irem
+#define BUILTIN_irem (functionptr) builtin_irem
 
 s8 builtin_ladd(s8 a, s8 b);
 #define BUILTIN_ladd (functionptr) builtin_ladd
@@ -263,14 +211,12 @@ s8 builtin_lsub(s8 a, s8 b);
 #define BUILTIN_lsub (functionptr) builtin_lsub
 s8 builtin_lmul(s8 a, s8 b);
 #define BUILTIN_lmul (functionptr) builtin_lmul
+
 s8 builtin_ldiv(s8 a, s8 b);
-/* NOT AN OP */
-s8 asm_builtin_ldiv(s8 a, s8 b);
-#define BUILTIN_ldiv (functionptr) asm_builtin_ldiv
+#define BUILTIN_ldiv (functionptr) builtin_ldiv
 s8 builtin_lrem(s8 a, s8 b);
-/* NOT AN OP */
-s8 asm_builtin_lrem(s8 a, s8 b);
-#define BUILTIN_lrem (functionptr) asm_builtin_lrem
+#define BUILTIN_lrem (functionptr) builtin_lrem
+
 s8 builtin_lshl(s8 a, s4 b);
 #define BUILTIN_lshl (functionptr) builtin_lshl
 s8 builtin_lshr(s8 a, s4 b);
@@ -289,36 +235,36 @@ s4 builtin_lcmp(s8 a, s8 b);
 #define BUILTIN_lcmp (functionptr) builtin_lcmp
 
 float builtin_fadd(float a, float b);
-/* NOT AN OP */
+#define BUILTIN_fadd (functionptr) builtin_fadd
 float builtin_fsub(float a, float b);
-/* NOT AN OP */
+#define BUILTIN_fsub (functionptr) builtin_fsub
 float builtin_fmul(float a, float b);
-/* NOT AN OP */
+#define BUILTIN_fmul (functionptr) builtin_fmul
 float builtin_fdiv(float a, float b);
-/* NOT AN OP */
+#define BUILTIN_fdiv (functionptr) builtin_fdiv
 float builtin_fneg(float a);         
-/* NOT AN OP */
+#define BUILTIN_fneg (functionptr) builtin_fneg
 s4 builtin_fcmpl(float a, float b);  
-/* NOT AN OP */
+#define BUILTIN_fcmpl (functionptr) builtin_fcmpl
 s4 builtin_fcmpg(float a, float b);  
-/* NOT AN OP */
+#define BUILTIN_fcmpg (functionptr) builtin_fcmpg
 float builtin_frem(float a, float b);
 #define BUILTIN_frem (functionptr) builtin_frem
 
 double builtin_dadd(double a, double b);
-/* NOT AN OP */
+#define BUILTIN_dadd (functionptr) builtin_dadd
 double builtin_dsub(double a, double b);
-/* NOT AN OP */
+#define BUILTIN_dsub (functionptr) builtin_dsub
 double builtin_dmul(double a, double b);
-/* NOT AN OP */
+#define BUILTIN_dmul (functionptr) builtin_dmul
 double builtin_ddiv(double a, double b);
-/* NOT AN OP */
+#define BUILTIN_ddiv (functionptr) builtin_ddiv
 double builtin_dneg(double a);          
-/* NOT AN OP */
+#define BUILTIN_dneg (functionptr) builtin_dneg
 s4 builtin_dcmpl(double a, double b);   
-/* NOT AN OP */
+#define BUILTIN_dcmpl (functionptr) builtin_dcmpl
 s4 builtin_dcmpg(double a, double b);   
-/* NOT AN OP */
+#define BUILTIN_dcmpg (functionptr) builtin_dcmpg
 double builtin_drem(double a, double b);
 #define BUILTIN_drem (functionptr) builtin_drem
 
@@ -345,7 +291,7 @@ s8       asm_builtin_f2l(float a);
 /* NOT AN OP */
 
 double   builtin_f2d(float a);
-/* NOT AN OP */
+#define BUILTIN_f2d (functionptr) builtin_f2d
 
 s4       builtin_d2i(double a);
 #define BUILTIN_d2i (functionptr) builtin_d2i
@@ -357,34 +303,36 @@ s8       asm_builtin_d2l(double a);
 /* NOT AN OP */
 
 float    builtin_d2f(double a);
-/* NOT AN OP */
+#define BUILTIN_d2f (functionptr) builtin_d2f
 
 java_arrayheader *builtin_clone_array(void *env, java_arrayheader *o);
 /* NOT AN OP */
 
-/* builtin_dummy just panics if it is executed. */
-s4 builtin_dummy();
-/* NOT AN OP */
-
 /* conversion helper functions */
 inline float intBitsToFloat(s4 i);
 inline float longBitsToDouble(s8 l);
 
 /* this is a wrapper for calls from asmpart */
-java_objectheader **builtin_asm_get_exceptionptrptr();
+java_objectheader **builtin_asm_get_exceptionptrptr(void);
 
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
-static inline java_objectheader **builtin_get_exceptionptrptr();
+static inline java_objectheader **builtin_get_exceptionptrptr(void);
+static inline u1 *builtin_get_dontfillinexceptionstacktrace(void);
 /* NOT AN OP */
-static inline methodinfo **builtin_get_threadrootmethod();
+static inline methodinfo **builtin_get_threadrootmethod(void);
 /* NOT AN OP */
 
-inline java_objectheader **builtin_get_exceptionptrptr()
+inline java_objectheader **builtin_get_exceptionptrptr(void)
 {
        return &THREADINFO->_exceptionptr;
 }
 
-inline methodinfo **builtin_get_threadrootmethod()
+inline u1 *builtin_get_dontfillinexceptionstacktrace(void)
+{
+       return &THREADINFO->_dontfillinexceptionstacktrace;
+}
+
+inline methodinfo **builtin_get_threadrootmethod(void)
 {
        return &THREADINFO->_threadrootmethod;
 }
@@ -394,7 +342,7 @@ inline methodinfo **builtin_get_threadrootmethod()
 /* returns the root method of a thread. this is used in asmpart.S and delivers the abort condition
    for the stack unwinding for getClassContext and getClassLoader. For the main thread this is the main function.
    Otherwhise it is the thread's run method (at least that's how I see it) (jowenn) */
-methodinfo *builtin_asm_get_threadrootmethod();
+methodinfo *builtin_asm_get_threadrootmethod(void);
 
 /* returns the current top element of the stack frame info list (needed for unwinding across native functions) */
 /* on i386 this is a pointer to a structure 
@@ -405,8 +353,11 @@ methodinfo *builtin_asm_get_threadrootmethod();
 points here---->| previous element in list                     |
                ------------------------------------------------
 */
-void *builtin_asm_get_stackframeinfo();
-stacktraceelement *builtin_stacktrace_copy(stacktraceelement **,stacktraceelement *begin, stacktraceelement *end);
+void *builtin_asm_get_stackframeinfo(void);
+stacktraceelement *builtin_stacktrace_copy(stacktraceelement **el,
+                                                                                  stacktraceelement *begin,
+                                                                                  stacktraceelement *end);
+
 #endif /* _BUILTIN_H */