* src/vm/jit/s390/emit.c,
authorpm <none@none>
Mon, 26 Mar 2007 07:23:16 +0000 (07:23 +0000)
committerpm <none@none>
Mon, 26 Mar 2007 07:23:16 +0000 (07:23 +0000)
src/vm/jit/s390/md-abi.h,
src/vm/jit/s390/md.c,
src/vm/jit/s390/emit.h,
src/vm/jit/s390/codegen.c,
src/vm/jit/s390/codegen.h,
src/vm/jit/s390/tests/tests.java.pp,
src/vm/jit/s390/patcher.c,
src/vm/jit/s390/md-abi.c: Chaned a lot.

22 files changed:
src/native/native.c
src/native/native.h
src/native/vm/gnu/java_lang_reflect_Constructor.c
src/native/vm/gnu/java_lang_reflect_Method.c
src/vm/access.c
src/vm/builtin.h
src/vm/global.h
src/vm/jit/s390/codegen.c
src/vm/jit/s390/codegen.h
src/vm/jit/s390/emit.c
src/vm/jit/s390/emit.h
src/vm/jit/s390/md-abi.c
src/vm/jit/s390/md-abi.h
src/vm/jit/s390/md.c
src/vm/jit/s390/patcher.c
src/vm/jit/s390/tests/tests.java.pp
src/vmcore/class.c
src/vmcore/class.h
src/vmcore/classcache.c
src/vmcore/linker.c
src/vmcore/method.c
src/vmcore/method.h

index 3864403108f46c429f3c560be8073682a3a88314..a0e566804dda8d1d274dd74d49a6e2cb4d98f853 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: native.c 7573 2007-03-25 18:55:02Z twisti $
+   $Id: native.c 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index e478d2009f386dfc64d0c4273df36704af757471..6f27bbced07baa49ac173793684fb526563a4787 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: native.h 7573 2007-03-25 18:55:02Z twisti $
+   $Id: native.h 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index 9a5a343be2438e0a4eddffa570114e390f901abf..d5b6174e88bd3f00f36937ea792b7808b560e344 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_reflect_Constructor.c 7573 2007-03-25 18:55:02Z twisti $
+   $Id: java_lang_reflect_Constructor.c 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index 2bb0169eabe27a124df48e800f350b74b1a398f5..193a932e99def1e3f82c9def4fd2ddc3d7edb0da 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_reflect_Method.c 7573 2007-03-25 18:55:02Z twisti $
+   $Id: java_lang_reflect_Method.c 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index 502cb1f41e74f93548f662060d2805b04e497521..e19b3a1f73dde9746ebdc72e5aa342a0ab69e7b9 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: access.c 7563 2007-03-23 21:33:53Z twisti $
+   $Id: access.c 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index 2b9c17ceb9fc69730f73d7edec4481ccc8305950..8cc66f0120445af1ba52495ef95e3188eb06f675 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: builtin.h 7563 2007-03-23 21:33:53Z twisti $
+   $Id: builtin.h 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index c85227c5217862331d776f6b035670dbf3465226..c5fbb7ed0677774ee751cd1e26ca993f1c71b361 100644 (file)
@@ -32,7 +32,7 @@
             Joseph Wenninger
             Christian Thalinger
 
-   $Id: global.h 7561 2007-03-23 19:10:35Z twisti $
+   $Id: global.h 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index d9bfac3c9a5609879143d14beff981c1696fc590..bc7d5a5cb1da4c68265b8293181755793ee5ef68 100644 (file)
@@ -29,7 +29,7 @@
             Christian Ullrich
             Edwin Steiner
 
-   $Id: codegen.c 7534 2007-03-16 23:00:18Z pm $
+   $Id: codegen.c 7581 2007-03-26 07:23:16Z pm $
 
 */
 
@@ -1197,8 +1197,7 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_IAND:       /* ..., val1, val2  ==> ..., val1 & val2        */
-                       OOPS();
-#if 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);
@@ -1209,9 +1208,41 @@ bool codegen(jitdata *jd)
                                M_IAND(s2, d);
                        }
                        emit_store_dst(jd, iptr, d);
-#endif
+
                        break;
 
+               case ICMD_IOR:        /* ..., val1, val2  ==> ..., val1 | val2        */
+
+                       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 (s2 == d)
+                               M_IOR(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_IOR(s2, d);
+                       }
+                       emit_store_dst(jd, iptr, d);
+
+                       break;
+
+               case ICMD_IXOR:       /* ..., val1, val2  ==> ..., val1 ^ val2        */
+
+                       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 (s2 == d)
+                               M_IXOR(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_IXOR(s2, d);
+                       }
+                       emit_store_dst(jd, iptr, d);
+
+                       break;
+
+
+
                case ICMD_IANDCONST:  /* ..., value  ==> ..., value & constant        */
                                      /* sx.val.i = constant                             */
                        OOPS();
@@ -1242,6 +1273,26 @@ bool codegen(jitdata *jd)
 
                case ICMD_LANDCONST:  /* ..., value  ==> ..., value & constant        */
                                      /* sx.val.l = constant                             */
+
+                       s3 = iptr->sx.val.l & 0xffffffff;
+                       s1 = emit_load_s1_low(jd, iptr, REG_ITMP1);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED);
+                       if ((s3 >= 0) && (s3 <= 65535))
+                               M_AND_IMM(s1, s3, GET_LOW_REG(d));
+                       else {
+                               ICONST(REG_ITMP3, s3);
+                               M_AND(s1, REG_ITMP3, GET_LOW_REG(d));
+                       }
+                       s1 = emit_load_s1_high(jd, iptr, REG_ITMP1);
+                       s3 = iptr->sx.val.l >> 32;
+                       if ((s3 >= 0) && (s3 <= 65535))
+                               M_AND_IMM(s1, s3, GET_HIGH_REG(d));
+                       else {
+                               ICONST(REG_ITMP3, s3);                 /* don't use REG_ITMP2 */
+                               M_AND(s1, REG_ITMP3, GET_HIGH_REG(d));
+                       }
+                       emit_store_dst(jd, iptr, d);
+
                        OOPS();
 #if 0
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
@@ -1257,22 +1308,6 @@ bool codegen(jitdata *jd)
 #endif
                        break;
 
-               case ICMD_IOR:        /* ..., val1, val2  ==> ..., val1 | val2        */
-                       OOPS();
-#if 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 (s2 == d)
-                               M_IOR(s1, d);
-                       else {
-                               M_INTMOVE(s1, d);
-                               M_IOR(s2, d);
-                       }
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
-
                case ICMD_IORCONST:   /* ..., value  ==> ..., value | constant        */
                                      /* sx.val.i = constant                             */
                        OOPS();
@@ -1318,22 +1353,6 @@ bool codegen(jitdata *jd)
 #endif
                        break;
 
-               case ICMD_IXOR:       /* ..., val1, val2  ==> ..., val1 ^ val2        */
-                       OOPS();
-#if 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 (s2 == d)
-                               M_IXOR(s1, d);
-                       else {
-                               M_INTMOVE(s1, d);
-                               M_IXOR(s2, d);
-                       }
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
-
                case ICMD_IXORCONST:  /* ..., value  ==> ..., value ^ constant        */
                                      /* sx.val.i = constant                             */
                        OOPS();
@@ -1409,11 +1428,9 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_FADD:       /* ..., val1, val2  ==> ..., val1 + val2        */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
                        s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
                        if (s2 == d)
                                M_FADD(s1, d);
                        else {
@@ -1421,15 +1438,12 @@ bool codegen(jitdata *jd)
                                M_FADD(s2, d);
                        }
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_DADD:       /* ..., val1, val2  ==> ..., val1 + val2        */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
                        s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
                        if (s2 == d)
                                M_DADD(s1, d);
                        else {
@@ -1437,45 +1451,32 @@ bool codegen(jitdata *jd)
                                M_DADD(s2, d);
                        }
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_FSUB:       /* ..., val1, val2  ==> ..., val1 - val2        */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
-                       if (s2 == d) {
-                               M_FLTMOVE(s2, REG_FTMP2);
-                               s2 = REG_FTMP2;
-                       }
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+                       s2 = emit_load_s2_but(jd, iptr, REG_FTMP2, d);
+
                        M_FLTMOVE(s1, d);
                        M_FSUB(s2, d);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_DSUB:       /* ..., val1, val2  ==> ..., val1 - val2        */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
-                       if (s2 == d) {
-                               M_FLTMOVE(s2, REG_FTMP2);
-                               s2 = REG_FTMP2;
-                       }
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+                       s2 = emit_load_s2_but(jd, iptr, REG_FTMP2, d);
+
                        M_FLTMOVE(s1, d);
                        M_DSUB(s2, d);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_FMUL:       /* ..., val1, val2  ==> ..., val1 * val2        */
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
                        s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
                        if (s2 == d)
                                M_FMUL(s1, d);
                        else {
@@ -1483,15 +1484,12 @@ bool codegen(jitdata *jd)
                                M_FMUL(s2, d);
                        }
                        emit_store_dst(jd, iptr, d);
-
                        break;
 
                case ICMD_DMUL:       /* ..., val1, val2  ==> ..., val1 * val2        */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
                        s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
                        if (s2 == d)
                                M_DMUL(s1, d);
                        else {
@@ -1499,39 +1497,26 @@ bool codegen(jitdata *jd)
                                M_DMUL(s2, d);
                        }
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_FDIV:       /* ..., val1, val2  ==> ..., val1 / val2        */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
-                       if (s2 == d) {
-                               M_FLTMOVE(s2, REG_FTMP2);
-                               s2 = REG_FTMP2;
-                       }
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+                       s2 = emit_load_s2_but(jd, iptr, REG_FTMP2, d);
+
                        M_FLTMOVE(s1, d);
                        M_FDIV(s2, d);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_DDIV:       /* ..., val1, val2  ==> ..., val1 / val2        */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
-                       if (s2 == d) {
-                               M_FLTMOVE(s2, REG_FTMP2);
-                               s2 = REG_FTMP2;
-                       }
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+                       s2 = emit_load_s2_but(jd, iptr, REG_FTMP2, d);
+
                        M_FLTMOVE(s1, d);
                        M_DDIV(s2, d);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_I2F:       /* ..., value  ==> ..., (float) value            */
@@ -1634,7 +1619,7 @@ bool codegen(jitdata *jd)
 
                case ICMD_F2D:       /* ..., value  ==> ..., (double) value           */
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
+                       d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
                        M_CVTFD(s1, d);
                        emit_store_dst(jd, iptr, d);
                        break;
@@ -1712,18 +1697,17 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_BALOAD:     /* ..., arrayref, index  ==> ..., value         */
-                       OOPS();
-#if 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_ITMP3);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       emit_movsbq_memindex_reg(cd, OFFSET(java_bytearray, data[0]), s1, s2, 0, d);
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
+                       s2 = emit_load_s2_notzero(jd, iptr, REG_ITMP2);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+
+                       emit_array_checks(cd, iptr, s1, s2);
+
+                       N_IC(d, OFFSET(java_bytearray, data[0]), s2, s1);
+                       /* TODO improove this */
+                       N_SLL(d, 24, RN);
+                       N_SRL(d, 24, RN);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_CALOAD:     /* ..., arrayref, index  ==> ..., value         */
@@ -1742,33 +1726,29 @@ bool codegen(jitdata *jd)
                        break;                  
 
                case ICMD_SALOAD:     /* ..., arrayref, index  ==> ..., value         */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       emit_movswq_memindex_reg(cd, OFFSET(java_shortarray, data[0]), s1, s2, 1, d);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+
+                       emit_array_checks(cd, iptr, s1, s2);
+
+                       M_INTMOVE(s2, REG_ITMP2);
+                       M_ISLL_IMM(1, REG_ITMP2);
+
+                       N_LH(d, OFFSET(java_shortarray, data[0]), REG_ITMP2, s1);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_IALOAD:     /* ..., arrayref, index  ==> ..., value         */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       emit_movl_memindex_reg(cd, OFFSET(java_intarray, data[0]), s1, s2, 2, d);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+                       emit_array_checks(cd, iptr, s1, s2);
+                       
+                       M_INTMOVE(s2, REG_ITMP2);
+                       M_ISLL_IMM(2, REG_ITMP2); /* scale index by 4 */
+                       N_L(d, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_LALOAD:     /* ..., arrayref, index  ==> ..., value         */
@@ -1829,17 +1809,12 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_BASTORE:    /* ..., arrayref, index, value  ==> ...         */
-                       OOPS();
-#if 0
-                       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);
-                               gen_bound_check;
-                       }
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
+                       s2 = emit_load_s2_notzero(jd, iptr, REG_ITMP2);
+                       emit_array_checks(cd, iptr, s1, s2);
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
-                       emit_movb_reg_memindex(cd, s3, OFFSET(java_bytearray, data[0]), s1, s2, 0);
-#endif
+
+                       N_STC(s3, OFFSET(java_bytearray, data[0]), s2, s1);
                        break;
 
                case ICMD_CASTORE:    /* ..., arrayref, index, value  ==> ...         */
@@ -1857,73 +1832,65 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_SASTORE:    /* ..., arrayref, index, value  ==> ...         */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
+                       emit_array_checks(cd, iptr, s1, s2);
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
-                       emit_movw_reg_memindex(cd, s3, OFFSET(java_shortarray, data[0]), s1, s2, 1);
-#endif
+
+                       M_INTMOVE(s2, REG_ITMP2);
+                       M_ISLL_IMM(1, REG_ITMP2);
+
+                       N_STH(s3, OFFSET(java_shortarray, data[0]), REG_ITMP2, s1);
                        break;
 
                case ICMD_IASTORE:    /* ..., arrayref, index, value  ==> ...         */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
+                       emit_array_checks(cd, iptr, s1, s2);
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
-                       emit_movl_reg_memindex(cd, s3, OFFSET(java_intarray, data[0]), s1, s2, 2);
-#endif
+
+                       M_INTMOVE(s2, REG_ITMP2);
+                       M_ISLL_IMM(2, REG_ITMP2);
+
+                       N_ST(s3, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
                        break;
 
                case ICMD_LASTORE:    /* ..., arrayref, index, value  ==> ...         */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       s3 = emit_load_s3(jd, iptr, REG_ITMP3);
-                       emit_mov_reg_memindex(cd, s3, OFFSET(java_longarray, data[0]), s1, s2, 3);
-#endif
+                       emit_array_checks(cd, iptr, s1, s2);
+
+                       M_INTMOVE(s2, REG_ITMP2);
+                       M_ISLL_IMM(3, REG_ITMP2);
+
+                       s3 = emit_load_s3_high(jd, iptr, REG_ITMP3);
+                       N_ST(s3, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
+                       s3 = emit_load_s3_low(jd, iptr, REG_ITMP3);
+                       N_ST(s3, OFFSET(java_intarray, data[0]) + 4, REG_ITMP2, s1);
                        break;
 
                case ICMD_FASTORE:    /* ..., arrayref, index, value  ==> ...         */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       s3 = emit_load_s3(jd, iptr, REG_FTMP3);
-                       emit_movss_reg_memindex(cd, s3, OFFSET(java_floatarray, data[0]), s1, s2, 2);
-#endif
+                       emit_array_checks(cd, iptr, s1, s2);
+                       s3 = emit_load_s3(jd, iptr, REG_FTMP1);
+
+                       M_INTMOVE(s2, REG_ITMP2);
+                       M_ISLL_IMM(2, REG_ITMP2);
+
+                       N_STE(s3, OFFSET(java_floatarray, data[0]), REG_ITMP2, s1);
                        break;
 
                case ICMD_DASTORE:    /* ..., arrayref, index, value  ==> ...         */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+                       s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       if (INSTRUCTION_MUST_CHECK(iptr)) {
-                               gen_nullptr_check(s1);
-                               gen_bound_check;
-                       }
-                       s3 = emit_load_s3(jd, iptr, REG_FTMP3);
-                       emit_movsd_reg_memindex(cd, s3, OFFSET(java_doublearray, data[0]), s1, s2, 3);
-#endif
+                       emit_array_checks(cd, iptr, s1, s2);
+                       s3 = emit_load_s3(jd, iptr, REG_FTMP1);
+
+                       M_INTMOVE(s2, REG_ITMP2);
+                       M_ISLL_IMM(3, REG_ITMP2);
+
+                       N_STD(s3, OFFSET(java_doublearray, data[0]), REG_ITMP2, s1);
                        break;
 
                case ICMD_AASTORE:    /* ..., arrayref, index, value  ==> ...         */
@@ -3149,16 +3116,17 @@ gen_method:
                                        }
 
                                        M_ALD(REG_ITMP2, s1, OFFSET(java_objectheader, vftbl));
-                                       M_ILD(REG_ITMP3, REG_ITMP2,
-                                                 OFFSET(vftbl_t, interfacetablelength));
-                                       M_LDA(REG_ITMP3, REG_ITMP3, -superindex);
-                                       M_TEST(REG_ITMP3);
+                                       M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, interfacetablelength));
+                                       M_ISUB_IMM(superindex, REG_ITMP3);
                                        M_BLE(0);
                                        codegen_add_classcastexception_ref(cd, s1);
-                                       M_ALD(REG_ITMP3, REG_ITMP2,
-                                                 (s4) (OFFSET(vftbl_t, interfacetable[0]) -
-                                                               superindex * sizeof(methodptr*)));
-                                       M_TEST(REG_ITMP3);
+                                       N_AHI(
+                                               REG_ITMP2,
+                                               (s4) (OFFSET(vftbl_t, interfacetable[0]) -
+                                                       superindex * sizeof(methodptr*))
+                                       );
+                                       M_ALD(REG_ITMP2, REG_ITMP2, 0);
+                                       M_TEST(REG_ITMP2);
                                        M_BEQ(0);
                                        codegen_add_classcastexception_ref(cd, s1);
 
@@ -3359,7 +3327,7 @@ gen_method:
 
                                M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
                                M_ILD(REG_ITMP3, REG_ITMP1, OFFSET(vftbl_t, interfacetablelength));
-                               M_ASUB_IMM(superindex, REG_ITMP3);
+                               M_ISUB_IMM(superindex, REG_ITMP3);
                                label1_refs[0] = cd->mcodeptr;
                                M_BLE(0); 
                                N_AHI(
@@ -3372,7 +3340,7 @@ gen_method:
                                /* d := (REG_ITMP1 != 0)  */
 
                                N_LTR(d, REG_ITMP1);
-                               M_BEQ(SZ_LHI);
+                               M_BEQ(SZ_BRC + SZ_LHI);
                                N_LHI(d, 1);
 
                                label1 = cd->mcodeptr;
@@ -3416,11 +3384,11 @@ gen_method:
 #if defined(ENABLE_THREADS)
                                codegen_threadcritstop(cd, cd->mcodeptr - cd->mcodebase);
 #endif
-                               M_ISUB(REG_ITMP1, REG_ITMP3);
+                               M_ISUB(REG_ITMP3, REG_ITMP1); /* itmp1 :=  itmp1 (sub.baseval) - itmp3 (super.baseval) */
 
                                N_CLR(REG_ITMP1, REG_ITMP2); /* d := (uint)REG_ITMP1 <= (uint)REG_ITMP2 */
                                N_LHI(d, 0);
-                               M_BGT(SZ_LHI);
+                               M_BGT(SZ_BRC + SZ_LHI);
                                N_LHI(d, 1);
                        }
 
index da974ac855f2bc871800934818757cb04fe5e486..5228b5828273539494e70b57de6c377dafe84d7a 100644 (file)
@@ -27,7 +27,7 @@
    Authors: Andreas Krall
             Christian Thalinger
 
-   $Id: codegen.h 7534 2007-03-16 23:00:18Z pm $
+   $Id: codegen.h 7581 2007-03-26 07:23:16Z pm $
 
 */
 
 #define N_VALID_DISP(x) ((N_DISP_MIN <= (x)) && ((x) <= N_DISP_MAX))
 #define ASSERT_VALID_DISP(x) assert(N_VALID_DISP(x))
 
+#define N_BRANCH_MIN -32768
+#define N_BRANCH_MAX 32767
+#define N_VALID_BRANCH(x) ((N_BRANCH_MIN <= (x)) && ((x) <= N_BRANCH_MAX))
+#define ASSERT_VALID_BRANCH(x) assert(N_VALID_BRANCH(x))
+
 /* Condition codes */
 
 #define DD_O 1
 #      define SZ_AHI SZ_RI
 #define N_ALR(r1, r2) N_RR(0x1E, r1, r2)
 #define N_AL(r1, d2, x2, b2) N_RX(0x5E, r1, d2, x2, b2)
-#define N_NR(r1, r2) N_RR(r1, r2)
+#define N_NR(r1, r2) N_RR(0x14, r1, r2)
 #define N_N(r1, d2, x2, b2) N_RX(0x54, r1, d2, x2, b2)
 #define N_NI(d1, b1, i2) N_SI(0x94, d1, b1, i2)
 #define N_NC(d1, l, b1, d2, b2) N_NC(0xD4, l, b1, d1, b2, d2)
 
 /* chapter 19. Binary floating point instructions */
 
+#define N_AEBR(r1, r2) N_RRE(0xB30A, r1, r2)
+#define N_ADBR(r1, r2) N_RRE(0xB31A, r1, r2)
+#define N_AXBR(r1, r2) N_RRE(0xB34A, r1, r2)
+#define N_AEB(r1, d2, x2, b2) N_RXE(0xED0A, r1, d2, x2, b2)
+#define N_ADB(r1, d2, x2, b2) N_RXE(0xED1A, r1, d2, x2, b2)
+
 #define N_CEBR(r1, r2) N_RRE(0xB309, r1, r2)
 #define N_CDBR(r1, r2) N_RRE(0xB319, r1, r2)
 #define N_CXBR(r1, r2) N_RRE(0xB349, r1, r2)
 #define N_CFDBR(r1, m3, r2) N_RRF(0xB399, r1, m3, r2)
 #define N_CFXBR(r1, m3, r2) N_RRF(0xB39A, r1, m3, r2)
 
+#define N_DEBR(r1, r2) N_RRE(0xB30D, r1, r2)
+#define N_DDBR(r1, r2) N_RRE(0xB31D, r1, r2)
+#define N_DXBR(r1, r2) N_RRE(0xB34D, r1, r2)
+#define N_DEB(r1, d2, x2, b2) N_RXE(0xED0D, r1, d2, x2, b2)
+#define N_DDB(r1, d2, x2, b2) N_RXE(0xED1D, r1, d2, x2, b2)
+
 #define N_LDEBR(r1, r2) N_RRE(0xB304, r1, r2)
 #define N_LXDBR(r1, r2) N_RRE(0xB305, r1, r2)
 #define N_LXEBR(r1, r2) N_RRE(0xB306, r1, r2)
 #define N_MDEBR(r1, r2) N_RRE(0xB30C, r1, r2)
 #define N_MXDBR(r1, r2) N_RRE(0xB307, r1, r2)
 
+#define N_SEBR(r1, r2) N_RRE(0xB30B, r1, r2)
+#define N_SDBR(r1, r2) N_RRE(0xB31B, r1, r2)
+#define N_SXBR(r1, r2) N_RRE(0xB34B, r1, r2)
+#define N_SEB(r1, d2, x2, b2) N_RXE(0xED0B, r1, d2, x2, b2)
+#define N_SDB(r1, d2, x2, b2) N_RXE(0xED1B, r1, d2, x2, b2)
+
 /* Alpha like instructions */
 
 #define M_CALL(r2) N_BASR(R14, r2)
 #define M_CVTIF(src, dst) N_CEFBR(dst, src)
 #define M_CVTID(src, dst) N_CDFBR(dst, src)
 #define M_FMUL(a, dest) N_MEEBR(dest, a)
+#define M_FSUB(a, dest) N_SEBR(dest, a)
+#define M_FADD(a, dest) N_AEBR(dest, a)
+#define M_FDIV(a, dest) N_DEBR(dest, a)
+#define M_DMUL(a, dest) N_MDBR(dest, a)
+#define M_DSUB(a, dest) N_SDBR(dest, a)
+#define M_DADD(a, dest) N_ADBR(dest, a)
+#define M_DDIV(a, dest) N_DDBR(dest, a)
 #define M_CVTFI(src, dst) N_CFEBR(dst, 5, src)
 #define M_IADD(a, dest) N_AR(dest, a)
 #define M_ISUB(a, dest) N_SR(dest, a)
 #define M_IAND(a, dest) N_NR(dest, a)
+#define M_IOR(a, dest) N_OR(dest, a)
+#define M_IXOR(a, dest) N_XR(dest, a)
 #define M_CVTFD(src,dst) N_LDEBR(dst, src)
 
 #define M_ISLL_IMM(imm,reg) N_SLL(reg, imm, RN) 
 #define M_INEG(a) _DEPR( M_INEG(a) )
 #define M_LNEG(a) _DEPR( M_LNEG(a) )
 
-#define M_IOR(a,b) _DEPR( M_IOR(a,b) )
-#define M_IXOR(a,b) _DEPR( M_IXOR(a,b) )
-
 #define M_IAND_IMM(a,b) _DEPR( M_IAND_IMM(a,b) )
 #define M_IOR_IMM(a,b) _DEPR( M_IOR_IMM(a,b) )
 #define M_IXOR_IMM(a,b) _DEPR( M_IXOR_IMM(a,b) )
 #define M_FST32(a,b,disp) _DEPR( M_FST32(a,b,disp) )
 #define M_DST32(a,b,disp) _DEPR( M_DST32(a,b,disp) )
 
-#define M_FADD(a,b) _DEPR( M_FADD(a,b) )
-#define M_DADD(a,b) _DEPR( M_DADD(a,b) )
-#define M_FSUB(a,b) _DEPR( M_FSUB(a,b) )
-#define M_DSUB(a,b) _DEPR( M_DSUB(a,b) )
-#define M_DMUL(a,b) _DEPR( M_DMUL(a,b) )
-#define M_FDIV(a,b) _DEPR( M_FDIV(a,b) )
-#define M_DDIV(a,b) _DEPR( M_DDIV(a,b) )
-
 #define M_CVTLF(a,b) _DEPR( M_CVTLF(a,b) )
 #define M_CVTLD(a,b) _DEPR( M_CVTLD(a,b) )
 #define M_CVTDI(a,b) _DEPR( M_CVTDI(a,b) )
index be037917d9f969b43171581b4ac928f58c859636..50b29fcb07aca4740a40f52028d674abc8ce33c0 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Christian Thalinger
 
-   $Id: emit.c 7534 2007-03-16 23:00:18Z pm $
+   $Id: emit.c 7581 2007-03-26 07:23:16Z pm $
 
 */
 
@@ -212,15 +212,15 @@ void emit_cmovxx(codegendata *cd, instruction *iptr, s4 s, s4 d)
 
 *******************************************************************************/
 
-void emit_exception_stubs(jitdata *jd)
+__PORTED__ void emit_exception_stubs(jitdata *jd)
 {
-#if 0
        codegendata  *cd;
        registerdata *rd;
        exceptionref *er;
        s4            branchmpc;
        s4            targetmpc;
        s4            targetdisp;
+       s4            disp;
 
        /* get required compiler data */
 
@@ -241,6 +241,8 @@ void emit_exception_stubs(jitdata *jd)
 
                MCODECHECK(512);
 
+               /* move index register into REG_ITMP1 */
+
                /* Check if the exception is an
                   ArrayIndexOutOfBoundsException.  If so, move index register
                   into a4. */
@@ -250,38 +252,57 @@ void emit_exception_stubs(jitdata *jd)
 
                /* calcuate exception address */
 
-               M_MOV_IMM(0, rd->argintregs[3]);
-               dseg_adddata(cd);
-               M_AADD_IMM32(er->branchpos - 6, rd->argintregs[3]);
+               if (N_VALID_DISP(er->branchpos - 4)) {
+                       M_LDA(rd->argintregs[3], REG_PV, er->branchpos - 4);
+               } else {
+                       M_INTMOVE(REG_PV, rd->argintregs[3]);
+                       M_AADD_IMM(er->branchpos - 4, REG_PV);
+               }
 
-               /* move function to call into REG_ITMP3 */
+               /* move function to call into REG_ITMP! */
 
-               M_MOV_IMM(er->function, REG_ITMP3);
+               disp = dseg_add_functionptr(cd, er->function);
+               M_ALD(REG_ITMP1, REG_PV, disp);
 
                if (targetdisp == 0) {
-                       targetdisp = cd->mcodeptr - cd->mcodebase;
+                       targetdisp = (cd->mcodeptr) - (cd->mcodebase);
 
-                       emit_lea_membase_reg(cd, RIP, -((cd->mcodeptr + 7) - cd->mcodebase), rd->argintregs[0]);
+                       M_MOV(REG_PV, rd->argintregs[0]);
                        M_MOV(REG_SP, rd->argintregs[1]);
-                       M_ALD(rd->argintregs[2], REG_SP, cd->stackframesize * 8);
 
-                       M_ASUB_IMM(2 * 8, REG_SP);
-                       M_AST(rd->argintregs[3], REG_SP, 0 * 8);             /* store XPC */
+                       M_ALD(rd->argintregs[2],
+                                 REG_SP, cd->stackframesize * 4 - SIZEOF_VOID_P);
+
+                       M_ASUB_IMM((2 * 4) + 96, REG_SP);       
+
+                       M_AST(rd->argintregs[3], REG_SP, (0 * 4) + 96); /* store XPC */
+
+                       M_MOV(REG_ITMP1, REG_PV);
+                       M_JSR(REG_RA, REG_PV);
+
+                       /* Recalculate PV */
 
-                       M_CALL(REG_ITMP3);
+                       N_BASR(REG_ITMP1, RN);
+                       disp = (s4) (cd->mcodeptr - cd->mcodebase);
+                       M_LDA(REG_PV, REG_ITMP1, -disp);
 
-                       M_ALD(REG_ITMP2_XPC, REG_SP, 0 * 8);
-                       M_AADD_IMM(2 * 8, REG_SP);
+                       M_MOV(REG_RESULT, REG_ITMP1_XPTR);
 
-                       M_MOV_IMM(asm_handle_exception, REG_ITMP3);
-                       M_JMP(REG_ITMP3);
+                       M_ALD(REG_ITMP2_XPC, REG_SP, (0 * 4) + 96);
+                       M_AADD_IMM((2 * 4) + 96, REG_SP);
+
+                       disp = dseg_add_functionptr(cd, asm_handle_exception);
+                       M_ALD(REG_ITMP3, REG_PV, disp);
+                       M_JMP(RN, REG_ITMP3);
                }
                else {
-                       M_JMP_IMM((cd->mcodebase + targetdisp) -
-                                         (cd->mcodeptr + PATCHER_CALL_SIZE));
+                       disp = ((cd->mcodebase) + targetdisp) -
+                               (( cd->mcodeptr) );
+
+                       M_BR(disp);
                }
+
        }
-#endif
 }
 
 
@@ -2450,6 +2471,28 @@ s4 emit_load_s2_notzero(jitdata *jd, instruction *iptr, s4 tempreg) {
        }
 }
 
+s4 emit_load_s1_but(jitdata *jd, instruction *iptr, s4 tempreg, s4 notreg) {
+       codegendata *cd = jd->cd;
+       s4 reg = emit_load_s1(jd, iptr, tempreg);
+       if (reg == notreg) {
+               M_MOV(reg, tempreg);
+               return tempreg;
+       } else {
+               return reg;
+       }
+}
+
+s4 emit_load_s2_but(jitdata *jd, instruction *iptr, s4 tempreg, s4 notreg) {
+       codegendata *cd = jd->cd;
+       s4 reg = emit_load_s2(jd, iptr, tempreg);
+       if (reg == notreg) {
+               M_MOV(reg, tempreg);
+               return tempreg;
+       } else {
+               return reg;
+       }
+}
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where
index d7feabd11f4aa49afb339ac064d1d09dcbd59033..13bfedba3822ccb2aebedbe8e65b2f00dfb8b5d3 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: emit.h 7486 2007-03-08 13:50:07Z twisti $
+   $Id: emit.h 7581 2007-03-26 07:23:16Z pm $
 
 */
 
@@ -360,6 +360,9 @@ void emit_rdtsc(codegendata *cd);
 s4 emit_load_s1_notzero(jitdata *jd, instruction *iptr, s4 tempreg);
 s4 emit_load_s2_notzero(jitdata *jd, instruction *iptr, s4 tempreg);
 
+s4 emit_load_s1_but(jitdata *jd, instruction *iptr, s4 tempreg, s4 notreg);
+s4 emit_load_s2_but(jitdata *jd, instruction *iptr, s4 tempreg, s4 notreg);
+
 #endif /* _MD_EMIT_H */
 
 
index b3841b6eb75d4555bf83725f37e2308f5c7a1f35..4cc4992c6fb6344395203d96ebc2fc8b17bc61ea 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: md-abi.c 7534 2007-03-16 23:00:18Z pm $
+   $Id: md-abi.c 7581 2007-03-26 07:23:16Z pm $
 
 */
 
@@ -81,7 +81,7 @@ const s4 abi_registers_integer_temporary[] = {
 };
 
 s4 nregdescfloat[] = {
-       REG_ARG, REG_TMP, REG_ARG, REG_TMP, REG_SAV, REG_TMP, REG_SAV, REG_TMP,
+       REG_ARG, REG_TMP, REG_ARG, REG_TMP, REG_RES, REG_TMP, REG_RES, REG_TMP,
        REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
     REG_END
 };
@@ -92,8 +92,8 @@ const s4 abi_registers_float_argument[] = {
 };
 
 const s4 abi_registers_float_saved[] = {
-       4, /* f4/fs0 */
-       6  /* f6/fs0 */
+       /* nothing */
+       -1
 };
 
 const s4 abi_registers_float_temporary[] = {
index ff0bcba699e25a07abc1cbeaf55108386ea2e4db..7f74b788aeac871426f846db78a82fae29b36be6 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: md-abi.h 7486 2007-03-08 13:50:07Z twisti $
+   $Id: md-abi.h 7581 2007-03-26 07:23:16Z pm $
 
 */
 
 
 #define REG_FRESULT     F0       /* to deliver floating point method results  */
 
-#define REG_FTMP1       F1       /* temporary floating point register         */
-#define REG_FTMP2       F3       /* temporary floating point register         */
-#define REG_FTMP3       F5       /* temporary floating point register         */
+#define REG_FTMP1       F4       /* temporary floating point register         */
+#define REG_FTMP2       F6       /* temporary floating point register         */
+/* No ftmp3 */
+/* #define REG_FTMP3       F5 */       /* temporary floating point register         */
 
 #define __REG_IFTMP       10       /* temporary integer and floating point register */
 
 #define INT_RES_CNT     5        /* number of integer reserved registers      */
 
 #define FLT_REG_CNT     16       /* number of float registers                 */
-#define FLT_SAV_CNT     2        /* number of float callee saved registers    */
+#define FLT_SAV_CNT     0        /* number of float callee saved registers    */
 #define FLT_ARG_CNT     2        /* number of float argument registers        */
 #define FLT_TMP_CNT     12        /* number of float temporary registers       */
-#define FLT_RES_CNT     0        /* number of float reserved registers        */
+#define FLT_RES_CNT     2        /* number of float reserved registers        */
 
 #define TRACE_ARGS_NUM  8
 
index 1a3e1ba637e9391fecb39b81b1cf310f988c5c0b..e3d250353b175726564b2aa8bd535bea699f3e68 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Edwin Steiner
 
-   $Id: md.c 7534 2007-03-16 23:00:18Z pm $
+   $Id: md.c 7581 2007-03-26 07:23:16Z pm $
 
 */
 
@@ -69,6 +69,7 @@
 #endif
 
 #include "vm/jit/codegen-common.h"
+#include "vm/jit/s390/codegen.h"
 
 #include <assert.h>
 #define OOPS() assert(0);
@@ -224,7 +225,7 @@ void md_codegen_patch_branch(codegendata *cd, s4 branchmpc, s4 targetmpc)
        disp += 4; /* size of branch */
        disp /= 2; /* specified in halfwords */
 
-       /* TODO check for overflow */
+       ASSERT_VALID_BRANCH(disp);      
 
        /* patch the branch instruction before the mcodeptr */
 
index 3cbe3a4b3015b55126adb429c911ae7edbec801b..74a38211837300af907f4b979ab55ce1a45775c2 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: patcher.c 7534 2007-03-16 23:00:18Z pm $
+   $Id: patcher.c 7581 2007-03-26 07:23:16Z pm $
 
 */
 
@@ -803,14 +803,24 @@ bool patcher_checkcast_instanceof_interface(u1 *sp)
 
        /* From here, split your editor and open codegen.c */
 
-       if ((*(ra + 1) >> 4) == REG_ITMP1) { /* First M_ALD is into ITMP1 */
-               /* INSTANCEOF code */
-               *(u4 *)(ra + SZ_L + SZ_L) |= (u2)(s2)(- c->index);
-               *(u4 *)(ra + SZ_L + SZ_L + SZ_AHI + SZ_BRC) |=
-                       (u2)(s2)(OFFSET(vftbl_t, interfacetable[0]) -
-                               c->index * sizeof(methodptr*));
-       } else {
-               OOPS();
+       switch (*(ra + 1) >> 4) {
+               case REG_ITMP1: 
+                       /* First M_ALD is into ITMP1 */
+                       /* INSTANCEOF code */
+               case REG_ITMP2:
+                       /* First M_ALD is into ITMP1 */
+                       /* CHECKCAST code */
+
+                       *(u4 *)(ra + SZ_L + SZ_L) |= (u2)(s2)(- c->index);
+                       *(u4 *)(ra + SZ_L + SZ_L + SZ_AHI + SZ_BRC) |=
+                               (u2)(s2)(OFFSET(vftbl_t, interfacetable[0]) -
+                                       c->index * sizeof(methodptr*));
+
+                       break;
+
+               default:
+                       assert(0);
+                       break;
        }
 
        return true;
index c899299c11f1b9a22e84a6c7bb37d7e4653a51b1..cc367379b35a520c22b07dd14a6f9fd59f0a0a50 100644 (file)
@@ -10,7 +10,7 @@ class tests {
        static char s_c, s_c1;
        static short s_s, s_s1;
        static long s_l, s_l1, s_l2;
-       static double s_d, s_d1;
+       static double s_d, s_d1, s_d2;
        static boolean s_b;
        static Object s_a;
        static final char[] s_ca = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
@@ -19,6 +19,13 @@ class tests {
        static Object s_a0 = s_as0, s_a1 = s_as1, s_a2 = s_as2;
        static Object[] s_aa = { s_a0, s_a1, s_a2 };
        static Object[] s_aa2 = { null, null, null };
+       static byte[] s_bya = { 10, 11, 12, 13, 14, 15 };
+       static byte[] s_bya2 = { 0, 1, 2, 3};
+       static byte s_by, s_by1;
+       static short[] s_sa2 = { 0, 1, 2, 3};
+       static short[] s_sa = { 10, 11, 12, 13, 14, 15 };
+       static int[] s_ia2 = { 0, 1, 2, 3 };
+       static int[] s_ia = { 10, 11, 12, 13, 14, 15 };
 
        static class members {
                char c;
@@ -269,6 +276,56 @@ class tests {
                TEST(s_f == 113.37f);
        }
 
+       static void test_DMUL() {
+               s_d1 = 1.1337;
+               s_d2 = 100.0;
+               s_d = s_d1 * s_d2;
+               TEST(s_d == 113.37);
+               System.out.println(s_d);
+       }
+
+       static void test_FDIV() {
+               s_f1 = 113.37f;
+               s_f2 = 100.0f;
+               s_f = s_f1 / s_f2;
+               TEST(s_f == 1.1337f);
+       }
+
+       static void test_DDIV() {
+               s_d1 = 113.37;
+               s_d2 = 100.0;
+               s_d = s_d1 / s_d2;
+               TEST(s_d == 1.1337);
+       }
+
+       static void test_FSUB() {
+               s_f1 = 1.1337f;
+               s_f2 = 0.033f;
+               s_f = s_f1 - s_f2;
+               TEST(s_f == 1.1007f);
+       }
+
+       static void test_DSUB() {
+               s_d1 = 1.1337;
+               s_d2 = 0.033;
+               s_d = s_d1 - s_d2;
+               TEST(s_d == 1.1007);
+       }
+
+       static void test_FADD() {
+               s_f1 = 1.1006f;
+               s_f2 = 0.0331f;
+               s_f = s_f1 + s_f2;
+               TEST(s_f == 1.1337f);
+       }
+
+       static void test_DADD() {
+               s_d1 = 1007.1;
+               s_d2 = 0330.0;
+               s_d = s_d1 + s_d2;
+               TEST(s_d == 1337.1);
+       }
+
        static void test_I2F() {
                s_i = 1234567;
                s_f = (float)s_i;
@@ -375,6 +432,21 @@ class tests {
                TEST(s_c == '4');
        }
 
+       static void test_BALOAD() {
+               s_by = s_bya[3];
+               TEST(s_by == 13);
+       }
+
+       static void test_SALOAD() {
+               s_s = s_sa[4];
+               TEST(s_s == 14);
+       }
+
+       static void test_IALOAD() {
+               s_i = s_ia[4];
+               TEST(s_i == 14);
+       }
+
        static void test_AALOAD() {
                s_a = s_aa[1];
                TEST(s_a != s_a0);
@@ -387,6 +459,27 @@ class tests {
                TEST(s_c == 'X');
        }
 
+       static void test_BASTORE() {
+               s_by1 = 77;
+               s_bya2[1] = s_by1;
+               s_by = s_bya2[1];
+               TEST(s_by == 77);
+       }
+
+       static void test_SASTORE() {
+               s_s1 = (short)0xbcde;
+               s_sa2[2] = s_s1;
+               s_s = s_sa2[2];
+               TEST(s_s == (short)0xbcde);
+       }
+
+       static void test_IASTORE() {
+               s_i1 = 0xbcde1234;
+               s_ia2[2] = s_i1;
+               s_i = s_ia2[2];
+               TEST(s_i == 0xbcde1234);
+       }
+
        static void test_AASTORE() {
                s_aa2[1] = s_a1;
                s_a = s_aa2[1];
@@ -644,7 +737,7 @@ class tests {
                RTEST(f, 1337.1f);
                RTEST(d, 1983.1975);
 
-#              under RTEST
+#              undef RTEST
        }
 
        static interface i1 { };
@@ -672,8 +765,86 @@ class tests {
                TEST(! (x instanceof java.lang.String));
                TEST(x instanceof java.lang.Object);
        }
+
+       static void test_CHECKCAST() {
+               Object x = new c3();
+
+#              define TESTCAST(klass, res) \
+                       s_b = true; \
+                       try { \
+                               klass y = (klass)x; \
+                       } catch (ClassCastException e) { \
+                               s_b = false; \
+                       } \
+                       TEST(s_b == res);
+
+               TESTCAST(i1, true);
+               TESTCAST(i2, true);
+               TESTCAST(i3, true);
+               TESTCAST(i4, true);
+               TESTCAST(i5, false);
+               TESTCAST(java.lang.Runnable, false);
+               TESTCAST(c1, true);
+               TESTCAST(c2, true);
+               TESTCAST(c3, true);
+               TESTCAST(c4, false);
+               TESTCAST(java.lang.String, false);
+               TESTCAST(java.lang.Object, true);
+
+#              undef TESTCAST
+       }
        
+
+       static void test_emit_exception_stubs() {
+               s_b = false;
+               try {
+                       s_c = s_ca[10]; 
+               } catch (ArrayIndexOutOfBoundsException e) {
+                       s_b = true;
+               }
+               TEST(s_b);
+               s_b = false;
+               try {
+                       s_a = s_aa[10];
+               } catch (ArrayIndexOutOfBoundsException e) {
+                       s_b = true;
+               }
+               TEST(s_b);
+       }
+
+       static void test_IAND() {
+               s_i1 =      0xcccccccc;
+               s_i2 =      0x0f080400;
+               s_i = s_i1 & s_i2;
+               TEST(s_i == 0x0c080400);
+       }
+       static void test_IOR() {
+               s_i1 =      0x0a0b0c1d;
+               s_i2 =      0x10203040;
+               s_i = s_i1 | s_i2;
+               TEST(s_i == 0x1a2b3c5d);
+       }
+       static void test_IXOR() {
+               s_i1 =      0x0f0f1700;
+               s_i2 =      0xf00f3300;
+               s_i = s_i1 ^ s_i2;
+               TEST(s_i == 0xff002400);
+
+               // xor swapping algorithm
+
+               s_i1 = 0xa75bced8;
+               s_i2 = 0x1458aa56;
+
+               s_i1 ^= s_i2;
+               s_i2 ^= s_i1;
+               s_i1 ^= s_i2;
+
+               TEST(s_i2 == 0xa75bced8);
+               TEST(s_i1 == 0x1458aa56);
+       }
+
        static void main(String[] args) {
+               /*
                test_ICONST();
                test_FCONST();
                test_INEG();
@@ -685,7 +856,6 @@ class tests {
                test_IMULCONST();
                test_IDIV();
                test_IREM();
-               test_FMUL();
                test_I2F();
                test_I2D();
                test_F2I();
@@ -705,6 +875,26 @@ class tests {
                test_IF_ACMPXX();
                test_XRETURN();
                test_INSTANCEOF();
+               test_emit_exception_stubs();
+               test_CHECKCAST();
+               test_IAND();
+               test_IOR();
+               test_IXOR();
+               test_BASTORE();
+               test_BALOAD();
+               test_SASTORE();
+               test_SALOAD();
+               test_IALOAD();
+               test_IASTORE();
+               */
+               test_FADD();
+               test_FMUL();
+               test_FSUB();
+               test_FDIV();
+               test_DADD();
+               test_DMUL();
+               test_DSUB();
+               test_DDIV();
 
                summary();
        }
index a9e7ad938de94728bd085a2528090b4a26a6f78e..6bccb88c61754200bc44b79f63652f2597ace7ae 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: class.c 7563 2007-03-23 21:33:53Z twisti $
+   $Id: class.c 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index 312ef0aa5aa888c162babd29ec7a61bded7cea18..19939b9b21636897e18af5e3e697249b2685d36e 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: class.h 7563 2007-03-23 21:33:53Z twisti $
+   $Id: class.h 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index 0b26cc5c1e99b8b9cbdd133021c8267083c89087..f1294f88a98ef2fcf72d312259d1152f590d2f36 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: classcache.c 7560 2007-03-23 18:51:41Z twisti $
+   $Id: classcache.c 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index 4bd8aacf82faa09ea6bc8d30e7d9df61ad933862..6967034a501398f467373bc4202abd5fd96623ce 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: linker.c 7561 2007-03-23 19:10:35Z twisti $
+   $Id: linker.c 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index f9dc0924e77fa14e44936be839ea374ff66ade46..f7bec652b8c72ad1116496f1b1319602d303170d 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: method.c 7573 2007-03-25 18:55:02Z twisti $
+   $Id: method.c 7577 2007-03-25 20:55:06Z twisti $
 
 */
 
index ea02e1a3959bea4ad4dc70f68cc90779d9aa5285..e02edbe31650ed7932c9d90d098eb3e8e9e181a1 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: method.h 7575 2007-03-25 20:30:50Z twisti $
+   $Id: method.h 7577 2007-03-25 20:55:06Z twisti $
 */