* builtin_multianewarray: Handle MIPS32 correctly (s4 in an s8 slot)
[cacao.git] / src / vm / builtin.c
index 7741f2371391ec7121d32d7cda286020a28473c2..f0376467d0734df6a2626d73760de3f557b65038 100644 (file)
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 2888 2005-07-03 16:38:33Z christian $
+   $Id: builtin.c 3134 2005-08-23 14:45:29Z cacao $
 
 */
 
 
 #include <assert.h>
-#include <math.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -51,6 +50,8 @@
 #include "md-abi.h"
 #include "types.h"
 
+#include "classpath/native/fdlibm/fdlibm.h"
+
 #include "mm/boehm.h"
 #include "mm/memory.h"
 #include "native/native.h"
@@ -263,35 +264,6 @@ bool builtin_init(void)
 }
 
 
-/* builtintable_entry_debug_dump ***********************************************
-
-   Prints a builtintable_entry in human-readable form.
-
-*******************************************************************************/
-
-void builtintable_entry_debug_dump(FILE *file, builtintable_entry *bte)
-{
-       char *name;
-       char *desc;
-       
-       if (!bte) {
-               fprintf(file,"(builtintable_entry *)NULL");
-               return;
-       }
-
-       name = bte->name;
-       if (!name)
-               name = "<name=NULL>";
-       desc = (bte->md) ? "parsed " : bte->descriptor;
-       if (!desc)
-               desc = "<desc=NULL>";
-       fprintf(file,"BUILTIN(%d,%p,%s %s",
-                       bte->opcode,(void*)bte->fp,name,desc);
-       descriptor_debug_print_methoddesc(file,bte->md);
-       fputc(')',file);
-}
-
-
 /* builtintable_get_internal ***************************************************
 
    Finds an entry in the builtintable for internal functions and
@@ -758,7 +730,7 @@ java_objectheader *builtin_new(classinfo *c)
        java_objectheader *o;
 
        /* is the class loaded */
-       /*utf_fprint(stderr,c->name);fprintf(stderr,"\n");*/
+
        assert(c->loaded);
 
        /* is the class linked */
@@ -1049,8 +1021,14 @@ java_arrayheader *builtin_multianewarray(int n, vftbl_t *arrayvftbl, long *dims)
        /* create the component arrays */
 
        for (i = 0; i < size; i++) {
-               java_arrayheader *ea = 
+               java_arrayheader *ea =
+#if defined(__MIPS__) && (SIZEOF_VOID_P == 4)
+                       /* we save an s4 to a s8 slot, 8-byte aligned */
+
+                       builtin_multianewarray(n, componentvftbl, dims + 2);
+#else
                        builtin_multianewarray(n, componentvftbl, dims + 1);
+#endif
 
                if (!ea)
                        return NULL;
@@ -1082,13 +1060,6 @@ java_objectheader *builtin_trace_exception(java_objectheader *xptr,
        s4    logtextlen;
        s4    dumpsize;
 
-       if (!noindent) {
-               if (methodindent)
-                       methodindent--;
-               else
-                       log_text("WARNING: unmatched methodindent--");
-       }
-
        if (opt_verbose || runverbose || verboseexception) {
                /* calculate message length */
 
@@ -1107,6 +1078,7 @@ java_objectheader *builtin_trace_exception(java_objectheader *xptr,
                                utf_strlen(m->class->name) +
                                strlen(".") +
                                utf_strlen(m->name) +
+                               utf_strlen(m->descriptor) +
                                strlen("(NOSYNC,NATIVE");
 
 #if SIZEOF_VOID_P == 8
@@ -1148,6 +1120,7 @@ java_objectheader *builtin_trace_exception(java_objectheader *xptr,
                        utf_strcat_classname(logtext, m->class->name);
                        strcat(logtext, ".");
                        utf_strcat(logtext, m->name);
+                       utf_strcat(logtext, m->descriptor);
 
                        if (m->flags & ACC_SYNCHRONIZED)
                                strcat(logtext, "(SYNC");
@@ -1207,13 +1180,16 @@ java_objectheader *builtin_trace_exception(java_objectheader *xptr,
 *******************************************************************************/
 
 #ifdef TRACE_ARGS_NUM
-void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
+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
+#endif /* TRACE_ARGS_NUM >= 6 */
 #if TRACE_ARGS_NUM == 8
                                                s8 a6, s8 a7,
-#endif
+#endif /* TRACE_ARGS_NUM == 8 */
                                                methodinfo *m)
 {
        methoddesc *md;
@@ -1224,8 +1200,6 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
 
        md = m->parseddesc;
 
-       if ( strcmp(m->name->text, "arraycopy")==0 )
-               printf("-----------\n");
        /* calculate message length */
 
        logtextlen =
@@ -1292,6 +1266,7 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
                                a0, a1);
                break;
 
+#if TRACE_ARGS_NUM >= 4
        case 3:
                sprintf(logtext + strlen(logtext),
                                "0x%llx, 0x%llx, 0x%llx",
@@ -1304,6 +1279,7 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
                sprintf(logtext + strlen(logtext), ", 0x%llx", a3);
 
                break;
+#endif /* TRACE_ARGS_NUM >= 4 */
 
 #if TRACE_ARGS_NUM >= 6
        case 5:
@@ -1340,15 +1316,18 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
 #endif /* TRACE_ARGS_NUM == 8 */
 
        default:
-#if TRACE_ARGS_NUM == 4
+#if TRACE_ARGS_NUM == 2
+               sprintf(logtext + strlen(logtext), "0x%llx, 0x%llx, ...(%d)", a0, a1, md->paramcount - 2);
+
+#elif TRACE_ARGS_NUM == 4
                sprintf(logtext + strlen(logtext),
                                "0x%llx, 0x%llx, 0x%llx, 0x%llx, ...(%d)",
-                               a0, a1, a2, a3, m->paramcount - 4);
+                               a0, a1, a2, a3, md->paramcount - 4);
 
 #elif TRACE_ARGS_NUM == 6
                sprintf(logtext + strlen(logtext),
                                "0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, ...(%d)",
-                               a0, a1, a2, a3, a4, a5, m->paramcount - 6);
+                               a0, a1, a2, a3, a4, a5, md->paramcount - 6);
 
 #elif TRACE_ARGS_NUM == 8
                sprintf(logtext + strlen(logtext),"0x%llx, 0x%llx, 0x%llx,"
@@ -1356,7 +1335,7 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
                sprintf(logtext + strlen(logtext)," 0x%llx, 0x%llx, 0x%llx,"
                                , a3, a4, a5);
                sprintf(logtext + strlen(logtext)," 0x%llx, 0x%llx, ...(%d)"
-                               , a6, a7, m->paramcount - 8);
+                               , a6, a7, md->paramcount - 8);
 #endif
                break;
 
@@ -1417,17 +1396,17 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
 #if TRACE_ARGS_NUM == 4
                sprintf(logtext + strlen(logtext),
                                "0x%lx, 0x%lx, 0x%lx, 0x%lx, ...(%d)",
-                               a0, a1, a2, a3, m->paramcount - 4);
+                               a0, a1, a2, a3, md->paramcount - 4);
 
 #elif TRACE_ARGS_NUM == 6
                sprintf(logtext + strlen(logtext),
                                "0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, ...(%d)",
-                               a0, a1, a2, a3, a4, a5, m->paramcount - 6);
+                               a0, a1, a2, a3, a4, a5, md->paramcount - 6);
 
 #elif TRACE_ARGS_NUM == 8
                sprintf(logtext + strlen(logtext),
                                "0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, ...(%d)",
-                               a0, a1, a2, a3, a4, a5, a6, a7, m->paramcount - 8);
+                               a0, a1, a2, a3, a4, a5, a6, a7, md->paramcount - 8);
 #endif
                break;
 #endif /* SIZEOF_VOID_P == 4 */
@@ -1717,113 +1696,160 @@ s4 builtin_irem(s4 a, s4 b) { return a % b; }
 
 ******************************************************************************/
 
-
 s8 builtin_ladd(s8 a, s8 b)
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return a + b; 
+       c = a + b; 
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_lsub(s8 a, s8 b) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return a - b; 
+       c = a - b; 
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_lmul(s8 a, s8 b) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return a * b; 
+       c = a * b; 
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_ldiv(s8 a, s8 b) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return a / b; 
+       c = a / b; 
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_lrem(s8 a, s8 b) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return a % b; 
+       c = a % b; 
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_lshl(s8 a, s4 b) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return a << (b & 63);
+       c = a << (b & 63);
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_lshr(s8 a, s4 b) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return a >> (b & 63);
+       c = a >> (b & 63);
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_lushr(s8 a, s4 b) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return ((u8) a) >> (b & 63);
+       c = ((u8) a) >> (b & 63);
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_land(s8 a, s8 b) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return a & b; 
+       c = a & b; 
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_lor(s8 a, s8 b) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return a | b; 
+       c = a | b; 
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_lxor(s8 a, s8 b) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return a ^ b; 
+       c = a ^ b; 
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s8 builtin_lneg(s8 a) 
-{ 
+{
+       s8 c;
+
 #if U8_AVAILABLE
-       return -a;
+       c = -a;
 #else
-       return builtin_i2l(0);
+       c = builtin_i2l(0);
 #endif
+
+       return c;
 }
 
 s4 builtin_lcmp(s8 a, s8 b) 
@@ -2238,8 +2264,11 @@ double builtin_l2d(s8 a)
 
 s4 builtin_f2i(float a) 
 {
+       s4 i;
 
-       return builtin_d2i((double) a);
+       i = builtin_d2i((double) a);
+
+       return i;
 
        /*      float f;
        
@@ -2261,8 +2290,11 @@ s4 builtin_f2i(float a)
 
 s8 builtin_f2l(float a)
 {
+       s8 l;
+
+       l = builtin_d2l((double) a);
 
-       return builtin_d2l((double) a);
+       return l;
 
        /*      float f;
        
@@ -2369,21 +2401,22 @@ inline float longBitsToDouble(s8 l)
 }
 
 
-java_arrayheader *builtin_clone_array(void *env, java_arrayheader *o)
-{
-       return (java_arrayheader *)
-               Java_java_lang_VMObject_clone(0, 0, (java_lang_Cloneable *) o);
-}
+/* builtin_clone_array *********************************************************
 
+   Wrapper function for cloning arrays.
 
-s4 builtin_dummy(void)
+*******************************************************************************/
+
+java_arrayheader *builtin_clone_array(void *env, java_arrayheader *o)
 {
-       log_text("Internal error: builtin_dummy called (native function is missing)");
-       assert(0);
+       java_arrayheader    *ah;
+       java_lang_Cloneable *c;
 
-       /* keep the compiler happy */
+       c = (java_lang_Object *) o;
 
-       return 0;
+       ah = (java_arrayheader *) Java_java_lang_VMObject_clone(0, 0, c);
+
+       return ah;
 }