Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: codegen.c 8009 2007-06-05 07:56:35Z twisti $
-
*/
#include "mm/memory.h"
+#include "native/localref.h"
#include "native/native.h"
#include "threads/lock-common.h"
#include "vm/jit/emit-common.h"
#include "vm/jit/jit.h"
#include "vm/jit/md.h"
-#include "vm/jit/patcher.h"
+#include "vm/jit/patcher-common.h"
#include "vm/jit/reg.h"
#include "vm/jit/replace.h"
if (!(var->flags & INMEMORY))
M_INTMOVE(s1, var->vv.regoff);
else
- M_LST(s1, REG_SP, var->vv.regoff * 8);
+ M_LST(s1, REG_SP, var->vv.regoff);
#else
if (!(var->flags & INMEMORY)) {
if (IS_2_WORD_TYPE(t))
}
else {
if (IS_2_WORD_TYPE(t))
- M_LST(s1, REG_SP, var->vv.regoff * 8);
+ M_LST(s1, REG_SP, var->vv.regoff);
else
- M_IST(s1, REG_SP, var->vv.regoff * 8);
+ M_IST(s1, REG_SP, var->vv.regoff);
}
#endif
}
else { /* stack arguments */
if (!(var->flags & INMEMORY)) {
#if SIZEOF_VOID_P == 8
- M_LLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8);
+ M_LLD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1);
#else
if (IS_2_WORD_TYPE(t))
- M_LLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8);
+ M_LLD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1);
else
- M_ILD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8);
+ M_ILD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1);
#endif
}
else
- var->vv.regoff = cd->stackframesize + s1;
+ var->vv.regoff = cd->stackframesize * 8 + s1;
}
}
else { /* floating args */
if (!md->params[p].inmemory) {
-#if SIZEOF_VOID_P == 8
if (!(var->flags & INMEMORY)) {
if (IS_2_WORD_TYPE(t))
- M_DMOV(s1, var->vv.regoff);
+ M_DBLMOVE(s1, var->vv.regoff);
else
- M_FMOV(s1, var->vv.regoff);
+ M_FLTMOVE(s1, var->vv.regoff);
}
else {
if (IS_2_WORD_TYPE(t))
- M_DST(s1, REG_SP, var->vv.regoff * 8);
+ M_DST(s1, REG_SP, var->vv.regoff);
else
- M_FST(s1, REG_SP, var->vv.regoff * 8);
+ M_FST(s1, REG_SP, var->vv.regoff);
}
-#else
- if ((p == 0) ||
- ((p == 1) && IS_FLT_DBL_TYPE(md->paramtypes[0].type))) {
- if (!(var->flags & INMEMORY)) {
- if (IS_2_WORD_TYPE(t))
- M_DBLMOVE(s1, var->vv.regoff);
- else
- M_FLTMOVE(s1, var->vv.regoff);
- }
- else {
- if (IS_2_WORD_TYPE(t))
- M_DST(s1, REG_SP, var->vv.regoff * 8);
- else
- M_FST(s1, REG_SP, var->vv.regoff * 8);
- }
- }
- else {
- if (IS_2_WORD_TYPE(t)) {
- if (!(var->flags & INMEMORY)) {
- M_MTC1(GET_LOW_REG(s1), var->vv.regoff);
- M_MTC1(GET_HIGH_REG(s1), var->vv.regoff + 1);
- M_NOP;
- }
- else
- M_LST(s1, REG_SP, var->vv.regoff * 8);
- }
- else {
- if (!(var->flags & INMEMORY)) {
- M_MTC1(s1, var->vv.regoff);
- M_NOP;
- }
- else
- M_IST(s1, REG_SP, var->vv.regoff * 8);
- }
- }
-#endif
}
else {
if (!(var->flags & INMEMORY)) {
if (IS_2_WORD_TYPE(t))
- M_DLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8);
+ M_DLD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1);
else
- M_FLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8);
+ M_FLD(var->vv.regoff, REG_SP, cd->stackframesize * 8 + s1);
}
else
- var->vv.regoff = cd->stackframesize + s1;
+ var->vv.regoff = cd->stackframesize * 8 + s1;
}
}
}
cr = iptr->sx.val.c.ref;
disp = dseg_add_unique_address(cd, cr);
- codegen_add_patch_ref(cd, PATCHER_aconst, cr, disp);
+ patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_classinfo,
+ cr, disp);
M_ALD(d, REG_PV, disp);
}
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
/* implicit null-pointer check */
- M_ILD(d, s1, OFFSET(java_arrayheader, size));
+ M_ILD(d, s1, OFFSET(java_array_t, size));
emit_store_dst(jd, iptr, d);
break;
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_AADD(s2, s1, REG_ITMP3);
/* implicit null-pointer check */
- M_BLDS(d, REG_ITMP3, OFFSET(java_bytearray, data[0]));
+ M_BLDS(d, REG_ITMP3, OFFSET(java_bytearray_t, data[0]));
emit_store_dst(jd, iptr, d);
break;
M_AADD(s2, s1, REG_ITMP3);
M_AADD(s2, REG_ITMP3, REG_ITMP3);
/* implicit null-pointer check */
- M_SLDU(d, REG_ITMP3, OFFSET(java_chararray, data[0]));
+ M_SLDU(d, REG_ITMP3, OFFSET(java_chararray_t, data[0]));
emit_store_dst(jd, iptr, d);
break;
M_AADD(s2, s1, REG_ITMP3);
M_AADD(s2, REG_ITMP3, REG_ITMP3);
/* implicit null-pointer check */
- M_SLDS(d, REG_ITMP3, OFFSET(java_shortarray, data[0]));
+ M_SLDS(d, REG_ITMP3, OFFSET(java_shortarray_t, data[0]));
emit_store_dst(jd, iptr, d);
break;
M_ASLL_IMM(s2, 2, REG_ITMP3);
M_AADD(REG_ITMP3, s1, REG_ITMP3);
/* implicit null-pointer check */
- M_ILD_INTERN(d, REG_ITMP3, OFFSET(java_intarray, data[0]));
+ M_ILD_INTERN(d, REG_ITMP3, OFFSET(java_intarray_t, data[0]));
emit_store_dst(jd, iptr, d);
break;
M_ASLL_IMM(s2, 3, REG_ITMP3);
M_AADD(REG_ITMP3, s1, REG_ITMP3);
/* implicit null-pointer check */
- M_LLD_INTERN(d, REG_ITMP3, OFFSET(java_longarray, data[0]));
+ M_LLD_INTERN(d, REG_ITMP3, OFFSET(java_longarray_t, data[0]));
emit_store_dst(jd, iptr, d);
break;
M_ASLL_IMM(s2, 2, REG_ITMP3);
M_AADD(REG_ITMP3, s1, REG_ITMP3);
/* implicit null-pointer check */
- M_FLD_INTERN(d, REG_ITMP3, OFFSET(java_floatarray, data[0]));
+ M_FLD_INTERN(d, REG_ITMP3, OFFSET(java_floatarray_t, data[0]));
emit_store_dst(jd, iptr, d);
break;
M_ASLL_IMM(s2, 3, REG_ITMP3);
M_AADD(REG_ITMP3, s1, REG_ITMP3);
/* implicit null-pointer check */
- M_DLD_INTERN(d, REG_ITMP3, OFFSET(java_doublearray, data[0]));
+ M_DLD_INTERN(d, REG_ITMP3, OFFSET(java_doublearray_t, data[0]));
emit_store_dst(jd, iptr, d);
break;
M_ASLL_IMM(s2, POINTERSHIFT, REG_ITMP3);
M_AADD(REG_ITMP3, s1, REG_ITMP3);
/* implicit null-pointer check */
- M_ALD_INTERN(d, REG_ITMP3, OFFSET(java_objectarray, data[0]));
+ M_ALD_INTERN(d, REG_ITMP3, OFFSET(java_objectarray_t, data[0]));
emit_store_dst(jd, iptr, d);
break;
M_AADD(s2, s1, REG_ITMP1);
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
/* implicit null-pointer check */
- M_BST(s3, REG_ITMP1, OFFSET(java_bytearray, data[0]));
+ M_BST(s3, REG_ITMP1, OFFSET(java_bytearray_t, data[0]));
break;
case ICMD_CASTORE: /* ..., arrayref, index, value ==> ... */
M_AADD(s2, REG_ITMP1, REG_ITMP1);
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
/* implicit null-pointer check */
- M_SST(s3, REG_ITMP1, OFFSET(java_chararray, data[0]));
+ M_SST(s3, REG_ITMP1, OFFSET(java_chararray_t, data[0]));
break;
case ICMD_IASTORE: /* ..., arrayref, index, value ==> ... */
M_AADD(REG_ITMP2, s1, REG_ITMP1);
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
/* implicit null-pointer check */
- M_IST_INTERN(s3, REG_ITMP1, OFFSET(java_intarray, data[0]));
+ M_IST_INTERN(s3, REG_ITMP1, OFFSET(java_intarray_t, data[0]));
break;
case ICMD_LASTORE: /* ..., arrayref, index, value ==> ... */
s3 = emit_load_s3(jd, iptr, REG_ITMP23_PACKED);
#endif
/* implicit null-pointer check */
- M_LST_INTERN(s3, REG_ITMP1, OFFSET(java_longarray, data[0]));
+ M_LST_INTERN(s3, REG_ITMP1, OFFSET(java_longarray_t, data[0]));
break;
case ICMD_FASTORE: /* ..., arrayref, index, value ==> ... */
M_AADD(REG_ITMP2, s1, REG_ITMP1);
s3 = emit_load_s3(jd, iptr, REG_FTMP1);
/* implicit null-pointer check */
- M_FST_INTERN(s3, REG_ITMP1, OFFSET(java_floatarray, data[0]));
+ M_FST_INTERN(s3, REG_ITMP1, OFFSET(java_floatarray_t, data[0]));
break;
case ICMD_DASTORE: /* ..., arrayref, index, value ==> ... */
M_AADD(REG_ITMP2, s1, REG_ITMP1);
s3 = emit_load_s3(jd, iptr, REG_FTMP1);
/* implicit null-pointer check */
- M_DST_INTERN(s3, REG_ITMP1, OFFSET(java_doublearray, data[0]));
+ M_DST_INTERN(s3, REG_ITMP1, OFFSET(java_doublearray_t, data[0]));
break;
M_AADD(REG_ITMP2, s1, REG_ITMP1);
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
/* implicit null-pointer check */
- M_AST_INTERN(s3, REG_ITMP1, OFFSET(java_objectarray, data[0]));
+ M_AST_INTERN(s3, REG_ITMP1, OFFSET(java_objectarray_t, data[0]));
break;
emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
M_AADD(s2, s1, REG_ITMP1);
/* implicit null-pointer check */
- M_BST(REG_ZERO, REG_ITMP1, OFFSET(java_bytearray, data[0]));
+ M_BST(REG_ZERO, REG_ITMP1, OFFSET(java_bytearray_t, data[0]));
break;
case ICMD_CASTORECONST: /* ..., arrayref, index ==> ... */
M_AADD(s2, s1, REG_ITMP1);
M_AADD(s2, REG_ITMP1, REG_ITMP1);
/* implicit null-pointer check */
- M_SST(REG_ZERO, REG_ITMP1, OFFSET(java_chararray, data[0]));
+ M_SST(REG_ZERO, REG_ITMP1, OFFSET(java_chararray_t, data[0]));
break;
case ICMD_IASTORECONST: /* ..., arrayref, index ==> ... */
M_ASLL_IMM(s2, 2, REG_ITMP2);
M_AADD(REG_ITMP2, s1, REG_ITMP1);
/* implicit null-pointer check */
- M_IST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_intarray, data[0]));
+ M_IST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_intarray_t, data[0]));
break;
case ICMD_LASTORECONST: /* ..., arrayref, index ==> ... */
M_AADD(REG_ITMP2, s1, REG_ITMP1);
/* implicit null-pointer check */
#if SIZEOF_VOID_P == 8
- M_LST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_longarray, data[0]));
+ M_LST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_longarray_t, data[0]));
#else
- M_LST_INTERN(PACK_REGS(REG_ZERO, REG_ZERO), REG_ITMP1, OFFSET(java_longarray, data[0]));
+ M_LST_INTERN(PACK_REGS(REG_ZERO, REG_ZERO), REG_ITMP1, OFFSET(java_longarray_t, data[0]));
#endif
break;
M_ASLL_IMM(s2, POINTERSHIFT, REG_ITMP2);
M_AADD(REG_ITMP2, s1, REG_ITMP1);
/* implicit null-pointer check */
- M_AST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_objectarray, data[0]));
+ M_AST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_objectarray_t, data[0]));
break;
fieldtype = uf->fieldref->parseddesc.fd->type;
disp = dseg_add_unique_address(cd, uf);
- codegen_add_patch_ref(cd, PATCHER_get_putstatic, uf, disp);
+ patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
}
else {
fi = iptr->sx.s23.s3.fmiref->p.field;
fieldtype = fi->type;
- disp = dseg_add_address(cd, &(fi->value));
+ disp = dseg_add_address(cd, fi->value);
if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
- codegen_add_patch_ref(cd, PATCHER_clinit, fi->class, disp);
+ patcher_add_patch_ref(jd, PATCHER_initialize_class,
+ fi->class, disp);
}
M_ALD(REG_ITMP1, REG_PV, disp);
fieldtype = uf->fieldref->parseddesc.fd->type;
disp = dseg_add_unique_address(cd, uf);
- codegen_add_patch_ref(cd, PATCHER_get_putstatic, uf, disp);
+ patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
}
else {
fi = iptr->sx.s23.s3.fmiref->p.field;
fieldtype = fi->type;
- disp = dseg_add_address(cd, &(fi->value));
+ disp = dseg_add_address(cd, fi->value);
if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
- codegen_add_patch_ref(cd, PATCHER_clinit, fi->class, disp);
+ patcher_add_patch_ref(jd, PATCHER_initialize_class,
+ fi->class, disp);
}
M_ALD(REG_ITMP1, REG_PV, disp);
break;
case ICMD_PUTSTATICCONST: /* ... ==> ... */
- /* val = value (in current instruction) */
- /* following NOP) */
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
uf = iptr->sx.s23.s3.uf;
fieldtype = uf->fieldref->parseddesc.fd->type;
disp = dseg_add_unique_address(cd, uf);
- codegen_add_patch_ref(cd, PATCHER_get_putstatic, uf, disp);
+ patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
}
else {
fi = iptr->sx.s23.s3.fmiref->p.field;
fieldtype = fi->type;
- disp = dseg_add_address(cd, &(fi->value));
+ disp = dseg_add_address(cd, fi->value);
if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
- codegen_add_patch_ref(cd, PATCHER_clinit, fi->class, disp);
+ patcher_add_patch_ref(jd, PATCHER_initialize_class,
+ fi->class, disp);
}
M_ALD(REG_ITMP1, REG_PV, disp);
fieldtype = uf->fieldref->parseddesc.fd->type;
disp = 0;
- codegen_add_patch_ref(cd, PATCHER_get_putfield, uf, 0);
+ patcher_add_patch_ref(jd, PATCHER_get_putfield, uf, 0);
}
else {
fi = iptr->sx.s23.s3.fmiref->p.field;
#endif
if (INSTRUCTION_IS_UNRESOLVED(iptr))
- codegen_add_patch_ref(cd, PATCHER_get_putfield, uf, 0);
+ patcher_add_patch_ref(jd, PATCHER_get_putfield, uf, 0);
switch (fieldtype) {
case TYPE_INT:
emit_nullpointer_check(cd, iptr, s1);
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
- unresolved_field *uf = iptr->sx.s23.s3.uf;
-
+ uf = iptr->sx.s23.s3.uf;
fieldtype = uf->fieldref->parseddesc.fd->type;
disp = 0;
- codegen_add_patch_ref(cd, PATCHER_get_putfield, uf, 0);
+ patcher_add_patch_ref(jd, PATCHER_get_putfield, uf, 0);
}
else {
- fieldinfo *fi = iptr->sx.s23.s3.fmiref->p.field;
+ fi = iptr->sx.s23.s3.fmiref->p.field;
fieldtype = fi->type;
disp = fi->offset;
}
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
uc = iptr->sx.s23.s2.uc;
- codegen_add_patch_ref(cd, PATCHER_athrow_areturn, uc, 0);
+ patcher_add_patch_ref(jd, PATCHER_resolve_class, uc, 0);
}
#endif /* ENABLE_VERIFIER */
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
uc = iptr->sx.s23.s2.uc;
- codegen_add_patch_ref(cd, PATCHER_athrow_areturn, uc, 0);
+ patcher_add_patch_ref(jd, PATCHER_resolve_class, uc, 0);
}
#endif /* ENABLE_VERIFIER */
goto nowperformreturn;
}
else {
s1 = emit_load(jd, iptr, var, REG_ITMP1);
- M_LST(s1, REG_SP, d * 8);
+ M_LST(s1, REG_SP, d);
}
#else
if (!md->params[s3].inmemory) {
else {
if (IS_2_WORD_TYPE(var->type)) {
s1 = emit_load(jd, iptr, var, REG_ITMP12_PACKED);
- M_LST(s1, REG_SP, d * 8);
+ M_LST(s1, REG_SP, d);
}
else {
s1 = emit_load(jd, iptr, var, REG_ITMP1);
- M_IST(s1, REG_SP, d * 8);
+ M_IST(s1, REG_SP, d);
}
}
#endif
}
else {
if (!md->params[s3].inmemory) {
-#if SIZEOF_VOID_P == 8
s1 = emit_load(jd, iptr, var, d);
if (IS_2_WORD_TYPE(var->type))
- M_DMOV(s1, d);
+ M_DBLMOVE(s1, d);
else
- M_FMOV(s1, d);
-#else
- if ((s3 == 0) ||
- ((s3 == 1) && IS_FLT_DBL_TYPE(md->paramtypes[0].type))) {
- s1 = emit_load(jd, iptr, var, d);
- if (IS_2_WORD_TYPE(var->type))
- M_DBLMOVE(s1, d);
- else
- M_FLTMOVE(s1, d);
- }
- else {
- if (IS_2_WORD_TYPE(var->type)) {
- s1 = emit_load(jd, iptr, var, REG_FTMP1);
- M_MFC1(GET_LOW_REG(d), s1);
- M_MFC1(GET_HIGH_REG(d), s1 + 1);
- M_NOP;
- }
- else {
- s1 = emit_load(jd, iptr, var, d);
- M_MFC1(d, s1);
- M_NOP;
- }
- }
-#endif
+ M_FLTMOVE(s1, d);
}
else {
s1 = emit_load(jd, iptr, var, REG_FTMP1);
if (IS_2_WORD_TYPE(var->type))
- M_DST(s1, REG_SP, d * 8);
+ M_DST(s1, REG_SP, d);
else
- M_FST(s1, REG_SP, d * 8);
+ M_FST(s1, REG_SP, d);
}
}
}
if (lm == NULL) {
disp = dseg_add_unique_address(cd, um);
- codegen_add_patch_ref(cd, PATCHER_invokestatic_special, um,
+ patcher_add_patch_ref(jd, PATCHER_invokestatic_special, um,
disp);
}
else
emit_nullpointer_check(cd, iptr, REG_A0);
if (lm == NULL) {
- codegen_add_patch_ref(cd, PATCHER_invokevirtual, um, 0);
+ patcher_add_patch_ref(jd, PATCHER_invokevirtual, um, 0);
s1 = 0;
}
sizeof(methodptr) * lm->vftblindex;
/* implicit null-pointer check */
- M_ALD(REG_METHODPTR, REG_A0, OFFSET(java_objectheader, vftbl));
+ M_ALD(REG_METHODPTR, REG_A0, OFFSET(java_object_t, vftbl));
M_ALD(REG_PV, REG_METHODPTR, s1);
/* generate the actual call */
emit_nullpointer_check(cd, iptr, REG_A0);
if (lm == NULL) {
- codegen_add_patch_ref(cd, PATCHER_invokeinterface, um, 0);
+ patcher_add_patch_ref(jd, PATCHER_invokeinterface, um, 0);
s1 = 0;
s2 = 0;
}
/* implicit null-pointer check */
- M_ALD(REG_METHODPTR, REG_A0, OFFSET(java_objectheader, vftbl));
+ M_ALD(REG_METHODPTR, REG_A0, OFFSET(java_object_t, vftbl));
M_ALD(REG_METHODPTR, REG_METHODPTR, s1);
M_ALD(REG_PV, REG_METHODPTR, s2);
cr = iptr->sx.s23.s3.c.ref;
disp = dseg_add_unique_s4(cd, 0); /* super->flags */
- codegen_add_patch_ref(cd, PATCHER_checkcast_instanceof_flags,
+ patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_flags,
cr, disp);
M_ILD(REG_ITMP2, REG_PV, disp);
if (super == NULL) {
cr = iptr->sx.s23.s3.c.ref;
- codegen_add_patch_ref(cd, PATCHER_checkcast_interface,
+ patcher_add_patch_ref(jd, PATCHER_checkcast_interface,
cr, 0);
}
else {
emit_label_beqz(cd, BRANCH_LABEL_3, s1);
}
- M_ALD(REG_ITMP2, s1, OFFSET(java_objectheader, vftbl));
+ M_ALD(REG_ITMP2, s1, OFFSET(java_object_t, vftbl));
M_ILD(REG_ITMP3, REG_ITMP2,
OFFSET(vftbl_t, interfacetablelength));
M_IADD_IMM(REG_ITMP3, -superindex, REG_ITMP3);
cr = iptr->sx.s23.s3.c.ref;
disp = dseg_add_unique_address(cd, NULL);
- codegen_add_patch_ref(cd,
- PATCHER_checkcast_instanceof_class,
+ patcher_add_patch_ref(jd,
+ PATCHER_resolve_classref_to_vftbl,
cr, disp);
}
else {
emit_label_beqz(cd, BRANCH_LABEL_5, s1);
}
- M_ALD(REG_ITMP2, s1, OFFSET(java_objectheader, vftbl));
+ M_ALD(REG_ITMP2, s1, OFFSET(java_object_t, vftbl));
M_ALD(REG_ITMP3, REG_PV, disp);
CODEGEN_CRITICAL_SECTION_START;
cr = iptr->sx.s23.s3.c.ref;
disp = dseg_add_unique_address(cd, NULL);
- codegen_add_patch_ref(cd, PATCHER_builtin_arraycheckcast,
+ patcher_add_patch_ref(jd,
+ PATCHER_resolve_classref_to_classinfo,
cr, disp);
}
- else
+ else {
disp = dseg_add_address(cd, iptr->sx.s23.s3.c.cls);
+ }
M_ALD(REG_A1, REG_PV, disp);
disp = dseg_add_functionptr(cd, BUILTIN_arraycheckcast);
cr = iptr->sx.s23.s3.c.ref;
disp = dseg_add_unique_s4(cd, 0); /* super->flags */
- codegen_add_patch_ref(cd, PATCHER_checkcast_instanceof_flags,
+ patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_flags,
cr, disp);
M_ILD(REG_ITMP3, REG_PV, disp);
if (super == NULL) {
cr = iptr->sx.s23.s3.c.ref;
- codegen_add_patch_ref(cd, PATCHER_instanceof_interface,
+ patcher_add_patch_ref(jd, PATCHER_instanceof_interface,
cr, 0);
}
else {
emit_label_beqz(cd, BRANCH_LABEL_3, s1);
}
- M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
+ M_ALD(REG_ITMP1, s1, OFFSET(java_object_t, vftbl));
M_ILD(REG_ITMP3, REG_ITMP1,
OFFSET(vftbl_t, interfacetablelength));
M_IADD_IMM(REG_ITMP3, -superindex, REG_ITMP3);
cr = iptr->sx.s23.s3.c.ref;
disp = dseg_add_unique_address(cd, NULL);
- codegen_add_patch_ref(cd, PATCHER_checkcast_instanceof_class,
+ patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_vftbl,
cr, disp);
}
else {
emit_label_beqz(cd, BRANCH_LABEL_5, s1);
}
- M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
+ M_ALD(REG_ITMP1, s1, OFFSET(java_object_t, vftbl));
M_ALD(REG_ITMP2, REG_PV, disp);
CODEGEN_CRITICAL_SECTION_START;
cr = iptr->sx.s23.s3.c.ref;
disp = dseg_add_unique_address(cd, NULL);
- codegen_add_patch_ref(cd, PATCHER_builtin_multianewarray,
+ patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_classinfo,
cr, disp);
}
- else
+ else {
disp = dseg_add_address(cd, iptr->sx.s23.s3.c.cls);
+ }
/* a1 = arraydescriptor */
dseg_createlinenumbertable(cd);
- /* generate stubs */
+ /* generate traps */
- emit_patcher_stubs(jd);
- REPLACEMENT_EMIT_STUBS(jd);
+ emit_patcher_traps(jd);
/* everything's ok */
#if !defined(WITH_STATIC_CLASSPATH)
if (f == NULL)
- codegen_add_patch_ref(cd, PATCHER_resolve_native, m, funcdisp);
+ patcher_add_patch_ref(jd, PATCHER_resolve_native_function, m, funcdisp);
#endif
/* save integer and float argument registers */
}
else {
#if SIZEOF_VOID_P == 8
- M_LST(s1, REG_SP, s2 * 8);
+ M_LST(s1, REG_SP, s2);
#else
if (IS_2_WORD_TYPE(t))
- M_LST(s1, REG_SP, s2 * 4);
+ M_LST(s1, REG_SP, s2);
else
- M_IST(s1, REG_SP, s2 * 4);
+ M_IST(s1, REG_SP, s2);
#endif
}
}
else {
- s1 = md->params[i].regoff + cd->stackframesize;
+ s1 = md->params[i].regoff + cd->stackframesize * 8;
s2 = nmd->params[j].regoff;
#if SIZEOF_VOID_P == 8
- M_LLD(REG_ITMP1, REG_SP, s1 * 8);
- M_LST(REG_ITMP1, REG_SP, s2 * 8);
+ M_LLD(REG_ITMP1, REG_SP, s1);
+ M_LST(REG_ITMP1, REG_SP, s2);
#else
if (IS_2_WORD_TYPE(t)) {
- M_LLD(REG_ITMP12_PACKED, REG_SP, s1 * 8);
- M_LST(REG_ITMP12_PACKED, REG_SP, s2 * 4);
+ M_LLD(REG_ITMP12_PACKED, REG_SP, s1);
+ M_LST(REG_ITMP12_PACKED, REG_SP, s2);
}
else {
- M_ILD(REG_ITMP1, REG_SP, s1 * 8);
- M_IST(REG_ITMP1, REG_SP, s2 * 4);
+ M_ILD(REG_ITMP1, REG_SP, s1);
+ M_IST(REG_ITMP1, REG_SP, s2);
}
#endif
}
/* On MIPS32 float arguments for native functions
can never be in float argument registers, since
the first argument is _always_ an integer
- argument (JNIenv) */
+ argument (JNIEnv) */
if (IS_2_WORD_TYPE(t)) {
/* double high/low order is endian
else {
#if SIZEOF_VOID_P == 8
if (IS_2_WORD_TYPE(t))
- M_DST(s1, REG_SP, s2 * 8);
+ M_DST(s1, REG_SP, s2);
else
- M_FST(s1, REG_SP, s2 * 8);
+ M_FST(s1, REG_SP, s2);
#else
/* s1 may have been originally in 2 int registers,
but was moved out by the native function
argument(s), just get low register */
if (IS_2_WORD_TYPE(t))
- M_DST(GET_LOW_REG(s1), REG_SP, s2 * 4);
+ M_DST(GET_LOW_REG(s1), REG_SP, s2);
else
- M_FST(GET_LOW_REG(s1), REG_SP, s2 * 4);
+ M_FST(GET_LOW_REG(s1), REG_SP, s2);
#endif
}
}
else {
- s1 = md->params[i].regoff + cd->stackframesize;
+ s1 = md->params[i].regoff + cd->stackframesize * 8;
s2 = nmd->params[j].regoff;
+#if SIZEOF_VOID_P == 8
+ if (IS_2_WORD_TYPE(t)) {
+ M_DLD(REG_FTMP1, REG_SP, s1);
+ M_DST(REG_FTMP1, REG_SP, s2);
+ }
+ else {
+ M_FLD(REG_FTMP1, REG_SP, s1);
+ M_FST(REG_FTMP1, REG_SP, s2);
+ }
+#else
if (IS_2_WORD_TYPE(t)) {
- M_DLD(REG_FTMP1, REG_SP, s1 * 8);
- M_DST(REG_FTMP1, REG_SP, s2 * 8);
+ M_DLD(REG_FTMP1, REG_SP, s1);
+ M_DST(REG_FTMP1, REG_SP, s2);
}
else {
- M_FLD(REG_FTMP1, REG_SP, s1 * 8);
- M_FST(REG_FTMP1, REG_SP, s2 * 8);
+ M_FLD(REG_FTMP1, REG_SP, s1);
+ M_FST(REG_FTMP1, REG_SP, s2);
}
+#endif
}
}
}
M_JMP(REG_ITMP3); /* jump to asm exception handler */
M_ASUB_IMM(REG_RA, 4, REG_ITMP2_XPC); /* get exception address (DELAY) */
- /* generate patcher stubs */
+ /* Generate patcher traps. */
- emit_patcher_stubs(jd);
+ emit_patcher_traps(jd);
}