Christian Ullrich
Edwin Steiner
- $Id: codegen.c 5248 2006-08-17 17:51:40Z tbfg $
+ $Id: codegen.c 5282 2006-08-28 19:31:37Z tbfg $
*/
s2 = rd->argintregs[s1];
if (!md->params[p].inmemory) { /* register arguments */
if (!(var->flags & INMEMORY)) { /* reg arg -> register */
+ M_NOP;
if (IS_2_WORD_TYPE(t)) /* FIXME, only M_INTMOVE here */
M_LNGMOVE(s2, var->regoff);
else
src = bptr->instack;
len = bptr->icount;
currentline = 0;
-
+
for (iptr = bptr->iinstr; len > 0; src = iptr->dst, len--, iptr++) {
if (iptr->line != currentline) {
dseg_addlinenumber(cd, iptr->line);
MCODECHECK(64); /* an instruction usually needs < 64 words */
+ M_NOP; M_NOP; /* XXX */
switch (iptr->opc) {
case ICMD_NOP: /* ... ==> ... */
case ICMD_INLINE_START:
/* load/store operations **********************************************/
case ICMD_ILOAD: /* ... ==> ..., content of local variable */
- case ICMD_ALOAD: /* op1 = local variable */
var = &(rd->locals[iptr->op1][iptr->opc - ICMD_ILOAD]);
d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
emit_store(jd, iptr, iptr->dst, d);
break;
+ case ICMD_ALOAD: /* op1 = local variable */
case ICMD_LLOAD: /* ... ==> ..., content of local variable */
/* op1 = local variable */
M_IST_INTERN(s2, REG_ITMP1, 0);
break;
case TYPE_LNG:
- s2 = emit_load_s2(jd, iptr, src, PACK_REGS(REG_ITMP2, REG_ITMP3));
+ s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
M_LST_INTERN(s2, REG_ITMP1, 0);
break;
case TYPE_ADR:
gen_nullptr_check(s1);
if (!IS_FLT_DBL_TYPE(iptr->op1)) {
- if (IS_2_WORD_TYPE(iptr->op1)) {
- s2 = emit_load_s2(jd, iptr, src, PACK_REGS(REG_ITMP2, REG_ITMP3));
- } else {
- s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
- }
+ s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
} else {
s2 = emit_load_s2(jd, iptr, src, REG_FTMP2);
}
M_IST(s2, s1, disp);
break;
case TYPE_LNG:
- M_IST(GET_LOW_REG(s2), s1, disp + 4); /* keep this order */
- M_IST(GET_HIGH_REG(s2), s1, disp); /* keep this order */
+ M_LST(s2, s1, disp);
break;
case TYPE_ADR:
M_AST(s2, s1, disp);
case ICMD_ATHROW: /* ..., objectref ==> ... (, objectref) */
s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
- M_INTMOVE(s1, REG_ITMP1_XPTR);
+ M_LNGMOVE(s1, REG_ITMP1_XPTR);
#ifdef ENABLE_VERIFIER
if (iptr->val.a) {
codegen_addreference(cd, (basicblock *) iptr->target);
break;
+ case ICMD_LRETURN: /* ..., retvalue ==> ... */
case ICMD_IRETURN: /* ..., retvalue ==> ... */
s1 = emit_load_s1(jd, iptr, src, REG_RESULT);
- M_INTMOVE(s1, REG_RESULT);
+ M_LNGMOVE(s1, REG_RESULT);
goto nowperformreturn;
case ICMD_ARETURN: /* ..., retvalue ==> ... */
s1 = emit_load_s1(jd, iptr, src, REG_RESULT);
- M_INTMOVE(s1, REG_RESULT);
+ M_LNGMOVE(s1, REG_RESULT);
#ifdef ENABLE_VERIFIER
if (iptr->val.a) {
M_NOP;
}
#endif /* ENABLE_VERIFIER */
- goto nowperformreturn;
- case ICMD_LRETURN: /* ..., retvalue ==> ... */
-
- /*s1 = emit_load_s1(jd, iptr, src, PACK_REGS(REG_RESULT2, REG_RESULT)); FIXME*/
- /*M_LNGMOVE(s1, PACK_REGS(REG_RESULT2, REG_RESULT)); FIXME*/
goto nowperformreturn;
case ICMD_FRETURN: /* ..., retvalue ==> ... */
if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) {
M_MFLR(REG_ZERO);
- M_LDA(REG_SP, REG_SP, -10 * 8);
- M_DST(REG_FRESULT, REG_SP, 48+0);
- M_IST(REG_RESULT, REG_SP, 48+8);
- M_AST(REG_ZERO, REG_SP, 48+12);
- /*M_IST(REG_RESULT2, REG_SP, 48+16); FIXME*/
+ M_LDA(REG_SP, REG_SP, -(LA_SIZE+PA_SIZE+10*8));
+ M_DST(REG_FRESULT, REG_SP, LA_SIZE+PA_SIZE+0*8);
+ M_LST(REG_RESULT, REG_SP, LA_SIZE+PA_SIZE+1*8);
+ M_AST(REG_ZERO, REG_SP, LA_SIZE+PA_SIZE+2*8);
/* keep this order */
switch (iptr->opc) {
case ICMD_LRETURN:
#if defined(__DARWIN__)
- /*M_MOV(REG_RESULT2, rd->argintregs[2]); FIXME */
M_MOV(REG_RESULT, rd->argintregs[1]);
#else
- /*M_MOV(REG_RESULT2, rd->argintregs[3]); FIXME*/
M_MOV(REG_RESULT, rd->argintregs[2]);
#endif
break;
M_MTCTR(REG_ITMP2);
M_JSR;
- M_DLD(REG_FRESULT, REG_SP, 48+0);
- M_ILD(REG_RESULT, REG_SP, 48+8);
- M_ALD(REG_ZERO, REG_SP, 48+12);
- /*M_ILD(REG_RESULT2, REG_SP, 48+16); FIXME*/
- M_LDA(REG_SP, REG_SP, 10 * 8);
+ M_DLD(REG_FRESULT, REG_SP, LA_SIZE+PA_SIZE+0*8);
+ M_LLD(REG_RESULT, REG_SP, LA_SIZE+PA_SIZE+1*8);
+ M_ALD(REG_ZERO, REG_SP, LA_SIZE+PA_SIZE+2*8);
+ M_LDA(REG_SP, REG_SP, LA_SIZE+PA_SIZE+10*8);
M_MTLR(REG_ZERO);
}
/* ATTENTION: Don't use REG_ZERO (r0) here, as M_ALD
may have a displacement overflow. */
- M_ALD(REG_ITMP1, REG_SP, p * 4 + LA_LR_OFFSET);
+ M_ALD(REG_ITMP1, REG_SP, p * 8 + LA_LR_OFFSET);
M_MTLR(REG_ITMP1);
}
/* restore saved registers */
for (i = INT_SAV_CNT - 1; i >= rd->savintreguse; i--) {
- p--; M_ILD(rd->savintregs[i], REG_SP, p * 4);
+ p--; M_ILD(rd->savintregs[i], REG_SP, p * 8);
}
for (i = FLT_SAV_CNT - 1; i >= rd->savfltreguse; i--) {
- p -= 2; M_DLD(rd->savfltregs[i], REG_SP, p * 4);
+ p--; M_DLD(rd->savfltregs[i], REG_SP, p * 8);
}
/* deallocate stack */
if (stackframesize)
- M_LDA(REG_SP, REG_SP, stackframesize * 4);
+ M_LDA(REG_SP, REG_SP, stackframesize * 8);
M_RET;
ALIGNCODENOP;
if (IS_INT_LNG_TYPE(src->type)) {
if (!md->params[s3].inmemory) {
if (IS_2_WORD_TYPE(src->type)) {
- s1 = PACK_REGS(
- rd->argintregs[GET_LOW_REG(md->params[s3].regoff)],
- rd->argintregs[GET_HIGH_REG(md->params[s3].regoff)]);
+ s1 = rd->argintregs[md->params[s3].regoff]; /* removed PACKREGS */
d = emit_load_s1(jd, iptr, src, s1);
M_LNGMOVE(d, s1);
} else {
} else {
if (IS_2_WORD_TYPE(src->type)) {
- d = emit_load_s1(jd, iptr, src, PACK_REGS(REG_ITMP2, REG_ITMP1));
- M_LST(d, REG_SP, md->params[s3].regoff * 4);
+ d = emit_load_s1(jd, iptr, src, REG_ITMP1);
+ M_LST(d, REG_SP, md->params[s3].regoff * 4); /* XXX */
} else {
d = emit_load_s1(jd, iptr, src, REG_ITMP1);
M_IST(d, REG_SP, md->params[s3].regoff * 4);
disp = dseg_addaddress(cd, bte->fp);
d = md->returntype.type;
- M_ALD(REG_PV, REG_PV, disp); /* pointer to built-in-function */
- M_MTCTR(REG_PV);
+ M_ALD(REG_PV, REG_PV, disp); /* pointer to built-in-function descriptor */
+ M_ALD(REG_ITMP1, REG_PV, 0); /* function entry point address */
+ M_ALD(REG_ITMP2, REG_PV, 8); /* TOC of callee */
+ M_MOV(REG_TOC, REG_ITMP2); /* load TOC for callee */
+ M_MTCTR(REG_ITMP1);
M_JSR;
+ /* TODO: restore TOC */
disp = (s4) (cd->mcodeptr - cd->mcodebase);
M_MFLR(REG_ITMP1);
M_LDA(REG_PV, REG_ITMP1, -disp);
if (jd->isleafmethod) {
M_MFLR(REG_ZERO);
- M_AST(REG_ZERO, REG_SP, stackframesize * 4 + LA_LR_OFFSET);
+ M_AST(REG_ZERO, REG_SP, stackframesize * 8 + LA_LR_OFFSET);
}
M_MOV(REG_PV, rd->argintregs[0]);
M_MOV(REG_ZERO, rd->argintregs[2]);
else
M_ALD(rd->argintregs[2],
- REG_SP, stackframesize * 4 + LA_LR_OFFSET);
+ REG_SP, stackframesize * 8 + LA_LR_OFFSET);
M_MOV(REG_ITMP2_XPC, rd->argintregs[3]);
M_MOV(REG_ITMP1, rd->argintregs[4]);
- M_STDU(REG_SP, REG_SP, -(LA_SIZE + 6 * 4)); /* FIXME, changed from M_STWU, but what about *4 in here? and +6? */
- M_AST(REG_ITMP2_XPC, REG_SP, LA_SIZE + 5 * 4);
+ M_STDU(REG_SP, REG_SP, -(LA_SIZE + 6 * 8));
+ M_AST(REG_ITMP2_XPC, REG_SP, LA_SIZE + 5 * 8);
M_MTCTR(REG_ITMP3);
M_JSR;
M_MOV(REG_RESULT, REG_ITMP1_XPTR);
- M_ALD(REG_ITMP2_XPC, REG_SP, LA_SIZE + 5 * 4);
- M_IADD_IMM(REG_SP, LA_SIZE + 6 * 4, REG_SP);
+ M_ALD(REG_ITMP2_XPC, REG_SP, LA_SIZE + 5 * 8);
+ M_LADD_IMM(REG_SP, LA_SIZE + 6 * 8, REG_SP);
if (jd->isleafmethod) {
/* XXX FIXME: REG_ZERO can cause problems here! */
- assert(stackframesize * 4 <= 32767);
+ assert(stackframesize * 8 <= 32767);
- M_ALD(REG_ZERO, REG_SP, stackframesize * 4 + LA_LR_OFFSET);
+ M_ALD(REG_ZERO, REG_SP, stackframesize * 8 + LA_LR_OFFSET);
M_MTLR(REG_ZERO);
}
/* create stack frame - keep stack 16-byte aligned */
- M_AADD_IMM(REG_SP, -8 * 4, REG_SP);
+ M_AADD_IMM(REG_SP, -8 * 8, REG_SP);
/* calculate return address and move it onto the stack */
M_LDA(REG_ITMP3, REG_PV, pref->branchpos);
- M_AST_INTERN(REG_ITMP3, REG_SP, 5 * 4);
+ M_AST_INTERN(REG_ITMP3, REG_SP, 5 * 8);
/* move pointer to java_objectheader onto stack */
disp = dseg_addaddress(cd, NULL); /* vftbl */
M_LDA(REG_ITMP3, REG_PV, disp);
- M_AST_INTERN(REG_ITMP3, REG_SP, 4 * 4);
+ M_AST_INTERN(REG_ITMP3, REG_SP, 4 * 8);
#else
/* do nothing */
#endif
disp = dseg_adds4(cd, mcode);
M_ILD(REG_ITMP3, REG_PV, disp);
- M_IST_INTERN(REG_ITMP3, REG_SP, 3 * 4);
+ M_IST_INTERN(REG_ITMP3, REG_SP, 3 * 8);
/* move class/method/field reference onto stack */
disp = dseg_addaddress(cd, pref->ref);
M_ALD(REG_ITMP3, REG_PV, disp);
- M_AST_INTERN(REG_ITMP3, REG_SP, 2 * 4);
+ M_AST_INTERN(REG_ITMP3, REG_SP, 2 * 8);
/* move data segment displacement onto stack */
disp = dseg_addaddress(cd, pref->disp);
- M_ILD(REG_ITMP3, REG_PV, disp);
- M_IST_INTERN(REG_ITMP3, REG_SP, 1 * 4);
+ M_LLD(REG_ITMP3, REG_PV, disp);
+ M_IST_INTERN(REG_ITMP3, REG_SP, 1 * 8);
/* move patcher function pointer onto stack */
disp = dseg_addaddress(cd, pref->patcher);
M_ALD(REG_ITMP3, REG_PV, disp);
- M_AST_INTERN(REG_ITMP3, REG_SP, 0 * 4);
+ M_AST_INTERN(REG_ITMP3, REG_SP, 0 * 8);
disp = dseg_addaddress(cd, asm_patcher_wrapper);
M_ALD(REG_ITMP3, REG_PV, disp);
if (md->returntype.type != TYPE_VOID) {
if (IS_INT_LNG_TYPE(md->returntype.type)) {
- if (IS_2_WORD_TYPE(md->returntype.type))
- /*M_IST(REG_RESULT2, REG_SP, LA_SIZE + 2 * 4); // FIXME*/
- M_IST(REG_RESULT, REG_SP, LA_SIZE + 1 * 4);
+ M_LST(REG_RESULT, REG_SP, LA_SIZE + 1 * 8);
}
else {
if (IS_2_WORD_TYPE(md->returntype.type))
- M_DST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+ M_DST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8);
else
- M_FST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+ M_FST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8); /* FIXME, needed ?*/
}
}
if (md->returntype.type != TYPE_VOID) {
if (IS_INT_LNG_TYPE(md->returntype.type)) {
- if (IS_2_WORD_TYPE(md->returntype.type))
- /*M_ILD(REG_RESULT2, REG_SP, LA_SIZE + 2 * 4); FIXME*/
- M_ILD(REG_RESULT, REG_SP, LA_SIZE + 1 * 4);
+ M_LLD(REG_RESULT, REG_SP, LA_SIZE + 1 * 8);
}
else {
if (IS_2_WORD_TYPE(md->returntype.type))
- M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+ M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8);
else
- M_FLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+ M_FLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8); /* FIXME, needed ? */
}
}
- M_LDA(REG_SP, REG_SP, -(LA_SIZE + (1 + 2 + 2 + 1) * 4));
+ M_LDA(REG_SP, REG_SP, -(LA_SIZE + PA_SIZE + (1 + 1 + 1 + 1) * 8));
/* keep this order */
switch (md->returntype.type) {
case TYPE_LNG:
#if defined(__DARWIN__)
- /*M_MOV(REG_RESULT2, rd->argintregs[2]);FIXME*/
M_MOV(REG_RESULT, rd->argintregs[1]);
#else
- /*M_MOV(REG_RESULT2, rd->argintregs[3]);FIXME*/
M_MOV(REG_RESULT, rd->argintregs[2]);
#endif
break;
M_MTCTR(REG_ITMP2);
M_JSR;
- M_LDA(REG_SP, REG_SP, LA_SIZE + (1 + 2 + 2 + 1) * 4);
+ M_LDA(REG_SP, REG_SP, LA_SIZE + PA_SIZE + (1 + 1+ 1 + 1) * 8);
}
/* remove native stackframe info */
}
}
- M_ALD(REG_ITMP2_XPC, REG_SP, stackframesize * 4 + LA_LR_OFFSET);
+ M_ALD(REG_ITMP2_XPC, REG_SP, stackframesize * 8 + LA_LR_OFFSET);
M_MTLR(REG_ITMP2_XPC);
- M_LDA(REG_SP, REG_SP, stackframesize * 4); /* remove stackframe */
+ M_LDA(REG_SP, REG_SP, stackframesize * 8); /* remove stackframe */
/* check for exception */
/* handle exception */
- M_IADD_IMM(REG_ITMP2_XPC, -4, REG_ITMP2_XPC); /* exception address */
+ M_LADD_IMM(REG_ITMP2_XPC, -4, REG_ITMP2_XPC); /* exception address */
disp = dseg_addaddress(cd, asm_handle_nat_exception);
M_ALD(REG_ITMP3, REG_PV, disp);
/* create stack frame - keep stack 16-byte aligned */
- M_AADD_IMM(REG_SP, -8 * 4, REG_SP);
+ M_AADD_IMM(REG_SP, -8 * 8, REG_SP);
/* move return address onto stack */
M_MFLR(REG_ZERO);
- M_AST(REG_ZERO, REG_SP, 5 * 4);
+ M_AST(REG_ZERO, REG_SP, 5 * 8);
/* move pointer to java_objectheader onto stack */
disp = dseg_addaddress(cd, NULL); /* vftbl */
M_LDA(REG_ITMP3, REG_PV, disp);
- M_AST(REG_ITMP3, REG_SP, 4 * 4);
+ M_AST(REG_ITMP3, REG_SP, 4 * 8);
#else
/* do nothing */
#endif
disp = dseg_adds4(cd, mcode);
M_ILD(REG_ITMP3, REG_PV, disp);
- M_IST(REG_ITMP3, REG_SP, 3 * 4);
+ M_IST(REG_ITMP3, REG_SP, 3 * 8);
/* move class/method/field reference onto stack */
disp = dseg_addaddress(cd, pref->ref);
M_ALD(REG_ITMP3, REG_PV, disp);
- M_AST(REG_ITMP3, REG_SP, 2 * 4);
+ M_AST(REG_ITMP3, REG_SP, 2 * 8);
/* move data segment displacement onto stack */
- disp = dseg_addaddress(cd, pref->disp);
- M_ILD(REG_ITMP3, REG_PV, disp);
- M_IST(REG_ITMP3, REG_SP, 1 * 4);
+ disp = dseg_adds4(cd, pref->disp);
+ M_LLD(REG_ITMP3, REG_PV, disp);
+ M_IST(REG_ITMP3, REG_SP, 1 * 8);
/* move patcher function pointer onto stack */
disp = dseg_addaddress(cd, pref->patcher);
M_ALD(REG_ITMP3, REG_PV, disp);
- M_AST(REG_ITMP3, REG_SP, 0 * 4);
+ M_AST(REG_ITMP3, REG_SP, 0 * 8);
disp = dseg_addaddress(cd, asm_patcher_wrapper);
M_ALD(REG_ITMP3, REG_PV, disp);