use md_codegen_patch_branch.
* src/vm/jit/arm/codegen.c (codegen): Use codegen_resolve_branchrefs,
use exceptions_throw_internalerror.
* src/vm/jit/arm/codegen.h (M_STACK_LOAD_FLT_TYPED): Removed.
(M_STACK_STORE_FLT_TYPED): Likewise.
Changes: Christian Thalinger
Edwin Steiner
- $Id: codegen.c 6591 2007-01-02 19:14:25Z twisti $
+ $Id: codegen.c 6596 2007-01-11 14:22:55Z twisti $
*/
}
else { /* stack arguments */
if (!(var->flags & INMEMORY)) { /* stack arg -> register */
- M_STACK_LOAD_FLT_TYPED(t, var->vv.regoff, cd->stackframesize + s1);
- } else { /* stack arg -> spilled */
+ if (IS_2_WORD_TYPE(t))
+ M_DLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4);
+ else
+ M_FLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4);
+ }
+ else { /* stack arg -> spilled */
/* Reuse Memory Position on Caller Stack */
var->vv.regoff = cd->stackframesize + s1;
}
/* SECTION: ICMD Code Generation */
/* for all basic blocks */
- for (bptr = jd->basicblocks; bptr != NULL; bptr = bptr->next)
- {
+
+ for (bptr = jd->basicblocks; bptr != NULL; bptr = bptr->next) {
+
bptr->mpc = (s4) (cd->mcodeptr - cd->mcodebase);
/* is this basic block reached? */
+
if (bptr->flags < BBREACHED)
continue;
/* branch resolving */
- {
- branchref *brefs;
- for (brefs = bptr->branchrefs; brefs != NULL; brefs = brefs->next) {
- gen_resolvebranch(cd->mcodebase + brefs->branchpos,
- brefs->branchpos, bptr->mpc);
- }
- }
+
+ codegen_resolve_branchrefs(cd, bptr);
/* copy interface registers to their destination */
+
len = bptr->indepth;
MCODECHECK(64+len);
}
else {
d = emit_load(jd, iptr, var, REG_FTMP1);
- M_STACK_STORE_FLT_TYPED(var->type, d, md->params[s3].regoff);
+ if (IS_2_WORD_TYPE(var->type))
+ M_DST(d, REG_SP, md->params[s3].regoff * 4);
+ else
+ M_FST(d, REG_SP, md->params[s3].regoff * 4);
}
}
#endif /* !defined(ENABLE_SOFTFLOAT) */
case ICMD_CHECKCAST: /* ..., objectref ==> ..., objectref */
/* val.a: (classinfo*) superclass */
+
if (!(iptr->flags.bits & INS_FLAG_ARRAY)) {
/* object type cast-check */
/* class checkcast code */
-
if ((super == NULL) || !(super->flags & ACC_INTERFACE)) {
if (super == NULL) {
disp = dseg_add_unique_address(cd, NULL);
break;
default:
- *exceptionptr = new_internalerror("Unknown ICMD %d", iptr->opc);
+ exceptions_throw_internalerror("Unknown ICMD %d during code generation",
+ iptr->opc);
return false;
} /* the big switch */
Authors: Michael Starzinger
Christian Thalinger
- $Id: codegen.h 6591 2007-01-02 19:14:25Z twisti $
+ $Id: codegen.h 6596 2007-01-11 14:22:55Z twisti $
*/
#if !defined(ENABLE_SOFTFLOAT)
-#define M_STACK_LOAD_FLT_TYPED(t, reg, offset) { \
- CHECK_FLT_REG(reg); \
- if (IS_2_WORD_TYPE(t)) { \
- M_LDFD(reg, REG_SP, (offset) * 4); \
- } else { \
- M_LDFS(reg, REG_SP, (offset) * 4); \
- } \
-}
-
#define M_FLD(a,b,c) M_LDFS(a,b,c)
#define M_DLD(a,b,c) M_LDFD(a,b,c)
#define M_DLD_INTERN(a,b,c) M_LDFD_INTERN(a,b,c)
-#define M_STACK_STORE_FLT_TYPED(t, reg, offset) { \
- CHECK_FLT_REG(reg); \
- if (IS_2_WORD_TYPE(t)) { \
- M_STFD(reg, REG_SP, (offset) * 4); \
- } else { \
- M_STFS(reg, REG_SP, (offset) * 4); \
- } \
-}
-
#define M_FST(a,b,c) M_STFS(a,b,c)
#define M_DST(a,b,c) M_STFD(a,b,c)
{
codegendata *cd;
registerdata *rd;
- exceptionref *eref;
+ exceptionref *er;
+ s4 branchmpc;
+ s4 targetmpc;
s4 targetdisp;
s4 disp;
targetdisp = 0;
- for (eref = cd->exceptionrefs; eref != NULL; eref = eref->next) {
- gen_resolvebranch(cd->mcodebase + eref->branchpos,
- eref->branchpos, cd->mcodeptr - cd->mcodebase);
+ for (er = cd->exceptionrefs; er != NULL; er = er->next) {
+ /* back-patch the branch to this exception code */
+
+ branchmpc = er->branchpos;
+ targetmpc = cd->mcodeptr - cd->mcodebase;
+
+ md_codegen_patch_branch(cd, branchmpc, targetmpc);
MCODECHECK(100);
ArrayIndexOutOfBoundsException. If so, move index register
into REG_ITMP1. */
- if (eref->reg != -1)
- M_MOV(REG_ITMP1, eref->reg);
+ if (er->reg != -1)
+ M_MOV(REG_ITMP1, er->reg);
/* calcuate exception address */
- assert((eref->branchpos - 4) % 4 == 0);
- M_ADD_IMM_EXT_MUL4(REG_ITMP2_XPC, REG_IP, (eref->branchpos - 4) / 4);
+ assert((er->branchpos - 4) % 4 == 0);
+ M_ADD_IMM_EXT_MUL4(REG_ITMP2_XPC, REG_IP, (er->branchpos - 4) / 4);
/* move function to call into REG_ITMP3 */
- disp = dseg_add_functionptr(cd, eref->function);
+ disp = dseg_add_functionptr(cd, er->function);
M_DSEG_LOAD(REG_ITMP3, disp);
if (targetdisp == 0) {