* builtin_multianewarray: Handle MIPS32 correctly (s4 in an s8 slot)
[cacao.git] / src / vm / builtin.c
index b63a72ba51c5f77a843fff3c1c962d0dcb1cf03d..f0376467d0734df6a2626d73760de3f557b65038 100644 (file)
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 2874 2005-06-29 14:57:36Z twisti $
+   $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;
@@ -1268,6 +1244,11 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
 
        strcat(logtext, "(");
 
+       /* xxxprintf ?Bug? an PowerPc Linux (rlwinm.inso)                */
+       /* Only Arguments in integer Registers are passed correctly here */
+       /* long longs spilled on Stack have an wrong offset of +4        */
+       /* So preliminary Bugfix: Only pass 3 params at once to sprintf  */
+       /* for SIZEOG_VOID_P == 4 && TRACE_ARGS_NUM == 8                 */
        switch (md->paramcount) {
        case 0:
                break;
@@ -1285,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",
@@ -1292,54 +1274,68 @@ void builtin_trace_args(s8 a0, s8 a1, s8 a2, s8 a3,
                break;
 
        case 4:
-               sprintf(logtext + strlen(logtext),
-                               "0x%llx, 0x%llx, 0x%llx, 0x%llx",
-                               a0, a1, a2, a3);
+               sprintf(logtext + strlen(logtext), "0x%llx, 0x%llx, 0x%llx"
+                               , a0, a1, a2);
+               sprintf(logtext + strlen(logtext), ", 0x%llx", a3);
+
                break;
+#endif /* TRACE_ARGS_NUM >= 4 */
 
 #if TRACE_ARGS_NUM >= 6
        case 5:
-               sprintf(logtext + strlen(logtext),
-                               "0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx",
-                               a0, a1, a2, a3, a4);
+               sprintf(logtext + strlen(logtext), "0x%llx, 0x%llx, 0x%llx"
+                               , a0, a1, a2);
+               sprintf(logtext + strlen(logtext), ", 0x%llx, 0x%llx", a3, a4);
                break;
 
+
        case 6:
-               sprintf(logtext + strlen(logtext),
-                               "0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx",
-                               a0, a1, a2, a3, a4, a5);
+               sprintf(logtext + strlen(logtext), "0x%llx, 0x%llx, 0x%llx"
+                               , a0, a1, a2);
+               sprintf(logtext + strlen(logtext), ", 0x%llx, 0x%llx, 0x%llx"
+                               , a3, a4, a5);
                break;
 #endif /* TRACE_ARGS_NUM >= 6 */
 
 #if TRACE_ARGS_NUM == 8
        case 7:
-               sprintf(logtext + strlen(logtext),
-                               "0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx",
-                               a0, a1, a2, a3, a4, a5, a6);
+               sprintf(logtext + strlen(logtext), "0x%llx, 0x%llx, 0x%llx"
+                               , a0, a1, a2);
+               sprintf(logtext + strlen(logtext), ", 0x%llx, 0x%llx, 0x%llx"
+                               , a3, a4, a5);
+               sprintf(logtext + strlen(logtext), ", 0x%llx", a6);
                break;
 
        case 8:
-               sprintf(logtext + strlen(logtext),
-                               "0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx",
-                               a0, a1, a2, a3, a4, a5, a6, a7);
+               sprintf(logtext + strlen(logtext), "0x%llx, 0x%llx, 0x%llx"
+                               , a0, a1, a2);
+               sprintf(logtext + strlen(logtext), ", 0x%llx, 0x%llx, 0x%llx"
+                               , a3, a4, a5);
+               sprintf(logtext + strlen(logtext), ", 0x%llx, 0x%llx", a6, a7);
                break;
 #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, 0x%llx, 0x%llx, 0x%llx, 0x%llx, 0x%llx, ...(%d)",
-                               a0, a1, a2, a3, a4, a5, a6, a7, m->paramcount - 8);
+               sprintf(logtext + strlen(logtext),"0x%llx, 0x%llx, 0x%llx,"
+                               , a0, a1, a2);
+               sprintf(logtext + strlen(logtext)," 0x%llx, 0x%llx, 0x%llx,"
+                               , a3, a4, a5);
+               sprintf(logtext + strlen(logtext)," 0x%llx, 0x%llx, ...(%d)"
+                               , a6, a7, md->paramcount - 8);
 #endif
                break;
 
@@ -1400,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 */
@@ -1700,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) 
@@ -2221,8 +2264,11 @@ double builtin_l2d(s8 a)
 
 s4 builtin_f2i(float a) 
 {
+       s4 i;
+
+       i = builtin_d2i((double) a);
 
-       return builtin_d2i((double) a);
+       return i;
 
        /*      float f;
        
@@ -2244,8 +2290,11 @@ s4 builtin_f2i(float a)
 
 s8 builtin_f2l(float a)
 {
+       s8 l;
 
-       return builtin_d2l((double) a);
+       l = builtin_d2l((double) a);
+
+       return l;
 
        /*      float f;
        
@@ -2352,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;
 }