* src/vm/jit/jit.h (jitdata): Removed isleafmethod.
[cacao.git] / src / vm / jit / powerpc / codegen.c
index da28a3cb84f2cb942c1cf80c8a9f252192966e57..96faa9adaf3ed3a18aaded3693a509d1dc152088 100644 (file)
@@ -145,10 +145,10 @@ bool codegen_emit(jitdata *jd)
 
        /* align stack to 16-bytes */
 
-       if (!jd->isleafmethod || JITDATA_HAS_FLAG_VERBOSECALL(jd))
+       if (!code_is_leafmethod(code) || JITDATA_HAS_FLAG_VERBOSECALL(jd))
                ALIGN_2(cd->stackframesize);
 
-       else if (jd->isleafmethod && (cd->stackframesize == LA_SIZE_IN_POINTERS))
+       else if (code_is_leafmethod(code) && (cd->stackframesize == LA_SIZE_IN_POINTERS))
                cd->stackframesize = 0;
 
        (void) dseg_add_unique_address(cd, code);              /* CodeinfoPointer */
@@ -167,7 +167,13 @@ bool codegen_emit(jitdata *jd)
 #endif
                (void) dseg_add_unique_s4(cd, 0);                  /* IsSync          */
                                               
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);       /* IsLeaf          */
+       /* REMOVEME: We still need it for exception handling in assembler. */
+
+       if (code_is_leafmethod(code))
+               (void) dseg_add_unique_s4(cd, 1);
+       else
+               (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 */
 
@@ -201,7 +207,7 @@ bool codegen_emit(jitdata *jd)
 
        /* create stack frame (if necessary) */
 
-       if (!jd->isleafmethod) {
+       if (!code_is_leafmethod(code)) {
                M_MFLR(REG_ZERO);
                M_AST(REG_ZERO, REG_SP, LA_LR_OFFSET);
        }
@@ -1245,7 +1251,6 @@ bool codegen_emit(jitdata *jd)
                case ICMD_FCMPL:      /* ..., val1, val2  ==> ..., val1 fcmpg val2    */
                case ICMD_DCMPL:      /* == => 0, < => 1, > => -1                     */
 
-
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
                        s2 = emit_load_s2(jd, iptr, REG_FTMP2);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
@@ -1275,107 +1280,6 @@ bool codegen_emit(jitdata *jd)
                        emit_store_dst(jd, iptr, d);
                        break;
                        
-               case ICMD_IF_FCMPEQ:    /* ..., value, value ==> ...                  */
-               case ICMD_IF_DCMPEQ:
-
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       M_FCMPU(s1, s2);
-                       M_BNAN(1);
-                       emit_beq(cd, iptr->dst.block);
-                       break;
-
-               case ICMD_IF_FCMPNE:    /* ..., value, value ==> ...                  */
-               case ICMD_IF_DCMPNE:
-
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       M_FCMPU(s1, s2);
-                       emit_bnan(cd, iptr->dst.block);
-                       emit_bne(cd, iptr->dst.block);
-                       break;
-
-
-               case ICMD_IF_FCMPL_LT:  /* ..., value, value ==> ...                  */
-               case ICMD_IF_DCMPL_LT:
-
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       M_FCMPU(s1, s2);
-                       emit_bnan(cd, iptr->dst.block);
-                       emit_blt(cd, iptr->dst.block);
-                       break;
-
-               case ICMD_IF_FCMPL_GT:  /* ..., value, value ==> ...                  */
-               case ICMD_IF_DCMPL_GT:
-
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       M_FCMPU(s1, s2);
-                       M_BNAN(1);
-                       emit_bgt(cd, iptr->dst.block);
-                       break;
-
-               case ICMD_IF_FCMPL_LE:  /* ..., value, value ==> ...                  */
-               case ICMD_IF_DCMPL_LE:
-
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       M_FCMPU(s1, s2);
-                       emit_bnan(cd, iptr->dst.block);
-                       emit_ble(cd, iptr->dst.block);
-                       break;
-
-               case ICMD_IF_FCMPL_GE:  /* ..., value, value ==> ...                  */
-               case ICMD_IF_DCMPL_GE:
-
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       M_FCMPU(s1, s2);
-                       M_BNAN(1);
-                       emit_bge(cd, iptr->dst.block);
-                       break;
-
-               case ICMD_IF_FCMPG_LT:  /* ..., value, value ==> ...                  */
-               case ICMD_IF_DCMPG_LT:
-
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       M_FCMPU(s1, s2);
-                       M_BNAN(1);
-                       emit_blt(cd, iptr->dst.block);
-                       break;
-
-               case ICMD_IF_FCMPG_GT:  /* ..., value, value ==> ...                  */
-               case ICMD_IF_DCMPG_GT:
-
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       M_FCMPU(s1, s2);
-                       emit_bnan(cd, iptr->dst.block);
-                       emit_bgt(cd, iptr->dst.block);
-                       break;
-
-               case ICMD_IF_FCMPG_LE:  /* ..., value, value ==> ...                  */
-               case ICMD_IF_DCMPG_LE:
-
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       M_FCMPU(s1, s2);
-                       M_BNAN(1);
-                       emit_ble(cd, iptr->dst.block);
-                       break;
-
-               case ICMD_IF_FCMPG_GE:  /* ..., value, value ==> ...                  */
-               case ICMD_IF_DCMPG_GE:
-
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       M_FCMPU(s1, s2);
-                       emit_bnan(cd, iptr->dst.block);
-                       emit_bge(cd, iptr->dst.block);
-                       break;
-
 
                /* memory operations **************************************************/
 
@@ -1816,13 +1720,13 @@ bool codegen_emit(jitdata *jd)
                        M_ALD(REG_ITMP2, REG_PV, disp);
                        M_MTCTR(REG_ITMP2);
 
-                       if (jd->isleafmethod)
+                       if (code_is_leafmethod(code))
                                M_MFLR(REG_ITMP3);                          /* save LR        */
 
                        M_BL(0);                                        /* get current PC */
                        M_MFLR(REG_ITMP2_XPC);
 
-                       if (jd->isleafmethod)
+                       if (code_is_leafmethod(code))
                                M_MTLR(REG_ITMP3);                          /* restore LR     */
 
                        M_RTS;                                          /* jump to CTR    */
@@ -2223,7 +2127,7 @@ nowperformreturn:
 
                        /* restore return address                                         */
 
-                       if (!jd->isleafmethod) {
+                       if (!code_is_leafmethod(code)) {
                                /* ATTENTION: Don't use REG_ZERO (r0) here, as M_ALD
                                   may have a displacement overflow. */
 
@@ -2897,31 +2801,6 @@ gen_method:
 }
 
 
-/* codegen_emit_stub_compiler **************************************************
-
-   Emits a stub routine which calls the compiler.
-       
-*******************************************************************************/
-
-void codegen_emit_stub_compiler(jitdata *jd)
-{
-       methodinfo  *m;
-       codegendata *cd;
-
-       /* get required compiler data */
-
-       m  = jd->m;
-       cd = jd->cd;
-
-       /* code for the stub */
-
-       M_ALD_INTERN(REG_ITMP1, REG_PV, -2 * SIZEOF_VOID_P);
-       M_ALD_INTERN(REG_PV, REG_PV, -3 * SIZEOF_VOID_P);
-       M_MTCTR(REG_PV);
-       M_RTS;
-}
-
-
 /* codegen_emit_stub_native ****************************************************
 
    Emits a stub routine which calls a native method.
@@ -2936,8 +2815,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
        methoddesc  *md;
        s4           i, j;                 /* count variables                    */
        s4           t;
-       s4           s1, s2, disp;
-       s4           funcdisp;
+       s4           s1, s2;
+       int          disp;
 
        /* get required compiler data */
 
@@ -2979,13 +2858,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
        M_AST_INTERN(REG_ZERO, REG_SP, LA_LR_OFFSET);
        M_STWU(REG_SP, REG_SP, -(cd->stackframesize * 8));
 
-       /* get function address (this must happen before the stackframeinfo) */
-
-       funcdisp = dseg_add_functionptr(cd, f);
-
-       if (f == NULL)
-               patcher_add_patch_ref(jd, PATCHER_resolve_native_function, m, funcdisp);
-
 #if defined(ENABLE_GC_CACAO)
        /* Save callee saved integer registers in stackframeinfo (GC may
           need to recover them during a collection). */
@@ -3123,9 +2995,10 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
                M_ALD(REG_A0, REG_PV, disp);
        }
 
-       /* generate the actual native call */
+       /* Call the native function. */
 
-       M_ALD(REG_ITMP3, REG_PV, funcdisp);
+       disp = dseg_add_functionptr(cd, f);
+       M_ALD(REG_ITMP3, REG_PV, disp);
        M_MTCTR(REG_ITMP3);
        M_JSR;
 
@@ -3205,10 +3078,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
        M_ALD(REG_ITMP3, REG_PV, disp);
        M_MTCTR(REG_ITMP3);
        M_RTS;
-
-       /* generate patcher traps */
-
-       emit_patcher_traps(jd);
 }