- case ICMD_IRETURN: /* ..., retvalue ==> ... */
-
- REPLACEMENT_POINT_RETURN(cd, iptr);
- s1 = emit_load_s1(jd, iptr, REG_RESULT);
- M_INTMOVE(s1, REG_RESULT);
- goto nowperformreturn;
-
- case ICMD_ARETURN: /* ..., retvalue ==> ... */
-
- REPLACEMENT_POINT_RETURN(cd, iptr);
- s1 = emit_load_s1(jd, iptr, REG_RESULT);
- M_INTMOVE(s1, REG_RESULT);
-
-#ifdef ENABLE_VERIFIER
- if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
- unresolved_class *uc = iptr->sx.s23.s2.uc;
-
- PROFILE_CYCLE_STOP;
- patcher_add_patch_ref(jd, PATCHER_resolve_class, uc, 0);
- PROFILE_CYCLE_START;
- }
-#endif /* ENABLE_VERIFIER */
- goto nowperformreturn;
-
- 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 nowperformreturn;
-
- case ICMD_FRETURN: /* ..., retvalue ==> ... */
- case ICMD_DRETURN:
-
- REPLACEMENT_POINT_RETURN(cd, iptr);
- s1 = emit_load_s1(jd, iptr, REG_FRESULT);
- M_FLTMOVE(s1, REG_FRESULT);
- goto nowperformreturn;
-
- case ICMD_RETURN: /* ... ==> ... */
-
- REPLACEMENT_POINT_RETURN(cd, iptr);
-
-nowperformreturn:
- {
- s4 i, p;
-
- p = cd->stackframesize;
-
- /* call trace function */
-
-#if !defined(NDEBUG)
- if (JITDATA_HAS_FLAG_VERBOSECALL(jd))
- emit_verbosecall_exit(jd);
-#endif /* !defined(NDEBUG) */
-
-#if defined(ENABLE_THREADS)
- if (checksync && code_is_synchronized(code)) {
- /* we need to save the proper return value */
-
- switch (iptr->opc) {
- case ICMD_LRETURN:
- M_IST(REG_RESULT2, REG_SP, ((rd->memuse + 1) * 8) + 4);
- /* fall through */
- case ICMD_IRETURN:
- case ICMD_ARETURN:
- M_IST(REG_RESULT , REG_SP, (rd->memuse + 1) * 8);
- break;
- case ICMD_FRETURN:
- M_FST(REG_FRESULT, REG_SP, (rd->memuse + 1) * 8);
- break;
- case ICMD_DRETURN:
- M_DST(REG_FRESULT, REG_SP, (rd->memuse + 1) * 8);
- break;
- }
-
- M_ALD(REG_A0, REG_SP, rd->memuse * 8);
-
- disp = dseg_add_functionptr(cd, LOCK_monitor_exit);
- M_ALD_DSEG(REG_ITMP2, disp);
-
- M_ASUB_IMM(96, REG_SP);
- M_CALL(REG_ITMP2);
- M_AADD_IMM(96, REG_SP);
-
- /* and now restore the proper return value */
-
- switch (iptr->opc) {
- case ICMD_LRETURN:
- M_ILD(REG_RESULT2, REG_SP, ((rd->memuse + 1) * 8) + 4);
- /* fall through */
- case ICMD_IRETURN:
- case ICMD_ARETURN:
- M_ILD(REG_RESULT , REG_SP, (rd->memuse + 1) * 8);
- break;
- case ICMD_FRETURN:
- M_FLD(REG_FRESULT, REG_SP, (rd->memuse + 1) * 8);
- break;
- case ICMD_DRETURN:
- M_DLD(REG_FRESULT, REG_SP, (rd->memuse + 1) * 8);
- break;
- }
- }
-#endif
-
- /* restore return address */
-
- p--; M_ALD(REG_RA, REG_SP, p * 8);
-
- /* restore saved registers */
-
- for (i = INT_SAV_CNT - 1; i >= rd->savintreguse; i--) {
- p--; M_ILD(rd->savintregs[i], REG_SP, p * 8);
- }
- for (i = FLT_SAV_CNT - 1; i >= rd->savfltreguse; i--) {
- p--; M_DLD(rd->savfltregs[i], REG_SP, p * 8);
- }
-
- /* deallocate stack */
-
- if (cd->stackframesize)
- M_AADD_IMM(cd->stackframesize * 8, REG_SP);
-
- /* generate method profiling code */
-
- PROFILE_CYCLE_STOP;
-
- M_RET;
- }
- break;
-