Authors: Andreas Krall
Reinhard Grafl
-
- Changes: Joseph Wenninger
+ Joseph Wenninger
Christian Thalinger
Christian Ullrich
Edwin Steiner
- $Id: codegen.c 5949 2006-11-11 17:05:19Z twisti $
+ $Id: codegen.c 5951 2006-11-11 18:31:10Z twisti $
*/
codegen_add_patch_ref(cd, PATCHER_resolve_classref_to_classinfo,
cr, disp);
- if (opt_showdisassemble)
- M_NOP;
-
M_ALD(d, REG_PV, disp);
}
else {
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
M_ILD(d, s1, OFFSET(java_arrayheader, size));
emit_store_dst(jd, iptr, d);
break;
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
if (has_ext_instr_set) {
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
if (has_ext_instr_set) {
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
if (has_ext_instr_set) {
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
M_S4ADDQ(s2, s1, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
M_S8ADDQ(s2, s1, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
M_S4ADDQ(s2, s1, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
M_S8ADDQ(s2, s1, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
M_SAADDQ(s2, s1, REG_ITMP1);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
s3 = emit_load_s3(jd, iptr, REG_FTMP3);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
s3 = emit_load_s3(jd, iptr, REG_FTMP3);
s1 = emit_load_s1(jd, iptr, REG_A0);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
s3 = emit_load_s3(jd, iptr, REG_A1);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
M_S4ADDQ(s2, s1, REG_ITMP1);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
M_S8ADDQ(s2, s1, REG_ITMP1);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
M_SAADDQ(s2, s1, REG_ITMP1);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
if (has_ext_instr_set) {
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
if (has_ext_instr_set) {
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
gen_bound_check;
}
if (has_ext_instr_set) {
case ICMD_GETSTATIC: /* ... ==> ..., value */
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
- uf = iptr->sx.s23.s3.uf;
-
+ uf = iptr->sx.s23.s3.uf;
fieldtype = uf->fieldref->parseddesc.fd->type;
-
- disp = dseg_add_unique_address(cd, uf);
+ disp = dseg_add_unique_address(cd, uf);
codegen_add_patch_ref(cd, PATCHER_get_putstatic, uf, disp);
-
- if (opt_showdisassemble)
- M_NOP;
}
else {
- fi = iptr->sx.s23.s3.fmiref->p.field;
-
+ 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)) {
+ if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
codegen_add_patch_ref(cd, PATCHER_initialize_class, fi->class,
0);
-
- if (opt_showdisassemble)
- M_NOP;
- }
}
M_ALD(REG_ITMP1, REG_PV, disp);
case ICMD_PUTSTATIC: /* ..., value ==> ... */
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
- uf = iptr->sx.s23.s3.uf;
-
+ uf = iptr->sx.s23.s3.uf;
fieldtype = uf->fieldref->parseddesc.fd->type;
-
- disp = dseg_add_unique_address(cd, uf);
+ disp = dseg_add_unique_address(cd, uf);
codegen_add_patch_ref(cd, PATCHER_get_putstatic, uf, disp);
-
- if (opt_showdisassemble)
- M_NOP;
}
else {
- fi = iptr->sx.s23.s3.fmiref->p.field;
-
+ 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)) {
+ if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
codegen_add_patch_ref(cd, PATCHER_initialize_class, fi->class,
0);
-
- if (opt_showdisassemble)
- M_NOP;
- }
}
M_ALD(REG_ITMP1, REG_PV, disp);
/* following NOP) */
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
- uf = iptr->sx.s23.s3.uf;
-
+ uf = iptr->sx.s23.s3.uf;
fieldtype = uf->fieldref->parseddesc.fd->type;
-
- disp = dseg_add_unique_address(cd, uf);
+ disp = dseg_add_unique_address(cd, uf);
codegen_add_patch_ref(cd, PATCHER_get_putstatic, uf, disp);
-
- if (opt_showdisassemble)
- M_NOP;
}
else {
- fi = iptr->sx.s23.s3.fmiref->p.field;
-
+ 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)) {
+ if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
codegen_add_patch_ref(cd, PATCHER_initialize_class, fi->class,
0);
-
- if (opt_showdisassemble)
- M_NOP;
- }
}
M_ALD(REG_ITMP1, REG_PV, disp);
case ICMD_GETFIELD: /* ... ==> ..., value */
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
- 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);
-
- if (opt_showdisassemble)
- M_NOP;
-
- disp = 0;
}
else {
- fi = iptr->sx.s23.s3.fmiref->p.field;
-
+ fi = iptr->sx.s23.s3.fmiref->p.field;
fieldtype = fi->type;
- disp = fi->offset;
+ disp = fi->offset;
}
switch (fieldtype) {
case ICMD_PUTFIELD: /* ..., objectref, value ==> ... */
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
uf = iptr->sx.s23.s3.uf;
else
s2 = emit_load_s2(jd, iptr, REG_FTMP2);
- if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
+ if (INSTRUCTION_IS_UNRESOLVED(iptr))
codegen_add_patch_ref(cd, PATCHER_get_putfield, uf, 0);
- if (opt_showdisassemble)
- M_NOP;
- }
-
switch (fieldtype) {
case TYPE_INT:
M_IST(s2, s1, disp);
/* following NOP) */
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
- gen_nullptr_check(s1);
+ emit_nullpointer_check(cd, s1);
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
- 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);
-
- if (opt_showdisassemble)
- M_NOP;
-
- disp = 0;
}
else {
- fi = iptr->sx.s23.s3.fmiref->p.field;
-
+ fi = iptr->sx.s23.s3.fmiref->p.field;
fieldtype = fi->type;
- disp = fi->offset;
+ disp = fi->offset;
}
switch (fieldtype) {
unresolved_class *uc = iptr->sx.s23.s2.uc;
codegen_add_patch_ref(cd, PATCHER_resolve_class, uc, 0);
-
- if (opt_showdisassemble)
- M_NOP;
}
#endif /* ENABLE_VERIFIER */
unresolved_class *uc = iptr->sx.s23.s2.uc;
codegen_add_patch_ref(cd, PATCHER_resolve_class, uc, 0);
-
- if (opt_showdisassemble)
- M_NOP;
}
#endif /* ENABLE_VERIFIER */
goto nowperformreturn;
codegen_add_patch_ref(cd, PATCHER_invokestatic_special,
um, disp);
-
- if (opt_showdisassemble)
- M_NOP;
}
else
disp = dseg_add_address(cd, lm->stubroutine);
break;
case ICMD_INVOKEVIRTUAL:
- gen_nullptr_check(REG_A0);
+ emit_nullpointer_check(cd, REG_A0);
if (lm == NULL) {
codegen_add_patch_ref(cd, PATCHER_invokevirtual, um, 0);
- if (opt_showdisassemble)
- M_NOP;
-
s1 = 0;
}
else
break;
case ICMD_INVOKEINTERFACE:
- gen_nullptr_check(REG_A0);
+ emit_nullpointer_check(cd, REG_A0);
if (lm == NULL) {
codegen_add_patch_ref(cd, PATCHER_invokeinterface, um, 0);
- if (opt_showdisassemble)
- M_NOP;
-
s1 = 0;
s2 = 0;
}
s2 = 6;
if (super == NULL)
- s2 += opt_showdisassemble ? 1 : 0;
+ s2 += opt_shownops ? 1 : 0;
/* calculate class checkcast code size */
s3 = 9 /* 8 + (s1 == REG_ITMP1) */;
if (super == NULL)
- s3 += opt_showdisassemble ? 1 : 0;
+ s3 += opt_shownops ? 1 : 0;
/* if class is not resolved, check which code to call */
if (super == NULL) {
- M_BEQZ(s1, 4 + (opt_showdisassemble ? 1 : 0) + s2 + 1 + s3);
+ M_BEQZ(s1, 4 + (opt_shownops ? 1 : 0) + s2 + 1 + s3);
disp = dseg_add_unique_s4(cd, 0); /* super->flags */
iptr->sx.s23.s3.c.ref,
disp);
- if (opt_showdisassemble)
- M_NOP;
-
M_ILD(REG_ITMP2, REG_PV, disp);
disp = dseg_add_s4(cd, ACC_INTERFACE);
M_ILD(REG_ITMP3, REG_PV, disp);
PATCHER_checkcast_instanceof_interface,
iptr->sx.s23.s3.c.ref,
0);
-
- if (opt_showdisassemble)
- M_NOP;
}
else
M_BEQZ(s1, s2);
PATCHER_resolve_classref_to_vftbl,
iptr->sx.s23.s3.c.ref,
disp);
-
- if (opt_showdisassemble)
- M_NOP;
}
else {
disp = dseg_add_address(cd, supervftbl);
PATCHER_resolve_classref_to_classinfo,
iptr->sx.s23.s3.c.ref,
disp);
-
- if (opt_showdisassemble)
- M_NOP;
}
M_ALD(REG_A1, REG_PV, disp);
s2 = 6;
if (super == NULL)
- s2 += (d == REG_ITMP2 ? 1 : 0) + (opt_showdisassemble ? 1 : 0);
+ s2 += (d == REG_ITMP2 ? 1 : 0) + (opt_shownops ? 1 : 0);
/* calculate class instanceof code size */
s3 = 7;
if (super == NULL)
- s3 += (opt_showdisassemble ? 1 : 0);
+ s3 += (opt_shownops ? 1 : 0);
/* if class is not resolved, check which code to call */
if (super == NULL) {
M_CLR(d);
- M_BEQZ(s1, 4 + (opt_showdisassemble ? 1 : 0) + s2 + 1 + s3);
+ M_BEQZ(s1, 4 + (opt_shownops ? 1 : 0) + s2 + 1 + s3);
disp = dseg_add_unique_s4(cd, 0); /* super->flags */
codegen_add_patch_ref(cd, PATCHER_resolve_classref_to_flags,
iptr->sx.s23.s3.c.ref, disp);
- if (opt_showdisassemble)
- M_NOP;
-
M_ILD(REG_ITMP3, REG_PV, disp);
disp = dseg_add_s4(cd, ACC_INTERFACE);
codegen_add_patch_ref(cd,
PATCHER_checkcast_instanceof_interface,
iptr->sx.s23.s3.c.ref, 0);
-
- if (opt_showdisassemble)
- M_NOP;
}
else {
M_CLR(d);
codegen_add_patch_ref(cd, PATCHER_resolve_classref_to_vftbl,
iptr->sx.s23.s3.c.ref,
disp);
-
- if (opt_showdisassemble)
- M_NOP;
}
else {
disp = dseg_add_address(cd, supervftbl);
codegen_add_patch_ref(cd, PATCHER_resolve_classref_to_classinfo,
iptr->sx.s23.s3.c.ref,
disp);
-
- if (opt_showdisassemble)
- M_NOP;
}
else
disp = dseg_add_address(cd, iptr->sx.s23.s3.c.cls);
funcdisp = dseg_add_functionptr(cd, f);
#if !defined(WITH_STATIC_CLASSPATH)
- if (f == NULL) {
+ if (f == NULL)
codegen_add_patch_ref(cd, PATCHER_resolve_native_function, m, funcdisp);
-
- if (opt_showdisassemble)
- M_NOP;
- }
#endif
/* save integer and float argument registers */