Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: arch.h 5330 2006-09-05 18:43:12Z edwin $
-
*/
case TYPE_DBL:
#endif
case TYPE_LNG:
- M_LST(d, REG_SP, dst->vv.regoff * 4);
+ M_LST(d, REG_SP, dst->vv.regoff);
break;
#if defined(ENABLE_SOFTFLOAT)
case TYPE_FLT:
#endif
case TYPE_INT:
- M_IST(d, REG_SP, dst->vv.regoff * 4);
+ M_IST(d, REG_SP, dst->vv.regoff);
break;
case TYPE_ADR:
- M_AST(d, REG_SP, dst->vv.regoff * 4);
+ M_AST(d, REG_SP, dst->vv.regoff);
break;
#if !defined(ENABLE_SOFTFLOAT)
case TYPE_DBL:
- M_DST(d, REG_SP, dst->vv.regoff * 4);
+ M_DST(d, REG_SP, dst->vv.regoff);
break;
case TYPE_FLT:
- M_FST(d, REG_SP, dst->vv.regoff * 4);
+ M_FST(d, REG_SP, dst->vv.regoff);
break;
#endif
default:
if (IS_INMEMORY(src->flags)) {
COUNT_SPILLS;
- disp = src->vv.regoff * 4;
+ disp = src->vv.regoff;
switch (src->type) {
#if defined(ENABLE_SOFTFLOAT)
if (IS_INMEMORY(src->flags)) {
COUNT_SPILLS;
- disp = src->vv.regoff * 4;
+ disp = src->vv.regoff;
M_ILD(tempreg, REG_SP, disp + 4);
reg = tempreg;
} else {
if (IS_INMEMORY(src->flags)) {
COUNT_SPILLS;
- disp = src->vv.regoff * 4;
+ disp = src->vv.regoff;
M_ILD(tempreg, REG_SP, disp);
reg = tempreg;
} else {
}
}
+/* emit_replacement_stubs ******************************************************
+
+ Generates the code for the replacement stubs.
+
+*******************************************************************************/
+
+#if defined(ENABLE_REPLACEMENT)
+void emit_replacement_stubs(jitdata *jd)
+{
+ codegendata *cd;
+ codeinfo *code;
+ rplpoint *rplp;
+ s4 i;
+ s4 branchmpc;
+ s4 outcode;
+
+ /* get required compiler data */
+
+ cd = jd->cd;
+ code = jd->code;
+
+ rplp = code->rplpoints;
+
+ /* store beginning of replacement stubs */
+
+ code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
+
+ for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
+ /* do not generate stubs for non-trappable points */
+
+ if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
+ continue;
+
+ M_JSR_IMM(0);
+#if 0
+ /* check code segment size */
+
+ MCODECHECK(512);
+
+ /* note start of stub code */
+
+ outcode = (s4) (cd->mcodeptr - cd->mcodebase);
+
+ /* push address of `rplpoint` struct */
+
+ M_PUSH_IMM(rplp);
+
+ /* jump to replacement function */
+
+ M_PUSH_IMM(asm_replacement_out);
+ M_RET;
+
+ /* add jump reference for COUNTDOWN points */
+
+ if (rplp->flags & RPLPOINT_FLAG_COUNTDOWN) {
+
+ branchmpc = (s4)rplp->pc + (7 + 6);
+
+ md_codegen_patch_branch(cd, branchmpc, (s4) outcode);
+ }
+
+ assert(((cd->mcodeptr - cd->mcodebase) - outcode) == REPLACEMENT_STUB_SIZE);
+#endif
+ }
+}
+#endif /* defined(ENABLE_REPLACEMENT) */
+
+
#if !defined(NDEBUG)
/*
/* travel up stack to the first argument of the function which needs to be copied */
for (i=0; (i < md->paramcount) && (i < TRACE_ARGS_NUM); i++) {
- disp += 4;
- if (IS_2_WORD_TYPE(md->paramtypes[i].type)) {
- disp += 4;
- }
+ disp += 8;
}
/* disp now points to the first arg which gets copied to the trace stack, relative to REG_SP! */
/* traced function has such an argument */
t = md->paramtypes[i].type;
- if (IS_2_WORD_TYPE(t)) {
- /* copy from original argument stack */
- M_ILD(REG_ITMP1, REG_SP, disp);
- M_IPUSH(REG_ITMP1);
- M_ILD(REG_ITMP1, REG_SP, disp);
- M_IPUSH(REG_ITMP1);
- } else {
- /* displacment is increased as 4 byte on original stack but 8 byte on trace stack */
- M_ILD(REG_ITMP1, REG_SP, disp);
- M_IPUSH(REG_ITMP1);
- M_IPUSH_IMM(0);
- disp += 4;
- }
+ /* copy from original argument stack */
+ M_ILD(REG_ITMP1, REG_SP, disp);
+ M_ILD(REG_ITMP2, REG_SP, disp-4);
+ M_IPUSH(REG_ITMP2);
+ M_IPUSH(REG_ITMP1);
} else {
/* function has no arg here, push nothing and adapt displacement */
M_IPUSH_IMM(0);
#if !defined(ENABLE_SOFTFLOAT)
M_AADD_IMM(-8, REG_SP);
- M_FSTORE(REG_F1, REG_SP, 0);
+ M_FSTORE(REG_D1, REG_SP, 0);
#endif
M_IPUSH_IMM(m); /* push methodinfo */
M_AADD_IMM(3*4 + 4, REG_SP);
#if !defined(ENABLE_SOFTFLOAT)
- M_FLOAD(REG_F1, REG_SP, 0)
+ M_FLOAD(REG_D1, REG_SP, 0)
M_AADD_IMM(8, REG_SP);
#endif
void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2)
{
if (INSTRUCTION_MUST_CHECK(iptr)) {
- M_ILD(REG_ITMP3, s1, OFFSET(java_arrayheader, size));
+ M_ILD(REG_ITMP3, s1, OFFSET(java_array_t, size));
M_ICMP(s2, REG_ITMP3);
M_BHI(4);
M_TRAP_SETREGISTER(s2);