This module generates MIPS machine code for a sequence of
intermediate code commands (ICMDs).
- $Id: codegen.c 6041 2006-11-22 18:16:15Z edwin $
+ $Id: codegen.c 6180 2006-12-11 23:29:26Z twisti $
*/
disp = dseg_add_address(cd, &m->class->object.header);
M_ALD(REG_A0, REG_PV, disp);
}
- else
- emit_nullpointer_check(cd, REG_A0);
+ else {
+/* emit_nullpointer_check(cd, iptr, REG_A0); */
+ M_BNEZ(REG_A0, 6);
+ M_NOP;
+
+ M_LUI(REG_ITMP3, 0);
+ M_OR_IMM(REG_ITMP3, 0, REG_ITMP3);
+ codegen_add_nullpointerexception_ref(cd);
+ M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
+ M_JMP(REG_ITMP3);
+ M_NOP;
+ }
disp = dseg_add_functionptr(cd, LOCK_monitor_enter);
M_ALD(REG_ITMP3, REG_PV, disp);
currentline = iptr->line;
}
- MCODECHECK(64); /* an instruction usually needs < 64 words */
+ MCODECHECK(64); /* an instruction usually needs < 64 words */
- switch (iptr->opc) {
+ switch (iptr->opc) {
case ICMD_NOP: /* ... ==> ... */
+ case ICMD_POP: /* ..., value ==> ... */
+ case ICMD_POP2: /* ..., value, value ==> ... */
+ break;
+
+
break;
case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
- emit_nullpointer_check(cd, s1);
+ emit_nullpointer_check(cd, iptr, s1);
break;
/* constant operations ************************************************/
break;
- /* pop/dup/swap operations ********************************************/
-
- /* attention: double and longs are only one entry in CACAO ICMDs */
-
- case ICMD_POP: /* ..., value ==> ... */
- case ICMD_POP2: /* ..., value, value ==> ... */
- break;
-
-
/* integer operations *************************************************/
case ICMD_INEG: /* ..., value ==> ..., - value */
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- emit_arithmetic_check(cd, s2);
+ emit_arithmetic_check(cd, iptr, s2);
M_IDIV(s1, s2);
M_MFLO(d);
M_NOP;
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- emit_arithmetic_check(cd, s2);
+ emit_arithmetic_check(cd, iptr, s2);
M_LDIV(s1, s2);
M_MFLO(d);
M_NOP;
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- emit_arithmetic_check(cd, s2);
+ emit_arithmetic_check(cd, iptr, s2);
M_IDIV(s1, s2);
M_MFHI(d);
M_NOP;
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- emit_arithmetic_check(cd, s2);
+ emit_arithmetic_check(cd, iptr, s2);
M_LDIV(s1, s2);
M_MFHI(d);
M_NOP;
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- emit_nullpointer_check(cd, s1);
+ emit_nullpointer_check(cd, iptr, s1);
M_ILD(d, s1, OFFSET(java_arrayheader, size));
emit_store_dst(jd, iptr, d);
break;
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_AADD(s2, s1, REG_ITMP3);
M_BLDS(d, REG_ITMP3, OFFSET(java_bytearray, data[0]));
emit_store_dst(jd, iptr, d);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_AADD(s2, s1, REG_ITMP3);
M_AADD(s2, REG_ITMP3, REG_ITMP3);
M_SLDU(d, REG_ITMP3, OFFSET(java_chararray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_AADD(s2, s1, REG_ITMP3);
M_AADD(s2, REG_ITMP3, REG_ITMP3);
M_SLDS(d, REG_ITMP3, OFFSET(java_shortarray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, 2, REG_ITMP3);
M_AADD(REG_ITMP3, s1, REG_ITMP3);
M_ILD(d, REG_ITMP3, OFFSET(java_intarray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, 3, REG_ITMP3);
M_AADD(REG_ITMP3, s1, REG_ITMP3);
M_LLD(d, REG_ITMP3, OFFSET(java_longarray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, 2, REG_ITMP3);
M_AADD(REG_ITMP3, s1, REG_ITMP3);
M_FLD(d, REG_ITMP3, OFFSET(java_floatarray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, 3, REG_ITMP3);
M_AADD(REG_ITMP3, s1, REG_ITMP3);
M_DLD(d, REG_ITMP3, OFFSET(java_doublearray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, POINTERSHIFT, REG_ITMP3);
M_AADD(REG_ITMP3, s1, REG_ITMP3);
M_ALD(d, REG_ITMP3, OFFSET(java_objectarray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_AADD(s2, s1, REG_ITMP1);
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
M_BST(s3, REG_ITMP1, OFFSET(java_bytearray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_AADD(s2, s1, REG_ITMP1);
M_AADD(s2, REG_ITMP1, REG_ITMP1);
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)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, 2, REG_ITMP2);
M_AADD(REG_ITMP2, s1, REG_ITMP1);
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)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, 3, REG_ITMP2);
M_AADD(REG_ITMP2, s1, REG_ITMP1);
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)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, 2, REG_ITMP2);
M_AADD(REG_ITMP2, s1, REG_ITMP1);
s3 = emit_load_s3(jd, iptr, REG_FTMP1);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, 3, REG_ITMP2);
M_AADD(REG_ITMP2, s1, REG_ITMP1);
s3 = emit_load_s3(jd, iptr, REG_FTMP1);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
M_MOV(s1, REG_A0);
/* M_BEQZ(REG_RESULT, 0); */
/* codegen_add_arraystoreexception_ref(cd); */
/* M_NOP; */
- emit_arraystore_check(cd, REG_RESULT);
+ emit_arraystore_check(cd, iptr, REG_RESULT);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_AADD(s2, s1, REG_ITMP1);
M_BST(REG_ZERO, REG_ITMP1, OFFSET(java_bytearray, data[0]));
break;
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_AADD(s2, s1, REG_ITMP1);
M_AADD(s2, REG_ITMP1, REG_ITMP1);
M_SST(REG_ZERO, REG_ITMP1, OFFSET(java_chararray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, 2, REG_ITMP2);
M_AADD(REG_ITMP2, s1, REG_ITMP1);
M_IST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_intarray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, 3, REG_ITMP2);
M_AADD(REG_ITMP2, s1, REG_ITMP1);
M_LST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_longarray, data[0]));
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_nullpointer_check(cd, s1);
- emit_arrayindexoutofbounds_check(cd, s1, s2);
- }
+ emit_array_checks(cd, iptr, s1, s2);
M_ASLL_IMM(s2, POINTERSHIFT, REG_ITMP2);
M_AADD(REG_ITMP2, s1, REG_ITMP1);
M_AST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_objectarray, data[0]));
case ICMD_GETFIELD: /* ... ==> ..., value */
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
- emit_nullpointer_check(cd, s1);
+ emit_nullpointer_check(cd, iptr, s1);
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
uf = iptr->sx.s23.s3.uf;
case ICMD_PUTFIELD: /* ..., objectref, value ==> ... */
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
- emit_nullpointer_check(cd, s1);
+ emit_nullpointer_check(cd, iptr, s1);
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
uf = iptr->sx.s23.s3.uf;
case ICMD_PUTFIELDCONST: /* ..., objectref ==> ... */
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
- emit_nullpointer_check(cd, s1);
+ emit_nullpointer_check(cd, iptr, s1);
if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
unresolved_field *uf = iptr->sx.s23.s3.uf;
break;
case ICMD_INVOKEVIRTUAL:
- emit_nullpointer_check(cd, REG_A0);
+ emit_nullpointer_check(cd, iptr, REG_A0);
if (lm == NULL) {
codegen_add_patch_ref(cd, PATCHER_invokevirtual, um, 0);
break;
case ICMD_INVOKEINTERFACE:
- emit_nullpointer_check(cd, REG_A0);
+ emit_nullpointer_check(cd, iptr, REG_A0);
if (lm == NULL) {
codegen_add_patch_ref(cd, PATCHER_invokeinterface, um, 0);
/* actually only used for ICMD_BUILTIN */
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- emit_exception_check(cd);
- }
+ emit_exception_check(cd, iptr);
/* store return value */
M_ILD(REG_ITMP3, REG_ITMP2,
OFFSET(vftbl_t, interfacetablelength));
M_IADD_IMM(REG_ITMP3, -superindex, REG_ITMP3);
- emit_classcast_check(cd, ICMD_IFLE, REG_ITMP3, s1);
+ emit_classcast_check(cd, iptr, ICMD_IFLE, REG_ITMP3, s1);
M_ALD(REG_ITMP3, REG_ITMP2,
OFFSET(vftbl_t, interfacetable[0]) -
superindex * sizeof(methodptr*));
- emit_classcast_check(cd, ICMD_IFEQ, REG_ITMP3, s1);
+ emit_classcast_check(cd, iptr, ICMD_IFEQ, REG_ITMP3, s1);
if (super == NULL) {
M_BR(1 + s3);
#endif
/* } */
M_CMPULT(REG_ITMP3, REG_ITMP2, REG_ITMP3);
- emit_classcast_check(cd, ICMD_IFNE, REG_ITMP3, s1);
+ emit_classcast_check(cd, iptr, ICMD_IFNE, REG_ITMP3, s1);
}
d = codegen_reg_of_dst(jd, iptr, s1);
M_NOP;
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
- emit_classcast_check(cd, ICMD_IFEQ, REG_RESULT, s1);
+ emit_classcast_check(cd, iptr, ICMD_IFEQ, REG_RESULT, s1);
d = codegen_reg_of_dst(jd, iptr, s1);
}
/* check for exception before result assignment */
- emit_exception_check(cd);
+ emit_exception_check(cd, iptr);
d = codegen_reg_of_dst(jd, iptr, REG_RESULT);
M_INTMOVE(REG_RESULT, d);
*******************************************************************************/
-void emit_arithmetic_check(codegendata *cd, s4 reg)
+void emit_arithmetic_check(codegendata *cd, instruction *iptr, s4 reg)
{
+ if (INSTRUCTION_MUST_CHECK(iptr)) {
#if 0
- M_BEQZ(reg, 0);
- codegen_add_arithmeticexception_ref(cd);
- M_NOP;
+ M_BEQZ(reg, 0);
+ codegen_add_arithmeticexception_ref(cd);
+ M_NOP;
#else
- M_BNEZ(reg, 6);
- M_NOP;
+ M_BNEZ(reg, 6);
+ M_NOP;
- M_LUI(REG_ITMP3, 0);
- M_OR_IMM(REG_ITMP3, 0, REG_ITMP3);
- codegen_add_arithmeticexception_ref(cd);
- M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
- M_JMP(REG_ITMP3);
- M_NOP;
+ M_LUI(REG_ITMP3, 0);
+ M_OR_IMM(REG_ITMP3, 0, REG_ITMP3);
+ codegen_add_arithmeticexception_ref(cd);
+ M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
+ M_JMP(REG_ITMP3);
+ M_NOP;
#endif
+ }
}
*******************************************************************************/
-void emit_arrayindexoutofbounds_check(codegendata *cd, s4 s1, s4 s2)
+void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2)
{
- if (checkbounds) {
+ if (INSTRUCTION_MUST_CHECK(iptr)) {
M_ILD(REG_ITMP3, s1, OFFSET(java_arrayheader, size));
M_CMPULT(s2, REG_ITMP3, REG_ITMP3);
*******************************************************************************/
-void emit_arraystore_check(codegendata *cd, s4 reg)
+void emit_arraystore_check(codegendata *cd, instruction *iptr, s4 reg)
{
+ if (INSTRUCTION_MUST_CHECK(iptr)) {
#if 0
- M_BEQZ(reg, 0);
- codegen_add_arraystoreexception_ref(cd);
- M_NOP;
+ M_BEQZ(reg, 0);
+ codegen_add_arraystoreexception_ref(cd);
+ M_NOP;
#else
- M_BNEZ(reg, 6);
- M_NOP;
+ M_BNEZ(reg, 6);
+ M_NOP;
- M_LUI(REG_ITMP3, 0);
- M_OR_IMM(REG_ITMP3, 0, REG_ITMP3);
- codegen_add_arraystoreexception_ref(cd);
- M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
- M_JMP(REG_ITMP3);
- M_NOP;
+ M_LUI(REG_ITMP3, 0);
+ M_OR_IMM(REG_ITMP3, 0, REG_ITMP3);
+ codegen_add_arraystoreexception_ref(cd);
+ M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
+ M_JMP(REG_ITMP3);
+ M_NOP;
#endif
+ }
}
*******************************************************************************/
-void emit_classcast_check(codegendata *cd, s4 condition, s4 reg, s4 s1)
+void emit_classcast_check(codegendata *cd, instruction *iptr, s4 condition, s4 reg, s4 s1)
{
+ if (INSTRUCTION_MUST_CHECK(iptr)) {
#if 0
- M_BNEZ(reg, 0);
- codegen_add_classcastexception_ref(cd, s1);
- M_NOP;
+ M_BNEZ(reg, 0);
+ codegen_add_classcastexception_ref(cd, s1);
+ M_NOP;
#else
- switch (condition) {
- case ICMD_IFEQ:
- M_BNEZ(reg, 6);
- break;
+ switch (condition) {
+ case ICMD_IFEQ:
+ M_BNEZ(reg, 6);
+ break;
- case ICMD_IFNE:
- M_BEQZ(reg, 6);
- break;
+ case ICMD_IFNE:
+ M_BEQZ(reg, 6);
+ break;
- case ICMD_IFLE:
- M_BGTZ(reg, 6);
- break;
+ case ICMD_IFLE:
+ M_BGTZ(reg, 6);
+ break;
- default:
- vm_abort("emit_classcast_check: condition %d not found", condition);
- }
+ default:
+ vm_abort("emit_classcast_check: condition %d not found", condition);
+ }
- M_NOP;
+ M_NOP;
- M_LUI(REG_ITMP3, 0);
- M_OR_IMM(REG_ITMP3, 0, REG_ITMP3);
- codegen_add_classcastexception_ref(cd, s1);
- M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
- M_JMP(REG_ITMP3);
- M_NOP;
+ M_LUI(REG_ITMP3, 0);
+ M_OR_IMM(REG_ITMP3, 0, REG_ITMP3);
+ codegen_add_classcastexception_ref(cd, s1);
+ M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
+ M_JMP(REG_ITMP3);
+ M_NOP;
#endif
+ }
}
*******************************************************************************/
-void emit_nullpointer_check(codegendata *cd, s4 reg)
+void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 reg)
{
- if (checknull) {
+ if (INSTRUCTION_MUST_CHECK(iptr)) {
#if 0
M_BEQZ(reg, 0);
codegen_add_nullpointerexception_ref(cd);
*******************************************************************************/
-void emit_exception_check(codegendata *cd)
+void emit_exception_check(codegendata *cd, instruction *iptr)
{
+ if (INSTRUCTION_MUST_CHECK(iptr)) {
#if 0
- M_BEQZ(REG_RESULT, 0);
- codegen_add_fillinstacktrace_ref(cd);
- M_NOP;
+ M_BEQZ(REG_RESULT, 0);
+ codegen_add_fillinstacktrace_ref(cd);
+ M_NOP;
#else
- M_BNEZ(REG_RESULT, 6);
- M_NOP;
+ M_BNEZ(REG_RESULT, 6);
+ M_NOP;
- M_LUI(REG_ITMP3, 0);
- M_OR_IMM(REG_ITMP3, 0, REG_ITMP3);
- codegen_add_fillinstacktrace_ref(cd);
- M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
- M_JMP(REG_ITMP3);
- M_NOP;
+ M_LUI(REG_ITMP3, 0);
+ M_OR_IMM(REG_ITMP3, 0, REG_ITMP3);
+ codegen_add_fillinstacktrace_ref(cd);
+ M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
+ M_JMP(REG_ITMP3);
+ M_NOP;
#endif
+ }
}
u1 *tmpmcodeptr;
s4 targetdisp;
s4 disp;
- s4 hi;
- s4 lo;
/* get required compiler data */
disp = ((u4 *) savedmcodeptr) - (((u4 *) tmpmcodeptr) + 1);
- if ((disp < (s4) 0xffff8000) || (disp > (s4) 0x00007fff)) {
+/* if ((disp < (s4) 0xffff8000) || (disp > (s4) 0x00007fff)) { */
/* Recalculate the displacement to be relative to PV. */
disp = savedmcodeptr - cd->mcodebase;
- lo = (short) disp;
- hi = (short) ((disp - lo) >> 16);
-
- M_LUI(REG_ITMP3, hi);
- M_OR_IMM(REG_ITMP3, lo, REG_ITMP3);
+ M_LUI(REG_ITMP3, disp >> 16);
+ M_OR_IMM(REG_ITMP3, disp, REG_ITMP3);
M_AADD(REG_PV, REG_ITMP3, REG_ITMP3);
M_JMP(REG_ITMP3);
M_NOP;
- }
- else {
- M_BR(disp);
- M_NOP;
- M_NOP;
- M_NOP;
- M_NOP;
- }
+/* } */
+/* else { */
+/* M_BR(disp); */
+/* M_NOP; */
+/* M_NOP; */
+/* M_NOP; */
+/* M_NOP; */
+/* } */
cd->mcodeptr = savedmcodeptr; /* restore the current mcodeptr */