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 $
*/
/* end of header generation */
+ /* create replacement points */
+ REPLACEMENT_POINTS_INIT(cd, jd);
+
/* SECTION: ICMD Code Generation */
/* for all basic blocks */
codegen_resolve_branchrefs(cd, bptr);
+ /* handle replacement points */
+ REPLACEMENT_POINT_BLOCK_START(cd, bptr);
+
/* copy interface registers to their destination */
len = bptr->indepth;
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;
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;
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;
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)) {
goto ICMD_RETURN_do;
case ICMD_RETURN: /* ... ==> ... */
+
+ REPLACEMENT_POINT_RETURN(cd, iptr);
ICMD_RETURN_do:
#if !defined(NDEBUG)
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;
break;
}
+ /* store size of call code in replacement point */
+ REPLACEMENT_POINT_INVOKE_RETURN(cd, iptr);
+
/* store return value */
d = md->returntype.type;
/* generate stubs */
emit_patcher_traps(jd);
+ REPLACEMENT_EMIT_STUBS(jd);
/* everything's ok */