* src/vm/jit/alpha/codegen.c (codegen_emit_stub_builtin): Removed.
authorMichael Starzinger <michi@complang.tuwien.ac.at>
Wed, 12 Sep 2007 10:06:33 +0000 (12:06 +0200)
committerMichael Starzinger <michi@complang.tuwien.ac.at>
Wed, 12 Sep 2007 10:06:33 +0000 (12:06 +0200)
(codegen_emit_stub_native): Adapted to new signature and builtins.

* src/vm/jit/arm/codegen.c (codegen_emit_stub_native): Adapted to new signature.

* src/vm/jit/alpha/codegen.c (codegen_start_native_call) [__ALPHA__]: Call
tracing is done from here now.
(codegen_finish_native_call) [__ALPHA__]: Likewise.

--HG--
branch : michi

src/vm/jit/alpha/codegen.c
src/vm/jit/arm/codegen.c
src/vm/jit/codegen-common.c

index 0647ee9250761cb55454e4fbbb13e56dce0f843d..a42de2f5b53c216c43b6f3400ef72879e4683811 100644 (file)
@@ -3100,198 +3100,18 @@ void codegen_emit_stub_compiler(jitdata *jd)
 }
 
 
-/* codegen_emit_stub_builtin ***************************************************
-
-   Emits a stub routine which calls a builtin function.
-
-*******************************************************************************/
-
-void codegen_emit_stub_builtin(jitdata *jd, builtintable_entry *bte)
-{
-       codeinfo    *code;
-       codegendata *cd;
-       methoddesc  *md;
-       s4           i;
-       s4           disp;
-       s4           s1;
-
-       /* get required compiler data */
-
-       code = jd->code;
-       cd   = jd->cd;
-
-       /* set some variables */
-
-       md = bte->md;
-
-       /* calculate stack frame size */
-
-       cd->stackframesize =
-               1 +                             /* return address                     */
-               sizeof(stackframeinfo) / SIZEOF_VOID_P +
-               md->paramcount;
-
-       /* create method header */
-
-       (void) dseg_add_unique_address(cd, code);              /* CodeinfoPointer */
-       (void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize       */
-       (void) dseg_add_unique_s4(cd, 0);                      /* IsSync          */
-       (void) dseg_add_unique_s4(cd, 0);                      /* IsLeaf          */
-       (void) dseg_add_unique_s4(cd, 0);                      /* IntSave         */
-       (void) dseg_add_unique_s4(cd, 0);                      /* FltSave         */
-       (void) dseg_addlinenumbertablesize(cd);
-       (void) dseg_add_unique_s4(cd, 0);                      /* ExTableSize     */
-
-       /* generate stub code */
-
-       M_LDA(REG_SP, REG_SP, -(cd->stackframesize * 8));
-       M_AST(REG_RA, REG_SP, cd->stackframesize * 8 - SIZEOF_VOID_P);
-
-
-#if defined(ENABLE_GC_CACAO)
-       /* Save callee saved integer registers in stackframeinfo (GC may
-          need to recover them during a collection). */
-
-       disp = cd->stackframesize * 8 - SIZEOF_VOID_P - sizeof(stackframeinfo) +
-               OFFSET(stackframeinfo, intregs);
-
-       for (i = 0; i < INT_SAV_CNT; i++)
-               M_AST(abi_registers_integer_saved[i], REG_SP, disp + i * 8);
-#endif
-
-       /* save integer and float argument registers */
-
-       for (i = 0; i < md->paramcount; i++) {
-               if (!md->params[i].inmemory) {
-                       s1 = md->params[i].regoff;
-
-                       switch (md->paramtypes[i].type) {
-                       case TYPE_INT:
-                       case TYPE_LNG:
-                       case TYPE_ADR:
-                               M_LST(s1, REG_SP, i * 8);
-                               break;
-                       case TYPE_FLT:
-                       case TYPE_DBL:
-                               M_DST(s1, REG_SP, i * 8);
-                               break;
-                       }
-               }
-       }
-
-       /* prepare data structures for native function call */
-
-       M_LDA(REG_A0, REG_SP, cd->stackframesize * 8 - SIZEOF_VOID_P);
-       M_MOV(REG_PV, REG_A1);
-       M_LDA(REG_A2, REG_SP, cd->stackframesize * 8);
-       M_ALD(REG_A3, REG_SP, cd->stackframesize * 8 - SIZEOF_VOID_P);
-       disp = dseg_add_functionptr(cd, codegen_stub_builtin_enter);
-       M_ALD(REG_PV, REG_PV, disp);
-       M_JSR(REG_RA, REG_PV);
-       disp = (s4) (cd->mcodeptr - cd->mcodebase);
-       M_LDA(REG_PV, REG_RA, -disp);
-
-       /* restore integer and float argument registers */
-
-       for (i = 0; i < md->paramcount; i++) {
-               if (!md->params[i].inmemory) {
-                       s1 = md->params[i].regoff;
-
-                       switch (md->paramtypes[i].type) {
-                       case TYPE_INT:
-                       case TYPE_LNG:
-                       case TYPE_ADR:
-                               M_LLD(s1, REG_SP, i * 8);
-                               break;
-                       case TYPE_FLT:
-                       case TYPE_DBL:
-                               M_DLD(s1, REG_SP, i * 8);
-                               break;
-                       }
-               }
-       }
-
-       /* do the builtin function call */
-
-       disp = dseg_add_functionptr(cd, bte->fp);
-       M_ALD(REG_PV, REG_PV, disp);
-       M_JSR(REG_RA, REG_PV);
-       disp = (s4) (cd->mcodeptr - cd->mcodebase);
-       M_LDA(REG_PV, REG_RA, -disp);       /* recompute pv from ra               */
-
-       /* save return value */
-
-       switch (md->returntype.type) {
-       case TYPE_INT:
-       case TYPE_LNG:
-       case TYPE_ADR:
-               M_LST(REG_RESULT, REG_SP, 0 * 8);
-               break;
-       case TYPE_FLT:
-       case TYPE_DBL:
-               M_DST(REG_FRESULT, REG_SP, 0 * 8);
-               break;
-       case TYPE_VOID:
-               break;
-       }
-
-       /* remove native stackframe info */
-
-       M_LDA(REG_A0, REG_SP, cd->stackframesize * 8 - SIZEOF_VOID_P);
-       disp = dseg_add_functionptr(cd, codegen_stub_builtin_exit);
-       M_ALD(REG_PV, REG_PV, disp);
-       M_JSR(REG_RA, REG_PV);
-       disp = (s4) (cd->mcodeptr - cd->mcodebase);
-       M_LDA(REG_PV, REG_RA, -disp);
-       M_MOV(REG_RESULT, REG_ITMP1_XPTR);
-
-       /* restore return value */
-
-       switch (md->returntype.type) {
-       case TYPE_INT:
-       case TYPE_LNG:
-       case TYPE_ADR:
-               M_LLD(REG_RESULT, REG_SP, 0 * 8);
-               break;
-       case TYPE_FLT:
-       case TYPE_DBL:
-               M_DLD(REG_FRESULT, REG_SP, 0 * 8);
-               break;
-       case TYPE_VOID:
-               break;
-       }
-
-#if defined(ENABLE_GC_CACAO)
-       /* Restore callee saved integer registers from stackframeinfo (GC
-          might have modified them during a collection). */
-        
-       disp = cd->stackframesize * 8 - SIZEOF_VOID_P - sizeof(stackframeinfo) +
-               OFFSET(stackframeinfo, intregs);
-
-       for (i = 0; i < INT_SAV_CNT; i++)
-               M_ALD(abi_registers_integer_saved[i], REG_SP, disp + i * 8);
-#endif
-
-       M_ALD(REG_RA, REG_SP, (cd->stackframesize - 1) * 8); /* get RA            */
-       M_LDA(REG_SP, REG_SP, cd->stackframesize * 8);
-
-       M_RET(REG_ZERO, REG_RA);            /* return to caller                   */
-}
-
-
 /* codegen_emit_stub_native ****************************************************
 
    Emits a stub routine which calls a native method.
 
 *******************************************************************************/
 
-void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
+void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int skipparams)
 {
        methodinfo  *m;
        codeinfo    *code;
        codegendata *cd;
        methoddesc  *md;
-       s4           nativeparams;
        s4           i, j;                 /* count variables                    */
        s4           t;
        s4           s1, s2, disp;
@@ -3306,7 +3126,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* initialize variables */
 
        md = m->parseddesc;
-       nativeparams = (m->flags & ACC_STATIC) ? 2 : 1;
 
        /* calculate stack frame size */
 
@@ -3334,13 +3153,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_LDA(REG_SP, REG_SP, -(cd->stackframesize * 8));
        M_AST(REG_RA, REG_SP, cd->stackframesize * 8 - SIZEOF_VOID_P);
 
-       /* call trace function */
-
-#if !defined(NDEBUG)
-       if (JITDATA_HAS_FLAG_VERBOSECALL(jd))
-               emit_verbosecall_enter(jd);
-#endif
-
        /* get function address (this must happen before the stackframeinfo) */
 
        funcdisp = dseg_add_functionptr(cd, f);
@@ -3416,7 +3228,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* copy or spill arguments to new locations */
 
-       for (i = md->paramcount - 1, j = i + nativeparams; i >= 0; i--, j--) {
+       for (i = md->paramcount - 1, j = i + skipparams; i >= 0; i--, j--) {
                t = md->paramtypes[i].type;
 
                if (IS_INT_LNG_TYPE(t)) {
@@ -3462,15 +3274,19 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                }
        }
 
-       /* put class into second argument register */
+       /* Handle native Java methods. */
 
-       if (m->flags & ACC_STATIC)
-               M_MOV(REG_ITMP3, REG_A1);
+       if (m->flags & ACC_NATIVE) {
+               /* put class into second argument register */
+
+               if (m->flags & ACC_STATIC)
+                       M_MOV(REG_ITMP3, REG_A1);
 
-       /* put env into first argument register */
+               /* put env into first argument register */
 
-       disp = dseg_add_address(cd, _Jv_env);
-       M_ALD(REG_A0, REG_PV, disp);
+               disp = dseg_add_address(cd, _Jv_env);
+               M_ALD(REG_A0, REG_PV, disp);
+       }
 
        /* do the native function call */
 
@@ -3495,13 +3311,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                break;
        }
 
-       /* call finished trace */
-
-#if !defined(NDEBUG)
-       if (JITDATA_HAS_FLAG_VERBOSECALL(jd))
-               emit_verbosecall_exit(jd);
-#endif
-
        /* remove native stackframe info */
 
        M_MOV(REG_SP, REG_A0);
index 0c9ceba54e655c8a10eaba912444029010e80458..6b41afdc8bbbb21b8a602df2673c9260eec00d9a 100644 (file)
@@ -2851,12 +2851,11 @@ void codegen_emit_stub_compiler(jitdata *jd)
 
 *******************************************************************************/
 
-void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
+void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int skipparams)
 {
        methodinfo  *m;
        codeinfo    *code;
        codegendata *cd;
-       s4           nativeparams;
        methoddesc  *md;
        s4           i, j;
        s4           t;
@@ -2871,8 +2870,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* initialize variables */
 
        md = m->parseddesc;
-       nativeparams  = (m->flags & ACC_NATIVE) ? 1 : 0;
-       nativeparams += (m->flags & ACC_STATIC) ? 1 : 0;
 
        /* calculate stackframe size */
 
@@ -2957,7 +2954,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* copy or spill arguments to new locations */
        /* ATTENTION: the ARM has only integer argument registers! */
 
-       for (i = md->paramcount - 1, j = i + nativeparams; i >= 0; i--, j--) {
+       for (i = md->paramcount - 1, j = i + skipparams; i >= 0; i--, j--) {
                t = md->paramtypes[i].type;
 
                if (!md->params[i].inmemory) {
@@ -3000,14 +2997,16 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                }
        }
 
-       /* put class into second argument register */
+       /* Handle native Java methods. */
 
-       if (m->flags & ACC_STATIC)
-               M_MOV(REG_A1, REG_ITMP3);
+       if (m->flags & ACC_NATIVE) {
+               /* put class into second argument register */
 
-       /* put env into first argument register */
+               if (m->flags & ACC_STATIC)
+                       M_MOV(REG_A1, REG_ITMP3);
+
+               /* put env into first argument register */
 
-       if (m->flags & ACC_NATIVE) {
                disp = dseg_add_address(cd, _Jv_env);
                M_DSEG_LOAD(REG_A0, disp);
        }
index fcb69d81da7d632b3071cf96be2bab92d91cfe66..b566f69a5140ccf8079d9f311f10bd4ac88f8172 100644 (file)
@@ -1546,7 +1546,7 @@ java_handle_t *codegen_start_native_call(u1 *currentsp, u1 *pv)
 #endif
 
 #if !defined(NDEBUG)
-# if defined(__POWERPC__) || defined(__POWERPC64__) || defined(__X86_64__)
+# if defined(__ALPHA__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__X86_64__)
        /* print the call-trace if necesarry */
 
        if (opt_TraceJavaCalls)
@@ -1642,7 +1642,7 @@ java_object_t *codegen_finish_native_call(u1 *currentsp, u1 *pv)
 
 
 #if !defined(NDEBUG)
-# if defined(__POWERPC__) || defined(__POWERPC64__) || defined(__X86_64__)
+# if defined(__ALPHA__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__X86_64__)
        /* print the call-trace if necesarry */
 
        if (opt_TraceJavaCalls)