Merged everything with MIPS version
authorstefan <none@none>
Wed, 5 Feb 2003 14:09:38 +0000 (14:09 +0000)
committerstefan <none@none>
Wed, 5 Feb 2003 14:09:38 +0000 (14:09 +0000)
Works out of the box on Alpha and MIPS

23 files changed:
Makefile.am
acconfig.h
builtin.c
builtin.h
configure.in
i386/Makefile.am
loader.c
mips/Makefile.am
mips/asmpart.S
mips/ngen.c
mips/ngen.h
mips/threads.h
mm/heap2.c
nat/UnixFileSystem.c
nat/UnixFileSystem.h
native.c
src/mm/memory.h
src/native/native.c
src/vm/builtin.c
src/vm/builtin.h
src/vm/loader.c
tests/Makefile.am
toolbox/memory.h

index 3a022ff5e7882ca3eb5b0e721f1d43442258c1dc..e3d8dfd6ab886d057dfd6eac0c6c40bf7764efd8 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in
 
-# $Id: Makefile.am 218 2003-02-04 12:47:51Z stefan $
+# $Id: Makefile.am 221 2003-02-05 14:09:38Z stefan $
 
 @SET_MAKE@
 
@@ -122,8 +122,8 @@ nativetypes.hh @SYSDEP_DIR@/offsets.h nativetable.hh: cacaoh
                java.io.UnixFileSystem \
                java.lang.ClassLoader_NativeLibrary
 
-@SYSDEP_DIR@/asmpart.o: $(top_srcdir)/@SYSDEP_DIR@/asmpart.S @SYSDEP_DIR@/offsets.h
-       @CC@ $(INCLUDES) -c -g -o $@ $<
+@SYSDEP_DIR@/asmpart.o: $(top_srcdir)/@SYSDEP_DIR@/@ASMPART@ @SYSDEP_DIR@/offsets.h
+       @CC@ $(CFLAGS) $(INCLUDES) -c -g -o $@ $<
 
 checkjvm:
        $(MAKE) -C jvmtst $@
index 035aa0f0818a7f471aa8e91b96d0b10fa7128a06..eae526ab722637a62b58fd3b4360258640665779 100644 (file)
@@ -4,6 +4,8 @@
 /* Define if mman.h defines MAP_ANONYMOUS  */
 #undef HAVE_MAP_ANONYMOUS
 
+#undef TRACE_ARGS_NUM
+
 /* Define to include thread support */
 #undef USE_THREADS
 #undef EXTERNAL_OVERFLOW
@@ -17,5 +19,6 @@
 #undef SYSDEP_DIR
 
 #undef OLD_COMPILER
+#undef USE_CODEMMAP
 
 #undef USE_BOEHM
index c019acb0d8ac868d2157e944ba09d79e41b1f493..4da71058cc973a3bd57842d39c7c04c51fcf3614 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -845,7 +845,11 @@ java_objectheader *builtin_trace_exception (java_objectheader *exceptionptr,
 }
 
 
+#ifdef TRACE_ARGS_NUM
 void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5,
+#if TRACE_ARGS_NUM > 6
+               long a6, long a7,
+#endif
                                                methodinfo *method)
 {
        sprintf (logtext, "                                                                                             ");
@@ -856,6 +860,16 @@ void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5,
        utf_sprint (logtext+strlen(logtext), method->descriptor);
        sprintf (logtext+strlen(logtext), "(");
        switch (method->paramcount) {
+#if TRACE_ARGS_NUM > 6
+               case 8:
+                       sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx",
+                                                                                          a0,  a1,      a2,  a3,  a4,  a5, a6, a7);
+                       break;
+               case 7:
+                       sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, %lx",
+                                                                                          a0,  a1,      a2,  a3,  a4,  a5, a6);
+                       break;
+#endif
                case 6:
                        sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx",
                                                                                           a0,  a1,      a2,  a3,  a4,  a5);
@@ -883,6 +897,7 @@ void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5,
        dolog ();
        methodindent++;
 }
+#endif
 
 void builtin_displaymethodstart(methodinfo *method)
 {
@@ -896,7 +911,7 @@ void builtin_displaymethodstart(methodinfo *method)
        methodindent++;
 }
 
-void builtin_displaymethodstop(methodinfo *method, long l, double d)
+void builtin_displaymethodstop(methodinfo *method, long l, double d, float f)
 {
        methodindent--;
        sprintf (logtext, "                                                                                             ");
@@ -912,6 +927,8 @@ void builtin_displaymethodstop(methodinfo *method, long l, double d)
                        sprintf (logtext+strlen(logtext), "->%ld", l);
                        break;
                case TYPE_FLOAT:
+                       sprintf (logtext+strlen(logtext), "->%g", f);
+                       break;
                case TYPE_DOUBLE:
                        sprintf (logtext+strlen(logtext), "->%g", d);
                        break;
index e760e21c772aca42089a8d0a1e640bb8a0617229..a2be02ca28d5560114166c4a9ae8becda5868ef9 100644 (file)
--- a/builtin.h
+++ b/builtin.h
@@ -62,9 +62,15 @@ s4 builtin_canstore (java_objectarray *a, java_objectheader *o);
 s4 builtin_aastore (java_objectarray *a, s4 index, java_objectheader *o);
 void asm_builtin_aastore (java_objectarray *a, s4 index, java_objectheader *o);
 
+#ifdef TRACE_ARGS_NUM
+#if TRACE_ARGS_NUM == 6
 void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5, methodinfo *method);
+#else
+void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5, long a6, long a7, methodinfo *method);
+#endif
+#endif
 void builtin_displaymethodstart(methodinfo *method);
-void builtin_displaymethodstop(methodinfo *method, long l, double d);
+void builtin_displaymethodstop(methodinfo *method, long l, double d, float f);
 /* void builtin_displaymethodstop(methodinfo *method); */
 void builtin_displaymethodexception(methodinfo *method);
 
index 106cc2c25096c5e874008d60d00717e24ec8ac46..448536c3cac010afea6389265fb1d9cd3364eeb1 100644 (file)
@@ -11,6 +11,7 @@ AC_PREFIX_DEFAULT(/usr/local/cacao)
 
 dnl system type
 
+ASMPART="asmpart.S"
 case "$host_cpu" in
 alpha* )
        SYSDEP_DIR="alpha" 
@@ -18,14 +19,18 @@ alpha* )
        COMPILER_SOURCES="compiler.h compiler.c" 
        COMPILER_OBJECTS="compiler.o"
        AC_DEFINE(OLD_COMPILER)
+       AC_DEFINE(TRACE_ARGS_NUM, 6)
+       AC_DEFINE(USE_CODEMMAP)
        ;;
 
 mips* )
        SYSDEP_DIR="mips" 
+       ASMPART="asmpart.s"
         CFLAGS="-64 -g -DMAP_ANONYMOUS=0 -woff 1048,1110,1164,1515"
        LIBS="-lelfutil" 
        COMPILER_SOURCES=""
        COMPILER_OBJECTS=""
+       AC_DEFINE(TRACE_ARGS_NUM, 8)
        ;;
 
 i386* | i486* | i586* | i686* )
@@ -42,6 +47,7 @@ esac
 
 AC_SUBST(COMPILER_SOURCES)
 AC_SUBST(COMPILER_OBJECTS)
+AC_SUBST(ASMPART)
 
 AC_DEFINE_UNQUOTED(SYSDEP_DIR, "$SYSDEP_DIR")
 AC_SUBST(SYSDEP_DIR)
index 86caabb7c7780135aca7b2e9ba8a3d97e0c18ca3..7aa2a24e2679e77f48a3d5e1b84838172a697d5d 100644 (file)
@@ -1,3 +1,3 @@
-EXTRA_DIST = asmpart.c disass.c gen.c ngen.c \
+EXTRA_DIST = asmpart.S disass.c gen.c ngen.c \
             defines.h native-math.h ngen.h sigcontext.h \
             types.h threads.h 
index 8f7089b270972610797b8bdde680d0b53fc865b1..4c499b31654244840a1e785c0c42da1751c31466 100644 (file)
--- a/loader.c
+++ b/loader.c
@@ -146,13 +146,24 @@ static int classbuffer_size;        /* size of classfile-data                 */
 
 #define skip_nbytes(len) classbuf_pos+=len;
 
-#define suck_u1() (*++classbuf_pos)
+inline u1 suck_u1()
+{
+       return *++classbuf_pos;
+}
+inline u2 suck_u2()
+{
+       u1 a=suck_u1(), b=suck_u1();
+       return ((u2)a<<8)+(u2)b;
+}
+inline u4 suck_u4()
+{
+       u1 a=suck_u1(), b=suck_u1(), c=suck_u1(), d=suck_u1();
+       return ((u4)a<<24)+((u4)b<<16)+((u4)c<<8)+(u4)d;
+}
 #define suck_s8() (s8) suck_u8()
 #define suck_s2() (s2) suck_u2()
 #define suck_s4() (s4) suck_u4()
 #define suck_s1() (s1) suck_u1()
-#define suck_u2() (u2) ((suck_u1()<<8)+suck_u1())
-#define suck_u4() (u4) ((((u4)suck_u1())<<24)+(((u4)suck_u1())<<16)+(((u4)suck_u1())<<8)+((u4)suck_u1()))
 
 
 /* get u8 from classfile data */
index 841fb78e5cbb6959454105c6289e7c0234cc0011..19d89a8f6be889c3038c60b6f02baf71ecf41ebf 100644 (file)
@@ -1,2 +1,2 @@
-EXTRA_DIST = asmpart.S calling.doc defines.h disass.c \
+EXTRA_DIST = asmpart.S asmpart.s calling.doc defines.h disass.c \
             native-math.h ngen.c ngen.h threads.h types.h
index c1b06d14e3dde7380ce2d3685061019c09e86cdb..5fdf0dbb40f1a4bf1423acc16478654011ba6e04 100644 (file)
        .globl asm_perform_threadswitch
        .globl asm_initialize_thread_stack
        .globl asm_switchstackandcall
+       .globl asm_getcallingmethod
 
 
 /*************************** imported functions *******************************/
@@ -953,6 +954,7 @@ asm_switchstackandcall:
        move    sp,a0           /* switch to new stack                            */
        
        move    itmp3,a1
+       move    a0,a3
        jalr    itmp3           /* and call function                              */
 
        ld      ra,0(sp)        /* load return address                            */
@@ -961,3 +963,9 @@ asm_switchstackandcall:
        j       ra              /* return                                         */
 
        .end    asm_switchstackandcall
+
+       .ent    asm_getcallingmethod
+asm_getcallingmethod:
+       li      v0,0
+       j       ra
+       .end    asm_getcallingmethod
index 95aea0203c0869d0e9e466eac9b6ff9d13be34d4..53d59083b7c2548baafde973dc7310d923d49da0 100644 (file)
 
        Authors: Andreas  Krall      EMAIL: cacao@complang.tuwien.ac.at
 
-       Last Change: $Id: ngen.c 199 2003-01-21 12:32:18Z stefan $
+       Last Change: $Id: ngen.c 221 2003-02-05 14:09:38Z stefan $
 
 *******************************************************************************/
 
 #include "jitdef.h"   /* phil */
 
+#include <errno.h>
+#include <unistd.h>
+
 /* *****************************************************************************
 
 Datatypes and Register Allocations:
@@ -87,8 +90,58 @@ in the documention file: calling.doc
     if a and b are the same float-register, no code will be generated
 */ 
 
-#define M_FLTMOVE(a,b) if(a!=b){M_DMOV(a,b);}
+#define M_FLTMOVE(a,b) {if(a!=b){M_DMOV(a,b);}}
+
+#define M_TFLTMOVE(t,a,b) \
+       {if(a!=b) \
+               if ((t)==TYPE_DBL) \
+                   {M_DMOV(a,b);} \
+               else {M_FMOV(a,b);} \
+       }
 
+#define M_TFLD(t,a,b,disp) \
+    if ((t)==TYPE_DBL) \
+         {M_DLD(a,b,disp);} \
+    else \
+         {M_FLD(a,b,disp);}
+
+#define M_TFST(t,a,b,disp) \
+    if ((t)==TYPE_DBL) \
+         {M_DST(a,b,disp);} \
+    else \
+         {M_FST(a,b,disp);}
+
+#define M_CCFLTMOVE(t1,t2,a,b) \
+       if ((t1)==(t2)) \
+         {M_TFLTMOVE(t1,a,b);} \
+       else \
+         if ((t1)==TYPE_DBL) \
+               {M_CVTDF(a,b);} \
+         else \
+               {M_CVTFD(a,b);}
+
+#define M_CCFLD(t1,t2,a,b,disp) \
+    if ((t1)==(t2)) \
+         {M_DLD(a,b,disp);} \
+       else { \
+         M_DLD(REG_FTMP1,b,disp); \
+         if ((t1)==TYPE_DBL) \
+           {M_CVTDF(REG_FTMP1,a);} \
+         else \
+           {M_CVTFD(REG_FTMP1,a);} \
+       }
+         
+#define M_CCFST(t1,t2,a,b,disp) \
+    if ((t1)==(t2)) \
+         {M_DST(a,b,disp);} \
+       else { \
+         if ((t1)==TYPE_DBL) \
+           {M_CVTDF(a,REG_FTMP1);} \
+         else \
+           {M_CVTFD(a,REG_FTMP1);} \
+         M_DST(REG_FTMP1,b,disp); \
+       }
+         
 
 /* var_to_reg_xxx:
     this function generates code to fetch data from a pseudo-register
@@ -196,6 +249,8 @@ static int reg_of_var(stackptr v, int tempregnum)
        }
 
 
+void docacheflush(u1 *p, long bytelen, int dummy);
+
 /* NullPointerException handlers and exception handling initialisation        */
 
 /* NullPointerException signal handler for hardware null pointer check */
@@ -424,7 +479,7 @@ static void gen_mcode()
           to arguments on stack. ToDo: save floating point registers !!!!!!!!!
        */
 
-       if (runverbose && isleafmethod) {
+       if (runverbose) {
                M_LDA (REG_SP, REG_SP, -(18*8));
 
                M_LST(REG_RA,        REG_SP,  1*8);
@@ -509,15 +564,15 @@ static void gen_mcode()
                else {                                       /* floating args         */   
                        if (p < FLT_ARG_CNT) {                   /* register arguments    */
                                if (!(var->flags & INMEMORY))        /* reg arg -> register   */
-                                       {M_FLTMOVE (argfltregs[p], r);}
+                                       {M_TFLTMOVE (var->type, argfltregs[p], r);}
                                else                                             /* reg arg -> spilled    */
                                        M_DST (argfltregs[p], REG_SP, 8 * r);
                                }
                        else {                                   /* stack arguments       */
                                pa = p - FLT_ARG_CNT;
-                               if (!(var->flags & INMEMORY))        /* stack-arg -> register */
+                               if (!(var->flags & INMEMORY)) {      /* stack-arg -> register */
                                        M_DLD (r, REG_SP, 8 * (parentargs_base + pa) );
-                               else {                               /* stack-arg -> spilled  */
+                               } else {                             /* stack-arg -> spilled  */
                                        M_DLD (REG_FTMP1, REG_SP, 8 * (parentargs_base + pa));
                                        M_DST (REG_FTMP1, REG_SP, 8 * r);
                                        }
@@ -592,7 +647,7 @@ static void gen_mcode()
                                        if (IS_FLT_DBL_TYPE(s2)) {
                                                if (!(interfaces[len][s2].flags & INMEMORY)) {
                                                        s1 = interfaces[len][s2].regoff;
-                                                       M_FLTMOVE(s1,d);
+                                                       M_TFLTMOVE(s2,s1,d);
                                                        }
                                                else {
                                                        M_DLD(d, REG_SP, 8 * interfaces[len][s2].regoff);
@@ -721,10 +776,13 @@ static void gen_mcode()
                            (iptr->dst->varnum == iptr->op1))
                                break;
                        var = &(locals[iptr->op1][iptr->opc - ICMD_ILOAD]);
-                       if (var->flags & INMEMORY)
-                               M_DLD(d, REG_SP, 8 * var->regoff);
-                       else
-                               {M_FLTMOVE(var->regoff,d);}
+                       {
+                               int t2 = ((iptr->opc == ICMD_FLOAD) ? TYPE_FLT : TYPE_DBL);
+                               if (var->flags & INMEMORY)
+                                       {M_CCFLD(var->type,t2,d, REG_SP, 8 * var->regoff);}
+                               else
+                                       {M_CCFLTMOVE(var->type,t2,var->regoff,d);}
+                       }
                        store_reg_to_var_flt(iptr->dst, d);
                        break;
 
@@ -754,14 +812,17 @@ static void gen_mcode()
                            (src->varnum == iptr->op1))
                                break;
                        var = &(locals[iptr->op1][iptr->opc - ICMD_ISTORE]);
-                       if (var->flags & INMEMORY) {
-                               var_to_reg_flt(s1, src, REG_FTMP1);
-                               M_DST(s1, REG_SP, 8 * var->regoff);
-                               }
-                       else {
-                               var_to_reg_flt(s1, src, var->regoff);
-                               M_FLTMOVE(s1, var->regoff);
-                               }
+                       {
+                               int t1 = ((iptr->opc == ICMD_FSTORE) ? TYPE_FLT : TYPE_DBL);
+                               if (var->flags & INMEMORY) {
+                                       var_to_reg_flt(s1, src, REG_FTMP1);
+                                       M_CCFST(t1,var->type,s1, REG_SP, 8 * var->regoff);
+                                       }
+                               else {
+                                       var_to_reg_flt(s1, src, var->regoff);
+                                       M_CCFLTMOVE(t1,var->type,s1, var->regoff);
+                                       }
+                       }
                        break;
 
 
@@ -779,7 +840,7 @@ static void gen_mcode()
                            ((from->flags ^ to->flags) & INMEMORY)) { \
                                if (IS_FLT_DBL_TYPE(from->type)) { \
                                        var_to_reg_flt(s1, from, d); \
-                                       M_FLTMOVE(s1,d); \
+                                       M_TFLTMOVE(from->type,s1,d); \
                                        store_reg_to_var_flt(to, d); \
                                        }\
                                else { \
@@ -1598,6 +1659,7 @@ static void gen_mcode()
                        break;
                
                case ICMD_FREM:       /* ..., val1, val2  ==> ..., val1 % val2        */
+                       panic("FREM");
 
                        var_to_reg_flt(s1, src->prev, REG_FTMP1);
                        var_to_reg_flt(s2, src, REG_FTMP2);
@@ -1645,8 +1707,9 @@ static void gen_mcode()
 
                        var_to_reg_flt(s1, src, REG_FTMP1);
                        d = reg_of_var(iptr->dst, REG_ITMP3);
-                       M_CVTFI(s1, REG_FTMP1);
+                       M_TRUNCFI(s1, REG_FTMP1);
                        M_MOVDI(REG_FTMP1, d);
+                       M_NOP;
                        store_reg_to_var_int(iptr->dst, d);
                        break;
                
@@ -1654,8 +1717,9 @@ static void gen_mcode()
 
                        var_to_reg_flt(s1, src, REG_FTMP1);
                        d = reg_of_var(iptr->dst, REG_ITMP3);
-                       M_CVTDI(s1, REG_FTMP1);
+                       M_TRUNCDI(s1, REG_FTMP1);
                        M_MOVDI(REG_FTMP1, d);
+                       M_NOP;
                        store_reg_to_var_int(iptr->dst, d);
                        break;
                
@@ -1663,8 +1727,9 @@ static void gen_mcode()
 
                        var_to_reg_flt(s1, src, REG_FTMP1);
                        d = reg_of_var(iptr->dst, REG_ITMP3);
-                       M_CVTFL(s1, REG_FTMP1);
+                       M_TRUNCFL(s1, REG_FTMP1);
                        M_MOVDL(REG_FTMP1, d);
+                       M_NOP;
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
@@ -1672,8 +1737,9 @@ static void gen_mcode()
 
                        var_to_reg_flt(s1, src, REG_FTMP1);
                        d = reg_of_var(iptr->dst, REG_ITMP3);
-                       M_CVTDL(s1, REG_FTMP1);
+                       M_TRUNCDL(s1, REG_FTMP1);
                        M_MOVDL(REG_FTMP1, d);
+                       M_NOP;
                        store_reg_to_var_int(iptr->dst, d);
                        break;
 
@@ -2758,7 +2824,10 @@ static void gen_mcode()
                                }                       
 #endif
                        var_to_reg_flt(s1, src, REG_FRESULT);
-                       M_FLTMOVE(s1, REG_FRESULT);
+                       {
+                               int t = ((iptr->opc == ICMD_FRETURN) ? TYPE_FLT : TYPE_DBL);
+                               M_TFLTMOVE(t, s1, REG_FRESULT);
+                       }
                        goto nowperformreturn;
 
                case ICMD_RETURN:      /* ...  ==> ...                                */
@@ -2804,6 +2873,7 @@ nowperformreturn:
                                M_ALD(argintregs[0], REG_PV, a);
                                M_MOV(REG_RESULT, argintregs[1]);
                                M_FLTMOVE(REG_FRESULT, argfltregs[2]);
+                               M_FMOV(REG_FRESULT, argfltregs[3]);
                                a = dseg_addaddress ((void*) (builtin_displaymethodstop));
                                M_ALD(REG_ITMP3, REG_PV, a);
                                M_JSR (REG_RA, REG_ITMP3);
@@ -2967,7 +3037,7 @@ gen_method: {
                                        if (s3 < FLT_ARG_CNT) {
                                                s1 = argfltregs[s3];
                                                var_to_reg_flt(d, src, s1);
-                                               M_FLTMOVE(d, s1);
+                                               M_TFLTMOVE(src->type,d, s1);
                                                }
                                        else {
                                                var_to_reg_flt(d, src, REG_FTMP1);
@@ -3043,8 +3113,8 @@ afteractualcall:
                                        s4 ml=-s1, mh=0;
                                        while (ml<-32768) { ml+=65536; mh--; }
                                        M_LUI(REG_PV, mh);
-                                       M_IADD_IMM(REG_PV, ml, REG_RA);
-       /*                              panic("method to big"); */
+                                       M_IADD_IMM(REG_PV, ml, REG_PV);
+                                       M_LADD(REG_PV, REG_RA, REG_PV);
                                }
 
                        /* d contains return type */
@@ -3057,7 +3127,7 @@ afteractualcall:
                                        }
                                else {
                                        s1 = reg_of_var(iptr->dst, REG_FRESULT);
-                                       M_FLTMOVE(REG_FRESULT, s1);
+                                       M_TFLTMOVE(iptr->dst->type, REG_FRESULT, s1);
                                        store_reg_to_var_flt(iptr->dst, s1);
                                        }
                                }
@@ -3292,7 +3362,7 @@ TODO (old alpha code - commented out)
                        if (IS_FLT_DBL_TYPE(s2)) {
                                var_to_reg_flt(s1, src, REG_FTMP1);
                                if (!(interfaces[len][s2].flags & INMEMORY)) {
-                                       M_FLTMOVE(s1,interfaces[len][s2].regoff);
+                                       M_TFLTMOVE(s2,s1,interfaces[len][s2].regoff);
                                        }
                                else {
                                        M_DST(s1, REG_SP, 8 * interfaces[len][s2].regoff);
@@ -3465,8 +3535,8 @@ TODO (old alpha code - commented out)
 
        mcode_finish((int)((u1*) mcodeptr - mcodebase));
 
-       (void) cacheflush((void*) method->entrypoint,
-                         (int)((u1*) mcodeptr - mcodebase), ICACHE);
+       docacheflush((void*) method->entrypoint,
+                         ((u1*) mcodeptr - mcodebase), ICACHE);
 }
 
 
@@ -3517,11 +3587,11 @@ u1 *createcompilerstub (methodinfo *m)
                                               in itmp1 is used as method pointer */
        M_NOP;
 
-       (void) cacheflush((void*) s, (char*) p - (char*) s, ICACHE);
-
        s[2] = (u8) m;                      /* literals to be adressed            */  
        s[3] = (u8) asm_call_jit_compiler;  /* jump directly via PV from above    */
 
+       (void) docacheflush((void*) s, (char*) p - (char*) s, ICACHE);
+
 #ifdef STATISTICS
        count_cstub_len += COMPSTUBSIZE * 8;
 #endif
@@ -3598,13 +3668,13 @@ u1 *createnativestub (functionptr f, methodinfo *m)
        M_LDA  (REG_ITMP2, REG_RA, -4);     /* move fault address into reg. itmp2 */
                                            /* delay slot                         */
 
-       (void) cacheflush((void*) s, (char*) p - (char*) s, ICACHE);
-
        s[14] = (u8) f;                     /* address of native method           */
        s[15] = (u8) (&exceptionptr);       /* address of exceptionptr            */
        s[16]= (u8) (asm_handle_nat_exception); /* addr of asm exception handler  */
        s[17] = (u8) (&env);                  /* addr of jni_environement         */
 
+       (void) docacheflush((void*) s, (char*) p - (char*) s, ICACHE);
+
 #ifdef STATISTICS
        count_nstub_len += NATIVESTUBSIZE * 8;
 #endif
@@ -3769,6 +3839,15 @@ void ngen_init()
        createcalljava();
 }
 
+void docacheflush(u1 *p, long bytelen, int dummy)
+{
+       u1 *e = p + bytelen;
+       long psize = sysconf(_SC_PAGESIZE);
+       p -= (long) p & (psize-1);
+       e += psize - ((((long) e - 1) & (psize-1)) + 1);
+       bytelen = e-p;
+       mprotect(p, bytelen, PROT_READ|PROT_WRITE|PROT_EXEC);
+}
 
 /*
  * These are local overrides for various environment variables in Emacs.
index 7d7732e592345372a8fbf4bf0bc145a477446977..0f629e9ee2fe9fd730f35c8f4c48e00d1a0312f0 100644 (file)
@@ -14,6 +14,7 @@
 *******************************************************************************/
 
 #include <sys/cachectl.h>
+#include <sys/mman.h>
 
 /* see also file calling.doc for explanation of calling conventions           */
 
index 1eaff9b8b4eb7d59b1c88508e017c748d6936d8c..7ca22eb3557ae26d4dd8fb72f26704982d1671b0 100644 (file)
@@ -26,7 +26,7 @@
 
 void asm_perform_threadswitch (u1 **from, u1 **to, u1 **stackTop);
 u1*  asm_initialize_thread_stack (void *func, u1 *stack);
-void asm_switchstackandcall (void *stack, void *func, void **stacktopsave);
+void asm_switchstackandcall (void *stack, void *func, void **stacktopsave, void *p);
 
 /* access macros */
 
index b4b8ea3bb3807cd51019b7c82ae52d739cfba286..7299fcb6cc161710bc7ee05e794031b78d3c6bb3 100644 (file)
@@ -152,7 +152,7 @@ heap_init (SIZE size,
        heap_size = align_size(size + ((1 << ALIGN) - 1));
 
 #if !(defined(HAVE_MAP_ANONYMOUS))
-       heap_base = malloc(heap_size);
+       heap_base = (void*)(((u8)malloc(heap_size+1023)+1023) & ~1023);
 #else
        heap_base = (void*) mmap ((void*) 0x10000000, 
                                                          ((size_t)heap_size + PAGESIZE_MINUS_ONE) & ~PAGESIZE_MINUS_ONE,
@@ -967,8 +967,8 @@ gc_call (void)
 
        if (collectverbose) {
                sprintf(logtext, "Garbage Collection:  previous/now = %d / %d ",
-                       (int) (heap_top - heap_base), 
-                       (int) (heap_top - heap_base));
+                       (int) ((u1*) heap_top - (u1*) heap_base), 
+                       (int) ((u1*) heap_top - (u1*) heap_base));
                dolog ();
                }
 }
index f23cab9d21c6aa39bdeacfebff1068f5715d82c4..f4a501de142babf31e61d0a9c9822cc9ba4caad3 100644 (file)
@@ -271,9 +271,12 @@ JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_rename (JNIEnv *env ,  struct j
  */
 JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_setLastModifiedTime (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* file, s8 time)
 {
-        log_text("Java_java_io_FileSystemImpl_setLastModifiedTime called");
+       struct utimbuf ub;
+       log_text("Java_java_io_FileSystemImpl_setLastModifiedTime called");
 
-       if (!utime(javastring_tochar( (java_objectheader*) (file->path)), time / 1000))
+       ub.actime = time/1000;
+       ub.modtime = time/1000;
+       if (!utime(javastring_tochar( (java_objectheader*) (file->path)), &ub))
            return 1;
        else
            return 0;
index e517664fc844c0c482879c6b5ba41fd537bd98e6..96950ba1cbdf05c350bd390efe3a2cb046cb4122 100644 (file)
@@ -8,24 +8,12 @@ typedef struct java_io_UnixFileSystem {
    s4 colon;
 } java_io_UnixFileSystem;
 
-/*
- * Class:     java/io/UnixFileSystem
- * Method:    isAbsolute
- * Signature: (Ljava/io/File;)Z
- */
-JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_isAbsolute (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
 /*
  * Class:     java/io/UnixFileSystem
  * Method:    canonicalize
  * Signature: (Ljava/lang/String;)Ljava/lang/String;
  */
 JNIEXPORT struct java_lang_String* JNICALL Java_java_io_UnixFileSystem_canonicalize (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_lang_String* par1);
-/*
- * Class:     java/io/UnixFileSystem
- * Method:    getBooleanAttributes0
- * Signature: (Ljava/io/File;)I
- */
-JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_getBooleanAttributes0 (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
 /*
  * Class:     java/io/UnixFileSystem
  * Method:    checkAccess
@@ -34,16 +22,10 @@ JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_getBooleanAttributes0 (JNIEnv *
 JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_checkAccess (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1, s4 par2);
 /*
  * Class:     java/io/UnixFileSystem
- * Method:    getLastModifiedTime
- * Signature: (Ljava/io/File;)J
- */
-JNIEXPORT s8 JNICALL Java_java_io_UnixFileSystem_getLastModifiedTime (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
-/*
- * Class:     java/io/UnixFileSystem
- * Method:    getLength
- * Signature: (Ljava/io/File;)J
+ * Method:    createDirectory
+ * Signature: (Ljava/io/File;)Z
  */
-JNIEXPORT s8 JNICALL Java_java_io_UnixFileSystem_getLength (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
+JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_createDirectory (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
 /*
  * Class:     java/io/UnixFileSystem
  * Method:    createFileExclusively
@@ -64,16 +46,34 @@ JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_delete (JNIEnv *env ,  struct j
 JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_deleteOnExit (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
 /*
  * Class:     java/io/UnixFileSystem
- * Method:    list
- * Signature: (Ljava/io/File;)[Ljava/lang/String;
+ * Method:    getBooleanAttributes0
+ * Signature: (Ljava/io/File;)I
  */
-JNIEXPORT java_objectarray* JNICALL Java_java_io_UnixFileSystem_list (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
+JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_getBooleanAttributes0 (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
 /*
  * Class:     java/io/UnixFileSystem
- * Method:    createDirectory
- * Signature: (Ljava/io/File;)Z
+ * Method:    getLastModifiedTime
+ * Signature: (Ljava/io/File;)J
  */
-JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_createDirectory (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
+JNIEXPORT s8 JNICALL Java_java_io_UnixFileSystem_getLastModifiedTime (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
+/*
+ * Class:     java/io/UnixFileSystem
+ * Method:    getLength
+ * Signature: (Ljava/io/File;)J
+ */
+JNIEXPORT s8 JNICALL Java_java_io_UnixFileSystem_getLength (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
+/*
+ * Class:     java/io/UnixFileSystem
+ * Method:    initIDs
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_java_io_UnixFileSystem_initIDs (JNIEnv *env );
+/*
+ * Class:     java/io/UnixFileSystem
+ * Method:    list
+ * Signature: (Ljava/io/File;)[Ljava/lang/String;
+ */
+JNIEXPORT java_objectarray* JNICALL Java_java_io_UnixFileSystem_list (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
 /*
  * Class:     java/io/UnixFileSystem
  * Method:    rename
@@ -92,9 +92,3 @@ JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_setLastModifiedTime (JNIEnv *en
  * Signature: (Ljava/io/File;)Z
  */
 JNIEXPORT s4 JNICALL Java_java_io_UnixFileSystem_setReadOnly (JNIEnv *env ,  struct java_io_UnixFileSystem* this , struct java_io_File* par1);
-/*
- * Class:     java/io/UnixFileSystem
- * Method:    initIDs
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_java_io_UnixFileSystem_initIDs (JNIEnv *env );
index 61481bb9979a5d70779a278805bddf9bfaa8c1bc..cbbf5e02c36921a5ec4b84bd333d6ea41b5a1178 100644 (file)
--- a/native.c
+++ b/native.c
@@ -29,6 +29,7 @@
 #include <string.h>
 #include <assert.h>
 #include <sys/time.h>
+#include <utime.h>
 
 #include "threads/thread.h"                       /* schani */
 #include "threads/locks.h"
index 48e4ccc0945af68e1e587f2504db0542678ee0e4..7029f4b48f0b9db58b45e1d695f33afd79b3dbeb 100644 (file)
@@ -12,8 +12,6 @@
 
 *******************************************************************************/
 
-#define CODEMMAP
-
 #include "types.h"
 
 #ifdef USE_BOEHM
@@ -45,7 +43,7 @@ void *heap_alloc_uncollectable(u4 bytelen);
 
 #define MCOPY(dest,src,type,num)  memcpy (dest,src, sizeof(type)* (num) )
 
-#ifdef CODEMMAP
+#ifdef USE_CODEMMAP
 #define CNEW(type,num)        ((type*) mem_mmap ( sizeof(type) * (num) ))
 #define CFREE(ptr,num)
 #else
index 61481bb9979a5d70779a278805bddf9bfaa8c1bc..cbbf5e02c36921a5ec4b84bd333d6ea41b5a1178 100644 (file)
@@ -29,6 +29,7 @@
 #include <string.h>
 #include <assert.h>
 #include <sys/time.h>
+#include <utime.h>
 
 #include "threads/thread.h"                       /* schani */
 #include "threads/locks.h"
index c019acb0d8ac868d2157e944ba09d79e41b1f493..4da71058cc973a3bd57842d39c7c04c51fcf3614 100644 (file)
@@ -845,7 +845,11 @@ java_objectheader *builtin_trace_exception (java_objectheader *exceptionptr,
 }
 
 
+#ifdef TRACE_ARGS_NUM
 void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5,
+#if TRACE_ARGS_NUM > 6
+               long a6, long a7,
+#endif
                                                methodinfo *method)
 {
        sprintf (logtext, "                                                                                             ");
@@ -856,6 +860,16 @@ void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5,
        utf_sprint (logtext+strlen(logtext), method->descriptor);
        sprintf (logtext+strlen(logtext), "(");
        switch (method->paramcount) {
+#if TRACE_ARGS_NUM > 6
+               case 8:
+                       sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx",
+                                                                                          a0,  a1,      a2,  a3,  a4,  a5, a6, a7);
+                       break;
+               case 7:
+                       sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx, %lx",
+                                                                                          a0,  a1,      a2,  a3,  a4,  a5, a6);
+                       break;
+#endif
                case 6:
                        sprintf(logtext+strlen(logtext), "%lx, %lx, %lx, %lx, %lx, %lx",
                                                                                           a0,  a1,      a2,  a3,  a4,  a5);
@@ -883,6 +897,7 @@ void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5,
        dolog ();
        methodindent++;
 }
+#endif
 
 void builtin_displaymethodstart(methodinfo *method)
 {
@@ -896,7 +911,7 @@ void builtin_displaymethodstart(methodinfo *method)
        methodindent++;
 }
 
-void builtin_displaymethodstop(methodinfo *method, long l, double d)
+void builtin_displaymethodstop(methodinfo *method, long l, double d, float f)
 {
        methodindent--;
        sprintf (logtext, "                                                                                             ");
@@ -912,6 +927,8 @@ void builtin_displaymethodstop(methodinfo *method, long l, double d)
                        sprintf (logtext+strlen(logtext), "->%ld", l);
                        break;
                case TYPE_FLOAT:
+                       sprintf (logtext+strlen(logtext), "->%g", f);
+                       break;
                case TYPE_DOUBLE:
                        sprintf (logtext+strlen(logtext), "->%g", d);
                        break;
index e760e21c772aca42089a8d0a1e640bb8a0617229..a2be02ca28d5560114166c4a9ae8becda5868ef9 100644 (file)
@@ -62,9 +62,15 @@ s4 builtin_canstore (java_objectarray *a, java_objectheader *o);
 s4 builtin_aastore (java_objectarray *a, s4 index, java_objectheader *o);
 void asm_builtin_aastore (java_objectarray *a, s4 index, java_objectheader *o);
 
+#ifdef TRACE_ARGS_NUM
+#if TRACE_ARGS_NUM == 6
 void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5, methodinfo *method);
+#else
+void builtin_trace_args(long a0, long a1, long a2, long a3, long a4, long a5, long a6, long a7, methodinfo *method);
+#endif
+#endif
 void builtin_displaymethodstart(methodinfo *method);
-void builtin_displaymethodstop(methodinfo *method, long l, double d);
+void builtin_displaymethodstop(methodinfo *method, long l, double d, float f);
 /* void builtin_displaymethodstop(methodinfo *method); */
 void builtin_displaymethodexception(methodinfo *method);
 
index 8f7089b270972610797b8bdde680d0b53fc865b1..4c499b31654244840a1e785c0c42da1751c31466 100644 (file)
@@ -146,13 +146,24 @@ static int classbuffer_size;        /* size of classfile-data                 */
 
 #define skip_nbytes(len) classbuf_pos+=len;
 
-#define suck_u1() (*++classbuf_pos)
+inline u1 suck_u1()
+{
+       return *++classbuf_pos;
+}
+inline u2 suck_u2()
+{
+       u1 a=suck_u1(), b=suck_u1();
+       return ((u2)a<<8)+(u2)b;
+}
+inline u4 suck_u4()
+{
+       u1 a=suck_u1(), b=suck_u1(), c=suck_u1(), d=suck_u1();
+       return ((u4)a<<24)+((u4)b<<16)+((u4)c<<8)+(u4)d;
+}
 #define suck_s8() (s8) suck_u8()
 #define suck_s2() (s2) suck_u2()
 #define suck_s4() (s4) suck_u4()
 #define suck_s1() (s1) suck_u1()
-#define suck_u2() (u2) ((suck_u1()<<8)+suck_u1())
-#define suck_u4() (u4) ((((u4)suck_u1())<<24)+(((u4)suck_u1())<<16)+(((u4)suck_u1())<<8)+((u4)suck_u1()))
 
 
 /* get u8 from classfile data */
index 7b2493ade641b90df98eda1b85738e03cb6207cf..c0e48a49f3dc3dbe1365e6fcad06fca9c7dbbde6 100644 (file)
@@ -1,4 +1,4 @@
-EXTRA_DIST = x.java x.output jctest.java jctest.output fptest.java GCBench.java
+EXTRA_DIST = x.java x.output jctest.java fptest.java
 
 check_DATA = checkall
 
index 48e4ccc0945af68e1e587f2504db0542678ee0e4..7029f4b48f0b9db58b45e1d695f33afd79b3dbeb 100644 (file)
@@ -12,8 +12,6 @@
 
 *******************************************************************************/
 
-#define CODEMMAP
-
 #include "types.h"
 
 #ifdef USE_BOEHM
@@ -45,7 +43,7 @@ void *heap_alloc_uncollectable(u4 bytelen);
 
 #define MCOPY(dest,src,type,num)  memcpy (dest,src, sizeof(type)* (num) )
 
-#ifdef CODEMMAP
+#ifdef USE_CODEMMAP
 #define CNEW(type,num)        ((type*) mem_mmap ( sizeof(type) * (num) ))
 #define CFREE(ptr,num)
 #else