* src/vm/jit/exceptiontable.c: New file.
[cacao.git] / src / vm / jit / sparc64 / codegen.c
index bee77ffc880e6fe72638e3f382ef868389e04d0f..8411ff30aa2006ff51bcb70b9dbb54b55a6868de 100644 (file)
@@ -22,8 +22,6 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 4644 2006-03-16 18:44:46Z edwin $
-
 */
 
 
@@ -132,7 +130,6 @@ bool codegen_emit(jitdata *jd)
        varinfo            *var;
        basicblock         *bptr;
        instruction        *iptr;
-       exception_entry    *ex;
        u2                  currentline;
        constant_classref  *cr;
        methodinfo         *lm;             /* local methodinfo for ICMD_INVOKE*  */
@@ -164,7 +161,7 @@ bool codegen_emit(jitdata *jd)
        s4 framesize_disp;
 
 #if 0 /* no leaf optimization yet */
-       savedregs_num = (jd->isleafmethod) ? 0 : 1;       /* space to save the RA */
+       savedregs_num = (code_is_leafmethod(code)) ? 0 : 1;       /* space to save the RA */
 #endif
        savedregs_num = WINSAVE_CNT + ABIPARAMS_CNT; /* register-window save area */ 
 
@@ -177,7 +174,7 @@ bool codegen_emit(jitdata *jd)
        cd->stackframesize = rd->memuse + savedregs_num;
 
 #if defined(ENABLE_THREADS)        /* space to save argument of monitor_enter */
-       if (checksync && (m->flags & ACC_SYNCHRONIZED))
+       if (checksync && code_is_synchronized(code))
                cd->stackframesize++;
 #endif
 
@@ -191,33 +188,19 @@ bool codegen_emit(jitdata *jd)
        (void) dseg_add_unique_address(cd, code);              /* CodeinfoPointer */
        framesize_disp = dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize       */
 
-#if defined(ENABLE_THREADS)
-       /* IsSync contains the offset relative to the stack pointer for the
-          argument of monitor_exit used in the exception handler. Since the
-          offset could be zero and give a wrong meaning of the flag it is
-          offset by one.
-       */
+       code->synchronizedoffset = JITSTACK + rd->memuse * 8;
 
-       if (checksync && (m->flags & ACC_SYNCHRONIZED))
-               (void) dseg_add_unique_s4(cd, JITSTACK + (rd->memuse + 1) * 8); /* IsSync */
+       /* REMOVEME: We still need it for exception handling in assembler. */
+
+       if (code_is_leafmethod(code))
+               (void) dseg_add_unique_s4(cd, 1);
        else
-#endif
-               (void) dseg_add_unique_s4(cd, 0);                  /* IsSync          */
-                                              
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);       /* IsLeaf          */
+               (void) dseg_add_unique_s4(cd, 0);
+
        (void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
        (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
-       dseg_addlinenumbertablesize(cd);
-       (void) dseg_add_unique_s4(cd, jd->exceptiontablelength); /* ExTableSize   */
 
-       /* create exception table */
-
-       for (ex = jd->exceptiontable; ex != NULL; ex = ex->down) {
-               dseg_add_target(cd, ex->start);
-               dseg_add_target(cd, ex->end);
-               dseg_add_target(cd, ex->handler);
-               (void) dseg_add_unique_address(cd, ex->catchtype.any);
-       }
+       dseg_addlinenumbertablesize(cd);
 
        /* save register window and create stack frame (if necessary) */
 
@@ -247,7 +230,7 @@ bool codegen_emit(jitdata *jd)
        
                /* call monitorenter function */
 #if defined(ENABLE_THREADS)
-       if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
+       if (checksync && code_is_synchronized(code)) {
                /* stack offset for monitor argument */
 
                s1 = rd->memuse;
@@ -1554,11 +1537,11 @@ bool codegen_emit(jitdata *jd)
 
                        M_MOV(s1, REG_OUT0);
                        M_MOV(s3, REG_OUT1);
-                       disp = dseg_add_functionptr(cd, BUILTIN_canstore);
+                       disp = dseg_add_functionptr(cd, BUILTIN_FAST_canstore);
                        M_ALD(REG_ITMP3, REG_PV, disp);
                        M_JMP(REG_RA_CALLER, REG_ITMP3, REG_ZERO);
                        M_NOP;
-                       emit_exception_check(cd, iptr);
+                       emit_arraystore_check(cd, iptr);
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
@@ -2286,7 +2269,7 @@ nowperformreturn:
 #endif
 
 #if defined(ENABLE_THREADS)
-                       if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
+                       if (checksync && code_is_synchronized(code)) {
                                /* XXX jit-c-call */
                                disp = dseg_add_functionptr(cd, LOCK_monitor_exit);
                                M_ALD(REG_ITMP3, REG_PV, disp);
@@ -2419,7 +2402,7 @@ nowperformreturn:
                        md = bte->md;
                        
                        /* XXX: builtin calling with stack arguments not implemented */
-                       assert(md->paramcount <= 4 && md->argfltreguse <= 16);
+                       assert(md->paramcount <= 5 && md->argfltreguse <= 16);
                        
                        s3 = md->paramcount;
 
@@ -2549,7 +2532,6 @@ gen_method:
                            /* REG_RA holds the value of the jmp instruction, therefore +8 */
                            M_LDA(REG_ZERO, REG_RA_CALLER, -disp + 8); 
 
-                               emit_exception_check(cd, iptr);
                                if (md->returntype.type == TYPE_FLT) {
                                        /* special handling for float return value in %f0 */
                                        M_FMOV_INTERN(0,1);
@@ -3108,7 +3090,7 @@ void codegen_emit_stub_builtin(jitdata *jd, builtintable_entry *bte)
                WINSAVE_CNT +
                ABIPARAMS_CNT +
                FLT_ARG_CNT +
-               sizeof(stackframeinfo) / SIZEOF_VOID_P +
+               sizeof(stackframeinfo_t) / SIZEOF_VOID_P +
                4;                              /* 4 arguments or return value        */
 
 
@@ -3135,8 +3117,8 @@ void codegen_emit_stub_builtin(jitdata *jd, builtintable_entry *bte)
        /* Save callee saved integer registers in stackframeinfo (GC may
           need to recover them during a collection). */
 
-       disp = cd->stackframesize * 8 - sizeof(stackframeinfo) +
-               OFFSET(stackframeinfo, intregs) + BIAS;
+       disp = cd->stackframesize * 8 - sizeof(stackframeinfo_t) +
+               OFFSET(stackframeinfo_t, intregs) + BIAS;
 
        for (i = 0; i < INT_SAV_CNT; i++)
                M_AST(abi_registers_integer_saved[i], REG_SP, disp + i * 8);
@@ -3237,8 +3219,8 @@ void codegen_emit_stub_builtin(jitdata *jd, builtintable_entry *bte)
        /* Restore callee saved integer registers from stackframeinfo (GC
           might have modified them during a collection). */
         
-       disp = cd->stackframesize * 8 - sizeof(stackframeinfo) +
-               OFFSET(stackframeinfo, intregs) + BIAS;
+       disp = cd->stackframesize * 8 - sizeof(stackframeinfo_t) +
+               OFFSET(stackframeinfo_t, intregs) + BIAS;
 
        for (i = 0; i < INT_SAV_CNT; i++)
                M_ALD(abi_registers_integer_saved[i], REG_SP, disp + i * 8);
@@ -3321,11 +3303,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        funcdisp = dseg_add_functionptr(cd, f);
 
-#if !defined(WITH_STATIC_CLASSPATH)
-       if (f == NULL) {
+       if (f == NULL)
                codegen_add_patch_ref(cd, PATCHER_resolve_native, m, funcdisp);
-       }
-#endif
 
        /* save float argument registers */
 
@@ -3351,6 +3330,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_JMP(REG_RA_CALLER, REG_ITMP3, REG_ZERO);
        M_NOP; /* XXX fill me! */
 
+       /* remember class argument */
+
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_RESULT_CALLER, REG_ITMP3);
+
        /* keep float arguments on stack */
 #if 0
        for (i = 0, j = 0; i < md->paramcount && i < FLT_ARG_CNT; i++) {
@@ -3456,10 +3440,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* put class into second argument register */
 
-       if (m->flags & ACC_STATIC) {
-               disp = dseg_add_address(cd, m->class);
-               M_ALD(REG_OUT1, REG_PV_CALLEE, disp);
-       }
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_ITMP3, REG_OUT1);
 
        /* put env into first argument register */