* src/vm/builtin.c (builtin_canstore): Throw an ArrayStoreException.
authorMichael Starzinger <michi@complang.tuwien.ac.at>
Mon, 3 Sep 2007 13:15:14 +0000 (15:15 +0200)
committerMichael Starzinger <michi@complang.tuwien.ac.at>
Mon, 3 Sep 2007 13:15:14 +0000 (15:15 +0200)
(builtin_fast_canstore): Do not throw any exceptions.

* src/vm/builtin.h (BUILTIN_canstore): Removed.

* src/vm/builtintable.inc: Adapted entry for builtin_canstore.

* src/vm/exceptions.h (EXCEPTION_HARDWARE_ARRAYSTORE): Added.

* src/vm/signal.c (signal_handle): Added case for ArrayStoreException.

* src/vm/jit/emit-common.h (emit_arraystore_check): Added prototype.

* src/vm/jit/stack.c (stack_analyse): ICMD_AASTORE now uses fast canstore.

* src/vm/jit/alpha/codegen.c (codegen_emit): ICMD_AASTORE uses fast canstore.
* src/vm/jit/alpha/emit.c (emit_arraystore_check): Implemented.

* src/vm/jit/arm/codegen.c: Likewise.
* src/vm/jit/arm/emit.c: Likewise.
* src/vm/jit/i386/codegen.c: Likewise.
* src/vm/jit/i386/emit.c: Likewise.
* src/vm/jit/m68k/codegen.c: Likewise.
* src/vm/jit/m68k/emit.c: Likewise.
* src/vm/jit/mips/codegen.c: Likewise.
* src/vm/jit/mips/emit.c: Likewise.
* src/vm/jit/powerpc/codegen.c: Likewise.
* src/vm/jit/powerpc/emit.c: Likewise.
* src/vm/jit/powerpc64/codegen.c: Likewise.
* src/vm/jit/powerpc64/emit.c: Likewise.
* src/vm/jit/s390/codegen.c: Likewise.
* src/vm/jit/s390/emit.c: Likewise.
* src/vm/jit/sparc64/codegen.c: Likewise.
* src/vm/jit/sparc64/emit.c: Likewise.
* src/vm/jit/x86_64/codegen.c: Likewise.
* src/vm/jit/x86_64/emit.c: Likewise.

27 files changed:
src/vm/builtin.c
src/vm/builtin.h
src/vm/builtintable.inc
src/vm/exceptions.h
src/vm/jit/alpha/codegen.c
src/vm/jit/alpha/emit.c
src/vm/jit/arm/codegen.c
src/vm/jit/arm/emit.c
src/vm/jit/emit-common.h
src/vm/jit/i386/codegen.c
src/vm/jit/i386/emit.c
src/vm/jit/m68k/codegen.c
src/vm/jit/m68k/emit.c
src/vm/jit/mips/codegen.c
src/vm/jit/mips/emit.c
src/vm/jit/powerpc/codegen.c
src/vm/jit/powerpc/emit.c
src/vm/jit/powerpc64/codegen.c
src/vm/jit/powerpc64/emit.c
src/vm/jit/s390/codegen.c
src/vm/jit/s390/emit.c
src/vm/jit/sparc64/codegen.c
src/vm/jit/sparc64/emit.c
src/vm/jit/stack.c
src/vm/jit/x86_64/codegen.c
src/vm/jit/x86_64/emit.c
src/vm/signal.c

index 4265ba60b65b8bb2ac849098df3269a62f784524..c8f1b7aaa0dbd48945f02c6f2ebcd452ddcdb7b3 100644 (file)
@@ -627,14 +627,19 @@ void *builtin_throw_exception(java_object_t *xptr)
 
 s4 builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
 {
-       s4 result;
+       int result;
 
        LLNI_CRITICAL_START;
 
-       result = builtin_fast_canstore(LLNI_UNWRAP(oa), LLNI_UNWRAP(o));
+       result = builtin_fast_canstore(LLNI_DIRECT(oa), LLNI_UNWRAP(o));
 
        LLNI_CRITICAL_END;
 
+       /* if not possible, throw an exception */
+
+       if (result == 0)
+               exceptions_throw_arraystoreexception();
+
        return result;
 }
 
@@ -702,11 +707,6 @@ s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
                result = builtin_descriptorscompatible(valuedesc, componentvftbl->arraydesc);
        }
 
-       /* if not possible, throw an exception */
-
-       if (result == 0)
-               exceptions_throw_arraystoreexception();
-
        /* return result */
 
        return result;
index ee87f082337229028097202e73f2203513b9e507..7076266d0870d8cfd63bdc8b1537ad96ffe7fe68 100644 (file)
@@ -168,8 +168,7 @@ java_handle_objectarray_t *builtin_multianewarray(int n, classinfo *arrayclass,
 s4 builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o);
 /* NOT AN OP */
 s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o);
-#define BUILTIN_FAST_canstore (functionptr) builtin_canstore
-#define BUILTIN_canstore BUILTIN_FAST_canstore /* XXX remove this "dont break trunk" macro */
+#define BUILTIN_FAST_canstore (functionptr) builtin_fast_canstore
 
 #if defined(TRACE_ARGS_NUM)
 void builtin_verbosecall_enter(s8 a0, s8 a1,
index 9d884d1bd2a365cad1e4cecf6c563514111c7ee8..8e95c6026ed2229973b1de7a1e696ccbbe1e7b8f 100644 (file)
@@ -356,10 +356,10 @@ static builtintable_entry builtintable_internal[] = {
        {
                ICMD_AASTORE,
                0,
-               BUILTIN_canstore,
+               BUILTIN_FAST_canstore,
                NULL,
                NULL,
-               "canstore",
+               "fast-canstore",
                "([Ljava/lang/Object;Ljava/lang/Object;)I",
                NULL,
                NULL,
index b79c7be650203d99e0e6399b2822880eeea9ee42..bbbbf7a7b1d25e8fe3f04a74d32ef9bc989f12c5 100644 (file)
 #define EXCEPTION_HARDWARE_NULLPOINTER              0
 #define EXCEPTION_HARDWARE_ARITHMETIC               1
 #define EXCEPTION_HARDWARE_ARRAYINDEXOUTOFBOUNDS    2
-#define EXCEPTION_HARDWARE_CLASSCAST                3
+#define EXCEPTION_HARDWARE_ARRAYSTORE               3
 
-#define EXCEPTION_HARDWARE_EXCEPTION                5
-#define EXCEPTION_HARDWARE_PATCHER                  6
-#define EXCEPTION_HARDWARE_COMPILER                 7
+#define EXCEPTION_HARDWARE_CLASSCAST                5
+#define EXCEPTION_HARDWARE_EXCEPTION                6
+#define EXCEPTION_HARDWARE_PATCHER                  7
 
-#define EXCEPTION_HARDWARE_LARGEST                  7
+#define EXCEPTION_HARDWARE_COMPILER                 9
+
+#define EXCEPTION_HARDWARE_LARGEST                  9
 
 
 /* function prototypes ********************************************************/
index dc5d76cfdbfe7ffd40f8d51fdd26182e58ff1edd..0a6ff69e09eba50e0147bd389d0f1da730fca3d0 100644 (file)
@@ -1674,12 +1674,12 @@ bool codegen_emit(jitdata *jd)
                        M_INTMOVE(s1, REG_A0);
                        M_INTMOVE(s3, REG_A1);
 
-                       disp = dseg_add_functionptr(cd, BUILTIN_canstore);
+                       disp = dseg_add_functionptr(cd, BUILTIN_FAST_canstore);
                        M_ALD(REG_PV, REG_PV, disp);
                        M_JSR(REG_RA, REG_PV);
                        disp = (s4) (cd->mcodeptr - cd->mcodebase);
                        M_LDA(REG_PV, REG_RA, -disp);
-                       emit_exception_check(cd, iptr);
+                       emit_arraystore_check(cd, iptr);
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
index 13515ccda7166e6f20f70291cb505fce201cd478..b6883c8247820a8bbd688f1ca4438946eb2101db 100644 (file)
@@ -349,6 +349,23 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1,
 }
 
 
+/* emit_arraystore_check *******************************************************
+
+   Emit an ArrayStoreException check.
+
+*******************************************************************************/
+
+void emit_arraystore_check(codegendata *cd, instruction *iptr)
+{
+       if (INSTRUCTION_MUST_CHECK(iptr)) {
+               M_BNEZ(REG_RESULT, 1);
+               /* Destination register must not be REG_ZERO, because then no
+                  SIGSEGV is thrown. */
+               M_ALD_INTERN(REG_RESULT, REG_ZERO, EXCEPTION_HARDWARE_ARRAYSTORE);
+       }
+}
+
+
 /* emit_classcast_check ********************************************************
 
    Emit a ClassCastException check.
index f87c1b0db1fd373682b2f038d7f93bcc557fa19b..4396e6ef55af161ad5e1f935f70bd05e0ff5723d 100644 (file)
@@ -1354,7 +1354,7 @@ bool codegen_emit(jitdata *jd)
                        M_INTMOVE(s3, REG_A1);
 
                        /* call builtin function */
-                       disp = dseg_add_functionptr(cd, BUILTIN_canstore);
+                       disp = dseg_add_functionptr(cd, BUILTIN_FAST_canstore);
                        M_DSEG_BRANCH(disp);
 
                        /* recompute pv */
@@ -1362,7 +1362,7 @@ bool codegen_emit(jitdata *jd)
                        M_RECOMPUTE_PV(s1);
 
                        /* check resturn value of builtin */
-                       emit_exception_check(cd, iptr);
+                       emit_arraystore_check(cd, iptr);
 
                        /* finally store address into array */
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
index 456d27cb9a86201a225db9972fbbe122965ee6a8..e3fb9969d010c39fd3a64317dd4c16673b14bae2 100644 (file)
@@ -517,6 +517,21 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1,
 }
 
 
+/* emit_arraystore_check *******************************************************
+
+   Emit an ArrayStoreException check.
+
+*******************************************************************************/
+
+void emit_arraystore_check(codegendata *cd, instruction *iptr)
+{
+       if (INSTRUCTION_MUST_CHECK(iptr)) {
+               M_TST(REG_RESULT, REG_RESULT);
+               M_TRAPEQ(0, EXCEPTION_HARDWARE_ARRAYSTORE);
+       }
+}
+
+
 /* emit_classcast_check ********************************************************
 
    Emit a ClassCastException check.
index 538c40742e4b132b6872f4d5a657914f296f96de..baad4d1c347bdd1d01675a17061b279da922ca73 100644 (file)
@@ -172,6 +172,7 @@ void emit_branch(codegendata *cd, s4 disp, s4 condition, s4 reg, u4 options);
 
 void emit_arithmetic_check(codegendata *cd, instruction *iptr, s4 reg);
 void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2);
+void emit_arraystore_check(codegendata *cd, instruction *iptr);
 void emit_classcast_check(codegendata *cd, instruction *iptr, s4 condition, s4 reg, s4 s1);
 void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 reg);
 void emit_exception_check(codegendata *cd, instruction *iptr);
index 77321041f79e9640d7214cc16a69e457d7f8aad3..07063205f49618b3684aba3adef15aae0af0141d 100644 (file)
@@ -2110,9 +2110,9 @@ bool codegen_emit(jitdata *jd)
 
                        M_AST(s1, REG_SP, 0 * 4);
                        M_AST(s3, REG_SP, 1 * 4);
-                       M_MOV_IMM(BUILTIN_canstore, REG_ITMP1);
+                       M_MOV_IMM(BUILTIN_FAST_canstore, REG_ITMP1);
                        M_CALL(REG_ITMP1);
-                       emit_exception_check(cd, iptr);
+                       emit_arraystore_check(cd, iptr);
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
index 9e1f42d14c8023b5082404f089dd73a085f84c95..7cee7e7a5cf0936daf9575e6a007ddd911005a3f 100644 (file)
@@ -431,6 +431,22 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1,
 }
 
 
+/* emit_arraystore_check *******************************************************
+
+   Emit an ArrayStoreException check.
+
+*******************************************************************************/
+
+void emit_arraystore_check(codegendata *cd, instruction *iptr)
+{
+       if (INSTRUCTION_MUST_CHECK(iptr)) {
+               M_TEST(REG_RESULT);
+               M_BNE(6);
+               M_ALD_MEM(REG_RESULT, EXCEPTION_HARDWARE_ARRAYSTORE);
+       }
+}
+
+
 /* emit_classcast_check ********************************************************
 
    Emit a ClassCastException check.
index dc2caa06809a0532f18ca4d3841520d278789c3b..d3c69be9be22d7a22782ddd4fa463baf28f92cd7 100644 (file)
@@ -1598,12 +1598,12 @@ bool codegen_emit(jitdata *jd)
                        s3 = emit_load_s3(jd, iptr, REG_ATMP2);
 
                        /* XXX what if array is NULL */
-                       disp = dseg_add_functionptr(cd, BUILTIN_canstore);
+                       disp = dseg_add_functionptr(cd, BUILTIN_FAST_canstore);
 
                        M_AST(s1, REG_SP, 0*4);
                        M_AST(s3, REG_SP, 1*4);
-                       M_JSR_IMM(BUILTIN_canstore);    
-                       emit_exception_check(cd, iptr);
+                       M_JSR_IMM(BUILTIN_FAST_canstore);
+                       emit_arraystore_check(cd, iptr);
 
                        s1 = emit_load_s1(jd, iptr, REG_ATMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP1);
index f53e321908243d02abd547655ee457b1d68ca351..a97783ad2af975a7f2c670f6be31555fd1b88fa9 100644 (file)
@@ -743,6 +743,24 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1,
        }
 }
 
+
+/* emit_arraystore_check *******************************************************
+
+   Emit an ArrayStoreException check.
+
+*******************************************************************************/
+
+void emit_arraystore_check(codegendata *cd, instruction *iptr)
+{
+       if (INSTRUCTION_MUST_CHECK(iptr)) {
+               M_ITST(REG_RESULT);
+               M_BNE(2);
+               /*M_ALD_INTERN(REG_ZERO, REG_ZERO, EXCEPTION_HARDWARE_ARRAYSTORE);*/
+               M_TRAP(EXCEPTION_HARDWARE_ARRAYSTORE);
+       }
+}
+
+
 /* emit_nullpointer_check ******************************************************
 
    Emit a NullPointerException check.
index 01f0c30027544525d76041631cfc21ed9fd6826f..9514a03ca91f00962a549b5b3320737b594db834 100644 (file)
@@ -1904,11 +1904,11 @@ bool codegen_emit(jitdata *jd)
 
                        M_INTMOVE(s1, REG_A0);
                        M_INTMOVE(s3, REG_A1);
-                       disp = dseg_add_functionptr(cd, BUILTIN_canstore);
+                       disp = dseg_add_functionptr(cd, BUILTIN_FAST_canstore);
                        M_ALD(REG_ITMP3, REG_PV, disp);
                        M_JSR(REG_RA, REG_ITMP3);
                        M_NOP;
-                       emit_exception_check(cd, iptr);
+                       emit_arraystore_check(cd, iptr);
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
index 924b09b230c386b30659d913a9e2f40a5f671f1c..287e7ef48a3482c8565ae405a273181565dbd998 100644 (file)
@@ -519,6 +519,22 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1,
 }
 
 
+/* emit_arraystore_check *******************************************************
+
+   Emit an ArrayStoreException check.
+
+*******************************************************************************/
+
+void emit_arraystore_check(codegendata *cd, instruction *iptr)
+{
+       if (INSTRUCTION_MUST_CHECK(iptr)) {
+               M_BNEZ(REG_RESULT, 2);
+               M_NOP;
+               M_ALD_INTERN(REG_RESULT, REG_ZERO, EXCEPTION_HARDWARE_ARRAYSTORE);
+       }
+}
+
+
 /* emit_classcast_check ********************************************************
 
    Emit a ClassCastException check.
index 5c7f3195c27a2ab07056eb7753d289ac21106df4..7039c43a5155ec46dce63646617669ea4b5379ee 100644 (file)
@@ -1587,7 +1587,7 @@ bool codegen_emit(jitdata *jd)
                        s3 = emit_load_s3(jd, iptr, REG_A1);
 
                        /* XXX what if array is NULL */
-                       disp = dseg_add_functionptr(cd, BUILTIN_canstore);
+                       disp = dseg_add_functionptr(cd, BUILTIN_FAST_canstore);
                        M_ALD(REG_ITMP3, REG_PV, disp);
                        M_MTCTR(REG_ITMP3);
 
@@ -1595,7 +1595,7 @@ bool codegen_emit(jitdata *jd)
                        M_INTMOVE(s3, REG_A1);
 
                        M_JSR;
-                       emit_exception_check(cd, iptr);
+                       emit_arraystore_check(cd, iptr);
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
index f616af44016f9aff61343a3aacf9a69b18ad8e27..025e1beb1ef6a70d4c8bad1551a9f13eeab4968b 100644 (file)
@@ -441,6 +441,22 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1,
 }
 
 
+/* emit_arraystore_check *******************************************************
+
+   Emit an ArrayStoreException check.
+
+*******************************************************************************/
+
+void emit_arraystore_check(codegendata *cd, instruction *iptr)
+{
+       if (INSTRUCTION_MUST_CHECK(iptr)) {
+               M_TST(REG_RESULT);
+               M_BNE(1);
+               M_ALD_INTERN(REG_ZERO, REG_ZERO, EXCEPTION_HARDWARE_ARRAYSTORE);
+       }
+}
+
+
 /* emit_classcast_check ********************************************************
 
    Emit a ClassCastException check.
index 104754408550fc77feaf2bd46ebb4766c35c48bc..e4155bc32dc082645067ca5ad561ba52c91d722c 100644 (file)
@@ -1539,7 +1539,7 @@ bool codegen_emit(jitdata *jd)
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        s3 = emit_load_s3(jd, iptr, REG_A1);
 
-                       disp = dseg_add_functionptr(cd, BUILTIN_canstore);
+                       disp = dseg_add_functionptr(cd, BUILTIN_FAST_canstore);
                        M_ALD(REG_ITMP3, REG_PV, disp);
                        M_ALD(REG_ITMP3, REG_ITMP3, 0); /* TOC */
                        M_MTCTR(REG_ITMP3);
@@ -1548,7 +1548,7 @@ bool codegen_emit(jitdata *jd)
                        M_INTMOVE(s3, REG_A1);
 
                        M_JSR;
-                       emit_exception_check(cd, iptr);
+                       emit_arraystore_check(cd, iptr);
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
index 041f8da4d347b4e8be6c909fe4161385d0c2cbf6..58b8b31fc177c05b18dd22ec0e698c8b9e09f61c 100644 (file)
@@ -540,6 +540,23 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1,
 }
 
 
+/* emit_arraystore_check *******************************************************
+
+   Emit an ArrayStoreException check.
+
+*******************************************************************************/
+
+void emit_arraystore_check(codegendata *cd, instruction *iptr)
+{
+       if (INSTRUCTION_MUST_CHECK(iptr))       {
+               M_TST(REG_RESULT);
+               M_BNE(1);
+               /* ALD is 4 byte aligned, ILD 2, onyl LWZ is byte aligned */
+               M_LWZ(REG_ZERO, REG_ZERO, EXCEPTION_HARDWARE_ARRAYSTORE);
+       }
+}
+
+
 /* emit_arithmetic_check *******************************************************
 
    Emit an ArithmeticException check.
index c9b4cfbad66c06c2f300337c72fa86741c59ee43..636fc605fce94ca8a563b25bbec23c00d7f48516 100644 (file)
@@ -1972,13 +1972,13 @@ bool codegen_emit(jitdata *jd)
                        M_INTMOVE(s1, REG_A0);
                        M_INTMOVE(s3, REG_A1);
 
-                       disp = dseg_add_functionptr(cd, BUILTIN_canstore);
+                       disp = dseg_add_functionptr(cd, BUILTIN_FAST_canstore);
                        M_ALD_DSEG(REG_ITMP3, disp);
                        M_ASUB_IMM(96, REG_SP);
                        M_JSR(REG_RA, REG_ITMP3);
                        M_AADD_IMM(96, REG_SP);
 
-                       emit_exception_check(cd, iptr);
+                       emit_arraystore_check(cd, iptr);
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
index 24419bd5472b827b3d57d6cabd9df65e2f6c05de..715b0be5a8a67a4eea7fbfa65a95f1398b816fe3 100644 (file)
@@ -987,6 +987,23 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1,
        }
 }
 
+
+/* emit_arraystore_check *******************************************************
+
+   Emit an ArrayStoreException check.
+
+*******************************************************************************/
+
+void emit_arraystore_check(codegendata *cd, instruction *iptr)
+{
+       if (INSTRUCTION_MUST_CHECK(iptr)) {
+               M_TEST(REG_RESULT);
+               M_BNE(SZ_BRC + SZ_ILL);
+               M_ILL(EXCEPTION_HARDWARE_ARRAYSTORE);
+       }
+}
+
+
 void emit_classcast_check(codegendata *cd, instruction *iptr, s4 condition, s4 reg, s4 s1) {
        if (INSTRUCTION_MUST_CHECK(iptr)) {
                if (reg != RN) {
index eb900438efb804b39190095d316c808f19ecfcf7..2f424ac6a0892a192e6e0ffec7095ed434645838 100644 (file)
@@ -1552,11 +1552,11 @@ bool codegen_emit(jitdata *jd)
 
                        M_MOV(s1, REG_OUT0);
                        M_MOV(s3, REG_OUT1);
-                       disp = dseg_add_functionptr(cd, BUILTIN_canstore);
+                       disp = dseg_add_functionptr(cd, BUILTIN_FAST_canstore);
                        M_ALD(REG_ITMP3, REG_PV, disp);
                        M_JMP(REG_RA_CALLER, REG_ITMP3, REG_ZERO);
                        M_NOP;
-                       emit_exception_check(cd, iptr);
+                       emit_arraystore_check(cd, iptr);
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
index dc89473eab6eb8d8837f1a5836ac5bfc1d075de1..98ce9af806ed764c4dddfcd94a6d7234e7f854e8 100644 (file)
@@ -484,6 +484,22 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1,
 }
 
 
+/* emit_arraystore_check *******************************************************
+
+   Emit an ArrayStoreException check.
+
+*******************************************************************************/
+
+void emit_arraystore_check(codegendata *cd, instruction *iptr)
+{
+       if (INSTRUCTION_MUST_CHECK(iptr)) {
+               M_BNEZ(REG_RESULT_CALLER, 3);
+               M_NOP;
+               M_ALD_INTERN(REG_RESULT_CALLER, REG_ZERO, EXCEPTION_HARDWARE_ARRAYSTORE);
+       }
+}
+
+
 /* emit_classcast_check ********************************************************
 
    Emit a ClassCastException check.
index ab0d3381c4dcc6f9a529c70ce6e444e067fbb1b5..b7a270218df77fa076f1a0806997684ce9451234 100644 (file)
@@ -3369,7 +3369,7 @@ store_tail:
                                                COUNT(count_check_bound);
                                                COUNT(count_pcmd_mem);
 
-                                               bte = builtintable_get_internal(BUILTIN_canstore);
+                                               bte = builtintable_get_internal(BUILTIN_FAST_canstore);
                                                md = bte->md;
 
                                                if (md->memuse > rd->memuse)
index 2ba864bffa825e110ca8222e7c0e0e1f07bb5d79..efe8689c626a02433cec1de853f81d610ff83633 100644 (file)
@@ -1672,9 +1672,9 @@ bool codegen_emit(jitdata *jd)
 
                        M_MOV(s1, REG_A0);
                        M_MOV(s3, REG_A1);
-                       M_MOV_IMM(BUILTIN_canstore, REG_ITMP1);
+                       M_MOV_IMM(BUILTIN_FAST_canstore, REG_ITMP1);
                        M_CALL(REG_ITMP1);
-                       emit_exception_check(cd, iptr);
+                       emit_arraystore_check(cd, iptr);
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
index 44f3742a704166127f9e5f0a97401c5cfbe85e59..5566894e13fd45f00baaba8ba5f905af354e6299 100644 (file)
@@ -359,6 +359,22 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1,
 }
 
 
+/* emit_arraystore_check *******************************************************
+
+   Emit an ArrayStoreException check.
+
+*******************************************************************************/
+
+void emit_arraystore_check(codegendata *cd, instruction *iptr)
+{
+       if (INSTRUCTION_MUST_CHECK(iptr)) {
+               M_TEST(REG_RESULT);
+               M_BNE(8);
+               M_ALD_MEM(REG_RESULT, EXCEPTION_HARDWARE_ARRAYSTORE);
+       }
+}
+
+
 /* emit_classcast_check ********************************************************
 
    Emit a ClassCastException check.
index c40d0c79160b80fbdc6dd028d5e54b1ea90ab376..ba7d179989d69a9b22b36e85cffcfdeab74d9872 100644 (file)
@@ -245,6 +245,10 @@ void *signal_handle(void *xpc, int type, intptr_t val)
                p = exceptions_new_arrayindexoutofboundsexception(index);
                break;
 
+       case EXCEPTION_HARDWARE_ARRAYSTORE:
+               p = exceptions_new_arraystoreexception();
+               break;
+
        case EXCEPTION_HARDWARE_CLASSCAST:
                o = (java_object_t *) val;
                p = exceptions_new_classcastexception(o);