Merged revisions 8179-8182 via svnmerge from
authormichi <none@none>
Thu, 5 Jul 2007 20:37:05 +0000 (20:37 +0000)
committermichi <none@none>
Thu, 5 Jul 2007 20:37:05 +0000 (20:37 +0000)
svn+ssh://michi@c1.complang.tuwien.ac.at/ahome/cacao/svn/cacao/trunk

........
  r8182 | michi | 2007-07-05 22:36:16 +0200 (Thu, 05 Jul 2007) | 2 lines

  * src/vm/jit/arm/codegen.c (codegen_emit): Replacement points are created.
........

--HG--
branch : exact-gc

src/vm/jit/arm/codegen.c

index ed0d3122fbf12f18e513114b4380623eaff14a6d..e1128c95eb0319a69b07b29f1e87936e7dc0a3a0 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8181 2007-07-05 20:23:10Z michi $
+   $Id: codegen.c 8183 2007-07-05 20:37:05Z michi $
 
 */
 
@@ -321,6 +321,9 @@ bool codegen_emit(jitdata *jd)
 
        /* end of header generation */
 
+       /* create replacement points */
+       REPLACEMENT_POINTS_INIT(cd, jd);
+
        /* SECTION: ICMD Code Generation */
        /* for all basic blocks */
 
@@ -337,6 +340,9 @@ bool codegen_emit(jitdata *jd)
 
                codegen_resolve_branchrefs(cd, bptr);
 
+               /* handle replacement points */
+               REPLACEMENT_POINT_BLOCK_START(cd, bptr);
+
                /* copy interface registers to their destination */
 
                len = bptr->indepth;
@@ -2072,6 +2078,7 @@ bool codegen_emit(jitdata *jd)
                case ICMD_FRETURN:      /* ..., retvalue ==> ...                      */
 
 #if !defined(ENABLE_SOFTFLOAT)
+                       REPLACEMENT_POINT_RETURN(cd, iptr);
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
                        M_CAST_FLT_TO_INT_TYPED(VAROP(iptr->s1)->type, s1, REG_RESULT);
                        goto ICMD_RETURN_do;
@@ -2079,6 +2086,7 @@ bool codegen_emit(jitdata *jd)
 
                case ICMD_IRETURN:      /* ..., retvalue ==> ...                      */
 
+                       REPLACEMENT_POINT_RETURN(cd, iptr);
                        s1 = emit_load_s1(jd, iptr, REG_RESULT);
                        M_INTMOVE(s1, REG_RESULT);
                        goto ICMD_RETURN_do;
@@ -2086,6 +2094,7 @@ bool codegen_emit(jitdata *jd)
                case ICMD_DRETURN:      /* ..., retvalue ==> ...                      */
 
 #if !defined(ENABLE_SOFTFLOAT)
+                       REPLACEMENT_POINT_RETURN(cd, iptr);
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
                        M_CAST_FLT_TO_INT_TYPED(VAROP(iptr->s1)->type, s1, REG_RESULT_PACKED);
                        goto ICMD_RETURN_do;
@@ -2093,12 +2102,14 @@ bool codegen_emit(jitdata *jd)
 
                case ICMD_LRETURN:      /* ..., retvalue ==> ...                      */
 
+                       REPLACEMENT_POINT_RETURN(cd, iptr);
                        s1 = emit_load_s1(jd, iptr, REG_RESULT_PACKED);
                        M_LNGMOVE(s1, REG_RESULT_PACKED);
                        goto ICMD_RETURN_do;
 
                case ICMD_ARETURN:      /* ..., retvalue ==> ...                      */
 
+                       REPLACEMENT_POINT_RETURN(cd, iptr);
                        s1 = emit_load_s1(jd, iptr, REG_RESULT);
                        M_INTMOVE(s1, REG_RESULT);
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
@@ -2111,6 +2122,8 @@ bool codegen_emit(jitdata *jd)
                        goto ICMD_RETURN_do;
 
                case ICMD_RETURN:       /* ...  ==> ...                               */
+
+                       REPLACEMENT_POINT_RETURN(cd, iptr);
                        ICMD_RETURN_do:
 
 #if !defined(NDEBUG)
@@ -2191,6 +2204,8 @@ bool codegen_emit(jitdata *jd)
                case ICMD_INVOKEVIRTUAL:/* op1 = arg count, val.a = method pointer    */
                case ICMD_INVOKEINTERFACE:
 
+                       REPLACEMENT_POINT_INVOKE(cd, iptr);
+
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                lm = NULL;
                                um = iptr->sx.s23.s3.um;
@@ -2361,6 +2376,9 @@ bool codegen_emit(jitdata *jd)
                                break;
                        }
 
+                       /* store size of call code in replacement point */
+                       REPLACEMENT_POINT_INVOKE_RETURN(cd, iptr);
+
                        /* store return value */
 
                        d = md->returntype.type;
@@ -2870,6 +2888,7 @@ bool codegen_emit(jitdata *jd)
        /* generate stubs */
 
        emit_patcher_traps(jd);
+       REPLACEMENT_EMIT_STUBS(jd);
 
        /* everything's ok */