* src/vm/jit/mips/mips/emit.c (emit_arithmetic_check): Added iptr and
authortwisti <none@none>
Mon, 11 Dec 2006 23:29:26 +0000 (23:29 +0000)
committertwisti <none@none>
Mon, 11 Dec 2006 23:29:26 +0000 (23:29 +0000)
check INSTRUCTION_MUST_CHECK.
(emit_arrayindexoutofbounds_check): Likewise.
(emit_arraystore_check): Likewise.
(emit_classcast_check): Likewise.
(emit_nullpointer_check): Likewise.
(emit_exception_check): Likewise.
(emit_patcher_stubs): Likewise.

* src/vm/jit/mips/mips/md.c (vm/exceptions.h): Added.

* src/vm/jit/mips/mips/codegen.c (codegen): Pass iptr to
exception-emit functions.

* src/vm/jit/mips/mips/irix/md-os.c (vm/jit/codegen-common.h): Added.
(md_signal_handler_sigsegv): Call codegen_get_pv_from_pc in
error-case.

src/vm/jit/mips/codegen.c
src/vm/jit/mips/emit.c
src/vm/jit/mips/irix/md-os.c
src/vm/jit/mips/md.c

index 68949aadacb60d1bf1a7f3e6094c505cc47fbf47..233e68a500c5c95e3d9546e9f76d8699ac1746bb 100644 (file)
@@ -34,7 +34,7 @@
    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 $
 
 */
 
@@ -290,8 +290,18 @@ bool codegen(jitdata *jd)
                        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);
@@ -402,17 +412,22 @@ bool codegen(jitdata *jd)
                                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 ************************************************/
@@ -494,15 +509,6 @@ bool codegen(jitdata *jd)
                        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                 */
@@ -712,7 +718,7 @@ bool codegen(jitdata *jd)
                        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;
@@ -725,7 +731,7 @@ bool codegen(jitdata *jd)
                        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;
@@ -738,7 +744,7 @@ bool codegen(jitdata *jd)
                        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;
@@ -751,7 +757,7 @@ bool codegen(jitdata *jd)
                        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;
@@ -1329,7 +1335,7 @@ bool codegen(jitdata *jd)
 
                        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;
@@ -1339,10 +1345,7 @@ bool codegen(jitdata *jd)
                        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);
@@ -1353,10 +1356,7 @@ bool codegen(jitdata *jd)
                        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]));
@@ -1368,10 +1368,7 @@ bool codegen(jitdata *jd)
                        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]));
@@ -1383,10 +1380,7 @@ bool codegen(jitdata *jd)
                        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]));
@@ -1398,10 +1392,7 @@ bool codegen(jitdata *jd)
                        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]));
@@ -1413,10 +1404,7 @@ bool codegen(jitdata *jd)
                        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]));
@@ -1428,10 +1416,7 @@ bool codegen(jitdata *jd)
                        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]));
@@ -1443,10 +1428,7 @@ bool codegen(jitdata *jd)
                        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]));
@@ -1458,10 +1440,7 @@ bool codegen(jitdata *jd)
 
                        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]));
@@ -1472,10 +1451,7 @@ bool codegen(jitdata *jd)
 
                        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);
@@ -1486,10 +1462,7 @@ bool codegen(jitdata *jd)
 
                        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);
@@ -1500,10 +1473,7 @@ bool codegen(jitdata *jd)
 
                        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);
@@ -1514,10 +1484,7 @@ bool codegen(jitdata *jd)
 
                        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);
@@ -1528,10 +1495,7 @@ bool codegen(jitdata *jd)
 
                        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);
@@ -1543,10 +1507,7 @@ bool codegen(jitdata *jd)
 
                        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);
@@ -1559,7 +1520,7 @@ bool codegen(jitdata *jd)
 /*                     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);
@@ -1574,10 +1535,7 @@ bool codegen(jitdata *jd)
 
                        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;
@@ -1587,10 +1545,7 @@ bool codegen(jitdata *jd)
 
                        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]));
@@ -1600,10 +1555,7 @@ bool codegen(jitdata *jd)
 
                        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]));
@@ -1613,10 +1565,7 @@ bool codegen(jitdata *jd)
 
                        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]));
@@ -1626,10 +1575,7 @@ bool codegen(jitdata *jd)
 
                        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]));
@@ -1770,7 +1716,7 @@ bool codegen(jitdata *jd)
                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;
@@ -1813,7 +1759,7 @@ bool codegen(jitdata *jd)
                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;
@@ -1856,7 +1802,7 @@ bool codegen(jitdata *jd)
                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;
@@ -2551,7 +2497,7 @@ gen_method:
                                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);
@@ -2568,7 +2514,7 @@ gen_method:
                                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);
@@ -2599,9 +2545,7 @@ gen_method:
 
                        /* actually only used for ICMD_BUILTIN */
 
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               emit_exception_check(cd);
-                       }
+                       emit_exception_check(cd, iptr);
 
                        /* store return value */
 
@@ -2710,12 +2654,12 @@ gen_method:
                                        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);
@@ -2764,7 +2708,7 @@ gen_method:
 #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);
@@ -2790,7 +2734,7 @@ gen_method:
                                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);
                        }
@@ -2990,7 +2934,7 @@ gen_method:
 
                        /* 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);
index 7f1215d699d7441f503ca715b17d19c6b232e8c9..1f64afe1f658754f6e98b8ff443acd04d22d0472 100644 (file)
@@ -223,23 +223,25 @@ void emit_lconst(codegendata *cd, s4 d, s8 value)
 
 *******************************************************************************/
 
-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
+       }
 }
 
 
@@ -249,9 +251,9 @@ void emit_arithmetic_check(codegendata *cd, s4 reg)
 
 *******************************************************************************/
 
-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);
 
@@ -280,23 +282,25 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, s4 s1, s4 s2)
 
 *******************************************************************************/
 
-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
+       }
 }
 
 
@@ -306,39 +310,41 @@ void emit_arraystore_check(codegendata *cd, s4 reg)
 
 *******************************************************************************/
 
-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
+       }
 }
 
 
@@ -348,9 +354,9 @@ void emit_classcast_check(codegendata *cd, s4 condition, s4 reg, s4 s1)
 
 *******************************************************************************/
 
-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);
@@ -376,23 +382,25 @@ void emit_nullpointer_check(codegendata *cd, s4 reg)
 
 *******************************************************************************/
 
-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
+       }
 }
 
 
@@ -508,8 +516,6 @@ void emit_patcher_stubs(jitdata *jd)
        u1          *tmpmcodeptr;
        s4           targetdisp;
        s4           disp;
-       s4           hi;
-       s4           lo;
 
        /* get required compiler data */
 
@@ -550,27 +556,24 @@ void emit_patcher_stubs(jitdata *jd)
 
                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   */
 
index 9b3ecfdba2faf3d4a3fd47ffa8d5f758e9d76cce..dfdd500f9c0da9e16342ca95660e55a8337f33da 100644 (file)
 
    Authors: Andreas Krall
             Reinhard Grafl
+            Christian Thalinger
 
-   Changes: Christian Thalinger
-
-   $Id: md-os.c 5900 2006-11-04 17:30:44Z michi $
+   $Id: md-os.c 6180 2006-12-11 23:29:26Z twisti $
 
 */
 
@@ -50,6 +49,7 @@
 #include "vm/signallocal.h"
 #include "vm/stringlocal.h"
 #include "vm/jit/asmpart.h"
+#include "vm/jit/codegen-common.h"
 #include "vm/jit/stacktrace.h"
 
 
@@ -101,27 +101,27 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        _uc = (struct ucontext *) _p;
        _mc = &_uc->uc_mcontext;
 
+       pv  = (u1 *) _mc->gregs[REG_PV];
+       sp  = (u1 *) _mc->gregs[REG_SP];
+       ra  = (u1 *) _mc->gregs[REG_RA];             /* this is correct for leafs */
+       xpc = (u1 *) _mc->gregs[CTX_EPC];
+
        instr = *((u4 *) (_mc->gregs[CTX_EPC]));
        addr = _mc->gregs[(instr >> 21) & 0x1f];
 
        if (addr == 0) {
-               pv  = (u1 *) _mc->gregs[REG_PV];
-               sp  = (u1 *) _mc->gregs[REG_SP];
-               ra  = (u1 *) _mc->gregs[REG_RA];         /* this is correct for leafs */
-               xpc = (u1 *) _mc->gregs[CTX_EPC];
-
                _mc->gregs[REG_ITMP1_XPTR] =
                        (ptrint) stacktrace_hardware_nullpointerexception(pv, sp, ra, xpc);
 
                _mc->gregs[REG_ITMP2_XPC] = (ptrint) xpc;
                _mc->gregs[CTX_EPC] = (ptrint) asm_handle_exception;
+       }
+       else {
+               codegen_get_pv_from_pc(xpc);
 
-       } else {
-        addr += (long) ((instr << 16) >> 16);
+               /* this should not happen */
 
-               throw_cacao_exception_exit(string_java_lang_InternalError,
-                                                                  "faulting address: 0x%lx at 0x%lx\n",
-                                                                  addr, _mc->gregs[CTX_EPC]);
+               assert(0);
        }
 }
 
index 38814713fdddbcee62df19521d778bff38c37387..e9eed202b16e4c7dce53574fd7f61013ba7f46ef 100644 (file)
    Contact: cacao@cacaojvm.org
 
    Authors: Christian Thalinger
+            Edwin Steiner
 
-   Changes: Edwin Steiner
-
-   $Id: md.c 6142 2006-12-07 23:02:52Z edwin $
+   $Id: md.c 6180 2006-12-11 23:29:26Z twisti $
 
 */
 
@@ -42,6 +41,7 @@
 #include "vm/types.h"
 
 #include "toolbox/logging.h"
+#include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/vm.h"
 #include "vm/jit/stacktrace.h"