* src/vm/jit/s390/emit.c,
authorpm <none@none>
Fri, 2 Mar 2007 23:28:37 +0000 (23:28 +0000)
committerpm <none@none>
Fri, 2 Mar 2007 23:28:37 +0000 (23:28 +0000)
src/vm/jit/s390/codegen.c,
src/vm/jit/s390/codegen.h,
src/vm/jit/s390/md-asm.h,
src/vm/jit/s390/patcher.c,
src/vm/jit/s390/asmpart.S: Changed a lot in S390 codegen.

25 files changed:
configure.ac
src/native/vm/gnu/java_lang_reflect_Constructor.c
src/native/vm/gnu/java_lang_reflect_Field.c
src/native/vm/gnu/java_lang_reflect_Method.c
src/vm/access.c
src/vm/access.h
src/vm/jit/alpha/patcher.c
src/vm/jit/arm/patcher.c
src/vm/jit/i386/patcher.c
src/vm/jit/mips/patcher.c
src/vm/jit/powerpc/patcher.c
src/vm/jit/powerpc64/patcher.c
src/vm/jit/s390/asmpart.S
src/vm/jit/s390/codegen.c
src/vm/jit/s390/codegen.h
src/vm/jit/s390/emit.c
src/vm/jit/s390/md-asm.h
src/vm/jit/s390/patcher.c
src/vm/jit/stack.c
src/vm/jit/verify/typecheck.c
src/vm/jit/x86_64/patcher.c
src/vmcore/classcache.c
src/vmcore/resolve.c
src/vmcore/resolve.h
tests/regression/Makefile.am

index c2ca770c0ffaab9c23037250ded6543161a94b36..05284e9099bc4a68726a95941f2c8a17c058d101 100644 (file)
@@ -22,7 +22,7 @@ dnl along with this program; if not, write to the Free Software
 dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 dnl 02110-1301, USA.
 dnl 
-dnl $Id: configure.ac 7434 2007-03-02 19:44:53Z edwin $
+dnl $Id: configure.ac 7441 2007-03-02 23:13:10Z michi $
 
 dnl Process this file with autoconf to produce a configure script.
 
index 67eaccf2906ecca37675e2985af4dc0348b67f6b..d2fa2eaac92e5c04b13b446267782d8cc8cff0a0 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_reflect_Constructor.c 7418 2007-02-28 20:07:06Z twisti $
+   $Id: java_lang_reflect_Constructor.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 738c9059a226ca182873e3c302b0404734326ce6..6290ddbaa11a2924458f571fafc30d43c35e6a5d 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_reflect_Field.c 7418 2007-02-28 20:07:06Z twisti $
+   $Id: java_lang_reflect_Field.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index a8dceef1646c8fb9da1e85d6d45f3db5ecf6c963..2d5ac85e07a31d786f13a57c8dc5c820b23633b1 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_reflect_Method.c 7418 2007-02-28 20:07:06Z twisti $
+   $Id: java_lang_reflect_Method.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index fffe32c5e3c70e9bab312f66621e4bb024beb827..45e8548bcd3d03721ea65e3c8c0a6f421f0a9439 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: access.c 7418 2007-02-28 20:07:06Z twisti $
+   $Id: access.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 66a968810069b8d9d0b79d6a11f3e206d1fffbf8..e2b867be1d64626641f4a536a88dab122da571e9 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: access.h 7419 2007-02-28 22:00:50Z twisti $
+   $Id: access.h 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index e115a60dc793e1080dc4fdcc5dc7bc9a2207cfa5..053166a6671fddcf981fc8e3f64423c987aa1e70 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.c 7431 2007-03-01 13:49:14Z edwin $
+   $Id: patcher.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 1514e53e6b303f74a4b05038492969773d1e5e7c..cd99711779eb23863a41490637d213b909e8a319 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.c 7431 2007-03-01 13:49:14Z edwin $
+   $Id: patcher.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 79427214b74ae92b3bb291f207576d21e0c809e3..92db1dd494cac79ace16a6d982d891a60de03ab3 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.c 7431 2007-03-01 13:49:14Z edwin $
+   $Id: patcher.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 61f2d51091eace981729441329380c4985cfb724..8b8f454fec4638bc1febed371f52857079ef241e 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.c 7431 2007-03-01 13:49:14Z edwin $
+   $Id: patcher.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index bbba80d2dc8b8868c87ba605a959a0e557806a60..abfb8aa186debd07854ac33c3ff8654ae1d5e24c 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.c 7431 2007-03-01 13:49:14Z edwin $
+   $Id: patcher.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index b19c870b11c01dec4641b6a263c71d7841c4c7ae..3b53da79d03c4cdf0453e207c045b55d64a7e79e 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.c 7431 2007-03-01 13:49:14Z edwin $
+   $Id: patcher.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 121bc77f02778c9a4a1675b64dbacce0545373a7..9da2c79b4e89ef978e84141118fb5e511891ac82 100644 (file)
@@ -30,7 +30,7 @@
 
    Changes: Edwin Steiner
 
-   $Id: asmpart.S 7414 2007-02-28 07:22:04Z pm $
+   $Id: asmpart.S 7442 2007-03-02 23:28:37Z pm $
 
 */
 
@@ -412,6 +412,7 @@ L_avcmeh_bras:
 
 L_no_args:
        lr    s3, sp
+       lhi   s4, 0
        j     L_copy_done
 
 L_handle_i0:
@@ -1010,7 +1011,7 @@ asm_criticalsections:
        .long   _crit_end
        .long   _crit_restart
 #endif
-       .quad 0
+       .long 0
 
 
 /* Disable exec-stacks, required for Gentoo ***********************************/
index 17a3cc9998867f660cfc813a3ad5b4808d1b2dcf..97bf793ebe31498aab7d9d637cf98fee0187a572 100644 (file)
@@ -29,7 +29,7 @@
             Christian Ullrich
             Edwin Steiner
 
-   $Id: codegen.c 7414 2007-02-28 07:22:04Z pm $
+   $Id: codegen.c 7442 2007-03-02 23:28:37Z pm $
 
 */
 
@@ -81,6 +81,8 @@
 
 #define OOPS() assert(0);
 
+void panic() { }
+
 #if 0
 u1 *createcompilerstub(methodinfo *m) {
        OOPS();
@@ -602,14 +604,12 @@ bool codegen(jitdata *jd)
                /* integer operations *************************************************/
 
                case ICMD_INEG:       /* ..., value  ==> ..., - value                 */
-                       OOPS();
-#if 0
+
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1); 
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
-                       M_INTMOVE(s1, d);
-                       M_INEG(d);
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+                       N_LCR(d, s1);
                        emit_store_dst(jd, iptr, d);
-#endif
+
                        break;
 
                case ICMD_LNEG:       /* ..., value  ==> ..., - value                 */
@@ -696,6 +696,7 @@ bool codegen(jitdata *jd)
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
 
                        M_INTMOVE(s1, d);
+                       /* TODO range !! */
                        M_IADD_IMM(iptr->sx.val.i, d);
                        emit_store_dst(jd, iptr, d);
                        break;
@@ -734,7 +735,7 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_ISUB:       /* ..., 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);
@@ -752,14 +753,14 @@ bool codegen(jitdata *jd)
 
                case ICMD_ISUBCONST:  /* ..., value  ==> ..., value + constant        */
                                      /* sx.val.i = constant                             */
-                       OOPS();
-#if 0
+
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
                        M_INTMOVE(s1, d);
+                       /* TODO range */
                        M_ISUB_IMM(iptr->sx.val.i, d);
                        emit_store_dst(jd, iptr, d);
-#endif
+
                        break;
 
                case ICMD_LSUB:       /* ..., val1, val2  ==> ..., val1 - val2        */
@@ -862,101 +863,33 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_IDIV:       /* ..., val1, val2  ==> ..., val1 / val2        */
-                       OOPS();
-#if 0
-                       var1 = VAROP(iptr->s1);
-                       var2 = VAROP(iptr->sx.s23.s2);
-                       dst  = VAROP(iptr->dst);
-
-                       d = codegen_reg_of_dst(jd, iptr, REG_NULL);
-                       if (IS_INMEMORY(var1->flags))
-                               M_ILD(RAX, REG_SP, var1->vv.regoff * 8);
-                       else
-                               M_INTMOVE(var1->vv.regoff, RAX);
-                       
-                       if (IS_INMEMORY(var2->flags))
-                               M_ILD(REG_ITMP3, REG_SP, var2->vv.regoff * 8);
-                       else
-                               M_INTMOVE(var2->vv.regoff, REG_ITMP3);
-                       
-                       if (checknull) {
-                               M_ITEST(REG_ITMP3);
-                               M_BEQ(0);
-                               codegen_add_arithmeticexception_ref(cd);
-                       }
-
-                       emit_alul_imm_reg(cd, ALU_CMP, 0x80000000, RAX); /* check as described in jvm spec */
-                       emit_jcc(cd, CC_NE, 4 + 6);
-                       emit_alul_imm_reg(cd, ALU_CMP, -1, REG_ITMP3);    /* 4 bytes */
-                       emit_jcc(cd, CC_E, 3 + 1 + 3);                /* 6 bytes */
-
-                       emit_mov_reg_reg(cd, RDX, REG_ITMP2); /* save %rdx, cause it's an argument register */
-                       emit_cltd(cd);
-                       emit_idivl_reg(cd, REG_ITMP3);
-
-                       if (IS_INMEMORY(dst->flags)) {
-                               emit_mov_reg_membase(cd, RAX, REG_SP, dst->vv.regoff * 8);
-                               emit_mov_reg_reg(cd, REG_ITMP2, RDX);       /* restore %rdx */
-
-                       } else {
-                               M_INTMOVE(RAX, dst->vv.regoff);
-
-                               if (dst->vv.regoff != RDX) {
-                                       emit_mov_reg_reg(cd, REG_ITMP2, RDX);   /* restore %rdx */
-                               }
-                       }
-#endif
-                       break;
-
                case ICMD_IREM:       /* ..., val1, val2  ==> ..., val1 % val2        */
-                       OOPS();
-#if 0
-                       var1 = VAROP(iptr->s1);
-                       var2 = VAROP(iptr->sx.s23.s2);
-                       dst  = VAROP(iptr->dst);
 
-                       d = codegen_reg_of_dst(jd, iptr, REG_NULL);
-                       if (IS_INMEMORY(var1->flags))
-                               M_ILD(RAX, REG_SP, var1->vv.regoff * 8);
-                       else
-                               M_INTMOVE(var1->vv.regoff, RAX);
-                       
-                       if (IS_INMEMORY(var2->flags))
-                               M_ILD(REG_ITMP3, REG_SP, var2->vv.regoff * 8);
-                       else
-                               M_INTMOVE(var2->vv.regoff, REG_ITMP3);
-
-                       if (checknull) {
-                               M_ITEST(REG_ITMP3);
-                               M_BEQ(0);
-                               codegen_add_arithmeticexception_ref(cd);
-                       }
-
-                       emit_mov_reg_reg(cd, RDX, REG_ITMP2); /* save %rdx, cause it's an argument register */
-
-                       emit_alul_imm_reg(cd, ALU_CMP, 0x80000000, RAX); /* check as described in jvm spec */
-                       emit_jcc(cd, CC_NE, 2 + 4 + 6);
+                       /* For this operation we need a register pair.
+                        * We will use r0 and itmp1 and will backup r0.
+                        */
 
+                       M_INTMOVE(R0, REG_ITMP3);
 
-                       emit_alul_reg_reg(cd, ALU_XOR, RDX, RDX);         /* 2 bytes */
-                       emit_alul_imm_reg(cd, ALU_CMP, -1, REG_ITMP3);    /* 4 bytes */
-                       emit_jcc(cd, CC_E, 1 + 3);                    /* 6 bytes */
+                       s1 = emit_load_s1(jd, iptr, R0);
+                       M_INTMOVE(s1, R0);
+                       N_LHI(REG_ITMP1, 0);
+                       N_SRDA(R0, 32, RN);
 
-                       emit_cltd(cd);
-                       emit_idivl_reg(cd, REG_ITMP3);
+                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
 
-                       if (IS_INMEMORY(dst->flags)) {
-                               emit_mov_reg_membase(cd, RDX, REG_SP, dst->vv.regoff * 8);
-                               emit_mov_reg_reg(cd, REG_ITMP2, RDX);       /* restore %rdx */
+                       N_DR(R0, s2);
 
+                       if (iptr->opc == ICMD_IREM) {
+                               d = codegen_reg_of_dst(jd, iptr, R0);
+                               M_INTMOVE(R0, d);
                        } else {
-                               M_INTMOVE(RDX, dst->vv.regoff);
-
-                               if (dst->vv.regoff != RDX) {
-                                       emit_mov_reg_reg(cd, REG_ITMP2, RDX);   /* restore %rdx */
-                               }
+                               d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
+                               M_INTMOVE(REG_ITMP1, d);
                        }
-#endif
+
+                       emit_store_dst(jd, iptr, d);
+
                        break;
 
                case ICMD_IDIVPOW2:   /* ..., value  ==> ..., value >> constant       */
@@ -1694,13 +1627,10 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_F2D:       /* ..., value  ==> ..., (double) value           */
-                       OOPS();
-#if 0
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
                        M_CVTFD(s1, d);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_D2F:       /* ..., value  ==> ..., (float) value            */
@@ -1715,7 +1645,6 @@ bool codegen(jitdata *jd)
 
                case ICMD_FCMPL:      /* ..., val1, val2  ==> ..., val1 fcmpl val2    */
                                          /* == => 0, < => 1, > => -1 */
-                                                         /* ICMD_FCMPL: s1 < s2 -> d := 1 */ /* TODO is this correct ? */
 
 
                case ICMD_FCMPG:      /* ..., val1, val2  ==> ..., val1 fcmpg val2    */
@@ -1731,11 +1660,11 @@ bool codegen(jitdata *jd)
                        M_BLT(SZ_BRC + SZ_BRC + SZ_LHI + SZ_BRC);
                        M_BEQ(SZ_BRC + SZ_LHI + SZ_BRC + SZ_LHI + SZ_BRC);
 
-                       N_LHI(d, iptr->opc == ICMD_FCMPL ? -1 : 1); /* s1 > s2 */
+                       N_LHI(d, iptr->opc == ICMD_FCMPL ? 1 : -1); /* GT */
                        M_BR(SZ_BRC + SZ_LHI + SZ_BRC + SZ_LHI);
-                       N_LHI(d, iptr->opc == ICMD_FCMPL ? 1 : -1); /* s1 < s2 */
+                       N_LHI(d, iptr->opc == ICMD_FCMPL ? -1 : 1); /* LT */
                        M_BR(SZ_BRC + SZ_LHI);
-                       N_LHI(d, 0); /* s1 == s2 */
+                       N_LHI(d, 0); /* EQ */
 
                        emit_store_dst(jd, iptr, d);
 
@@ -1922,17 +1851,17 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_CASTORE:    /* ..., 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;
-                       }
+                       emit_array_checks(cd, iptr, s1, s2);
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
-                       emit_movw_reg_memindex(cd, s3, OFFSET(java_chararray, data[0]), s1, s2, 1);
-#endif
+
+                       M_INTMOVE(s2, REG_ITMP2);
+                       N_SLL(REG_ITMP2, 1, RN);
+
+                       N_STH(s3, OFFSET(java_chararray, data[0]), REG_ITMP2, s1);
+
                        break;
 
                case ICMD_SASTORE:    /* ..., arrayref, index, value  ==> ...         */
@@ -2638,7 +2567,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       M_ICMP(s2, s1);
+                       M_ICMP(s1, s2);
                        M_BNE(0);
                        codegen_add_branch_ref(cd, iptr->dst.block);
 
@@ -2660,7 +2589,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       M_ICMP(s2, s1);
+                       M_ICMP(s1, s2);
                        M_BLT(0);
                        codegen_add_branch_ref(cd, iptr->dst.block);
 
@@ -2682,7 +2611,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       M_ICMP(s2, s1);
+                       M_ICMP(s1, s2);
                        M_BGT(0);
                        codegen_add_branch_ref(cd, iptr->dst.block);
 
@@ -2704,7 +2633,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       M_ICMP(s2, s1);
+                       M_ICMP(s1, s2);
                        M_BLE(0);
                        codegen_add_branch_ref(cd, iptr->dst.block);
 
@@ -2731,7 +2660,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-                       M_ICMP(s2, s1);
+                       M_ICMP(s1, s2);
                        M_BGE(0);
                        codegen_add_branch_ref(cd, iptr->dst.block);
 
@@ -3032,7 +2961,7 @@ gen_method:
                        case ICMD_BUILTIN:
                                disp = dseg_add_functionptr(cd, bte->fp);
 
-                               N_AHI(REG_SP, -96); /* register save are required by C abi */   
+                               N_AHI(REG_SP, -96); /* register save area as required by C abi */       
                                N_LHI(REG_ITMP1, disp);
                                N_L(REG_PV, 0, REG_ITMP1, REG_PV);
                                break;
@@ -3076,6 +3005,12 @@ gen_method:
                        case ICMD_INVOKEINTERFACE:
                                emit_nullpointer_check(cd, iptr, REG_A0);
 
+                               /* s1 will be negative here, so use (0xFFF + s1) as displacement
+                                * and -0xFFF in index register (itmp1)
+                                */
+
+                               N_LHI(REG_ITMP1, -0xFFF);
+
                                if (lm == NULL) {
                                        codegen_addpatchref(cd, PATCHER_invokeinterface, um, 0);
 
@@ -3084,13 +3019,14 @@ gen_method:
                                }
                                else {
                                        s1 = OFFSET(vftbl_t, interfacetable[0]) -
-                                               sizeof(methodptr*) * lm->class->index;
+                                               sizeof(methodptr*) * lm->class->index +
+                                               0xFFF;
 
                                        s2 = sizeof(methodptr) * (lm - lm->class->methods);
                                }
 
                                M_ALD(REG_METHODPTR, REG_A0, OFFSET(java_objectheader, vftbl));
-                               M_ALD(REG_METHODPTR, REG_METHODPTR, s1);
+                               N_L(REG_METHODPTR, s1, REG_ITMP1, REG_METHODPTR);
                                M_ALD(REG_PV, REG_METHODPTR, s2);
                                break;
                        }
@@ -3864,9 +3800,9 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
                                } else {
                                        s2 = nmd->params[j].regoff;
                                        if (IS_2_WORD_TYPE(t)) {
-                                               N_LM(GET_LOW_REG(s1), GET_HIGH_REG(s1), 96 + (s2 * 4), REG_SP);
+                                               N_STM(GET_LOW_REG(s1), GET_HIGH_REG(s1), 96 + (s2 * 4), REG_SP);
                                        } else {
-                                               N_L(s1, 96 + (s2 * 4), RN, REG_SP);
+                                               N_ST(s1, 96 + (s2 * 4), RN, REG_SP);
                                        }
                                }
 
@@ -3986,17 +3922,17 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
        /* handle exception */
 
-       N_LONG_0();
-
-#if 0
        M_MOV(REG_ITMP3, REG_ITMP1_XPTR);
-       M_ALD(REG_ITMP2_XPC, REG_SP, 0 * 8);     /* get return address from stack */
+       M_ALD(REG_ITMP2_XPC, REG_SP, (cd->stackframesize - 1) * 4);     /* get return address from stack */
+#if 0
+       /* TODO */
        M_ASUB_IMM(3, REG_ITMP2_XPC);                                    /* callq */
-
-       M_MOV_IMM(asm_handle_nat_exception, REG_ITMP3);
-       M_JMP(REG_ITMP3);
-
 #endif
+       disp = dseg_add_functionptr(cd, /*asm_handle_nat_exception*/ panic);
+       N_AHI(REG_SP, 96);
+       M_ALD(REG_ITMP3, REG_PV, disp);
+       M_JMP(RN, REG_ITMP3);
+
        /* generate patcher stubs */
 
        emit_patcher_stubs(jd);
index d0561983d0efcdc6056f978f7f4a6e7ba9ed919b..bcb52feebe439546588b9fff28f9ea3a8b126a7c 100644 (file)
@@ -27,7 +27,7 @@
    Authors: Andreas Krall
             Christian Thalinger
 
-   $Id: codegen.h 7407 2007-02-26 19:12:03Z michi $
+   $Id: codegen.h 7442 2007-03-02 23:28:37Z pm $
 
 */
 
 #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_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_MEEBR(r1, r2) N_RRE(0xB317, r1, r2)
 #define N_MDBR(r1, r2) N_RRE(0xB31C, r1, r2)
 #define N_MXBR(r1, r2) N_RRE(0xB34C, r1, r2)
 #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_CVTFD(src,dst) N_LDEBR(dst, src)
 
 #define ICONST(reg, i) \
        do { \
 #define M_CVTFL(a,b) _DEPR( M_CVTFL(a,b) )
 #define M_CVTDL(a,b) _DEPR( M_CVTDL(a,b) )
 
-#define M_CVTFD(a,b) _DEPR( M_CVTFD(a,b) )
 #define M_CVTDF(a,b) _DEPR( M_CVTDF(a,b) )
 
 
index 4e91c158311821a23b297719670defda2a0b1b27..0a4f73da8f9f06bb044ec5a35931916f03ddcf8c 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Christian Thalinger
 
-   $Id: emit.c 7355 2007-02-14 10:57:32Z twisti $
+   $Id: emit.c 7442 2007-03-02 23:28:37Z pm $
 
 */
 
@@ -52,6 +52,8 @@
 #include "vm/jit/emit-common.h"
 #include "vm/jit/jit.h"
 #include "vm/jit/replace.h"
+#include "vm/global.h"
+#include "mm/memory.h"
 
 #define __PORTED__
 
@@ -2314,16 +2316,13 @@ __PORTED__ void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 re
 
 *******************************************************************************/
 
-void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2)
+__PORTED__ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2)
 {
-#if 0
        if (INSTRUCTION_MUST_CHECK(iptr)) {
-        M_ILD(REG_ITMP3, s1, OFFSET(java_arrayheader, size));
-        M_ICMP(REG_ITMP3, s2);
-        M_BAE(0);
+               N_C(s2, OFFSET(java_arrayheader, size), RN, s1);
+        M_BGE(0);
         codegen_add_arrayindexoutofboundsexception_ref(cd, s2);
        }
-#endif
 }
 
 
index d0158d260938e581edfc62617566d0d9e98e7e95..921d9dbba09c0887b42e610409a0a0a806681374 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: md-asm.h 7407 2007-02-26 19:12:03Z michi $
+   $Id: md-asm.h 7442 2007-03-02 23:28:37Z pm $
 
 */
 
        iinst    %r0, ((12 * 8) + (off))(sp);
 
 #define LOAD_TEMPORARY_REGISTERS(off) LOAD_STORE_TEMPORARY_REGISTERS(l, ld, off)
-#define STORE_TEMPORARY_REGISTERS(off) LOAD_STORE_TEMPORARY_REGISTERS(st, sd, off)
+#define STORE_TEMPORARY_REGISTERS(off) LOAD_STORE_TEMPORARY_REGISTERS(st, std, off)
 
 #endif /* _MD_ASM_H */
 
index 800549c5022bef6425e17f7352e223570252673c..aaf4490bf612f1972388ebb27e2229214dcd581e 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: patcher.c 7431 2007-03-01 13:49:14Z edwin $
+   $Id: patcher.c 7442 2007-03-02 23:28:37Z pm $
 
 */
 
@@ -558,26 +558,21 @@ __PORTED__ bool patcher_invokestatic_special(u1 *sp)
 
    Machine code:
 
-   <patched call position>
-   4c 8b 17                         mov    (%rdi),%r10
-   49 8b 82 00 00 00 00             mov    0x0(%r10),%rax
-   48 ff d0                         callq  *%rax
-
 *******************************************************************************/
 
 bool patcher_invokevirtual(u1 *sp)
 {
-       OOPS();
        u1                *ra;
-       u8                 mcode;
+       u4                 mcode;
        unresolved_method *um;
        methodinfo        *m;
+       s4                off;
 
        /* get stuff from the stack */
 
-       ra    = (u1 *)                *((ptrint *) (sp + 5 * 8));
-       mcode =                       *((u8 *)     (sp + 3 * 8));
-       um    = (unresolved_method *) *((ptrint *) (sp + 2 * 8));
+       ra    = (u1 *)                *((ptrint *) (sp + 5 * 4));
+       mcode =                       *((u4 *)     (sp + 3 * 4));
+       um    = (unresolved_method *) *((ptrint *) (sp + 2 * 4));
 
        /* get the fieldinfo */
 
@@ -586,18 +581,18 @@ bool patcher_invokevirtual(u1 *sp)
 
        /* patch back original code */
 
-       *((u8 *) ra) = mcode;
-
-       /* if we show disassembly, we have to skip the nop's */
-
-       if (opt_shownops)
-               ra = ra + 5;
+       *((u4 *) ra) = mcode;
 
        /* patch vftbl index */
 
-       *((s4 *) (ra + 3 + 3)) = (s4) (OFFSET(vftbl_t, table[0]) +
+
+       off = (s4) (OFFSET(vftbl_t, table[0]) +
                                                                   sizeof(methodptr) * m->vftblindex);
 
+       assert((off >= 0) && (off <= 0xFFF));
+
+       *((s4 *)(ra + 4 + 4)) |= off;
+
        return true;
 }
 
@@ -606,27 +601,21 @@ bool patcher_invokevirtual(u1 *sp)
 
    Machine code:
 
-   <patched call position>
-   4c 8b 17                         mov    (%rdi),%r10
-   4d 8b 92 00 00 00 00             mov    0x0(%r10),%r10
-   49 8b 82 00 00 00 00             mov    0x0(%r10),%rax
-   48 ff d0                         callq  *%rax
-
 *******************************************************************************/
 
 bool patcher_invokeinterface(u1 *sp)
 {
-       OOPS();
        u1                *ra;
-       u8                 mcode;
+       u4                 mcode;
        unresolved_method *um;
        methodinfo        *m;
+       s4                 idx, off;
 
        /* get stuff from the stack */
 
-       ra    = (u1 *)                *((ptrint *) (sp + 5 * 8));
-       mcode =                       *((u8 *)     (sp + 3 * 8));
-       um    = (unresolved_method *) *((ptrint *) (sp + 2 * 8));
+       ra    = (u1 *)                *((ptrint *) (sp + 5 * 4));
+       mcode =                       *((u4 *)     (sp + 3 * 4));
+       um    = (unresolved_method *) *((ptrint *) (sp + 2 * 4));
 
        /* get the fieldinfo */
 
@@ -635,22 +624,25 @@ bool patcher_invokeinterface(u1 *sp)
 
        /* patch back original code */
 
-       *((u8 *) ra) = mcode;
+       *((u4 *) ra) = mcode;
 
-       /* if we show disassembly, we have to skip the nop's */
+       /* get interfacetable index */
 
-       if (opt_shownops)
-               ra = ra + 5;
+       idx = (s4) (OFFSET(vftbl_t, interfacetable[0]) -
+               sizeof(methodptr) * m->class->index) + 
+               0xFFF;
+       assert((idx >= 0) && (idx <= 0xFFF));
 
-       /* patch interfacetable index */
+       /* get method offset */
 
-       *((s4 *) (ra + 3 + 3)) = (s4) (OFFSET(vftbl_t, interfacetable[0]) -
-                                                                  sizeof(methodptr) * m->class->index);
+       off =
+               (s4) (sizeof(methodptr) * (m - m->class->methods));
+       assert((off >= 0) && (off <= 0xFFF));
 
-       /* patch method offset */
+       /* patch them */
 
-       *((s4 *) (ra + 3 + 7 + 3)) =
-               (s4) (sizeof(methodptr) * (m - m->class->methods));
+       *((s4 *)(ra + 4 + 4)) |= idx;
+       *((s4 *)(ra + 4 + 4 + 4)) |= off;
 
        return true;
 }
index dce66868641ec3d6780d1683784a8b0a9f970c6a..004bf38725be7a11e51e6b2d94f59c8fbacda1bc 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: stack.c 7423 2007-02-28 23:20:58Z edwin $
+   $Id: stack.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 2976d0d61163857a593e54e2d3a2bc8fd324a194..f73efc2ee011ee99034f4a5ee6f32060f695b05d 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: typecheck.c 7424 2007-02-28 23:27:15Z edwin $
+   $Id: typecheck.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 3bf15bc9da5e54d743a79edb2d14d23e6b2b5286..58c11855a9a685dce63706918c68128196f31b6b 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.c 7431 2007-03-01 13:49:14Z edwin $
+   $Id: patcher.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 1a9c7d8699e8ed896dd3f1f93021247a2b96f35c..11a6669078b793583b96bea78ce96426e4fb214e 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: classcache.c 7435 2007-03-02 19:45:42Z edwin $
+   $Id: classcache.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 67a9bba18e35fb71b4aa0e936a4bc692af257d59..609d35cabc7d5f3eb667f091189daadc4f0d8a5d 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: resolve.c 7431 2007-03-01 13:49:14Z edwin $
+   $Id: resolve.c 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index 6311d154e81e3d4d481be70b50fd199aaa204e7c..e7dee5a4aafb43e132b376daaedd1beb4e6bc7e5 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: resolve.h 7431 2007-03-01 13:49:14Z edwin $
+   $Id: resolve.h 7441 2007-03-02 23:13:10Z michi $
 
 */
 
index c02f75e31cb44e9ccb4ec15f13e749b5d18988c1..6a32c19c729b5aecb32c238a3df6d7dff52d5ce3 100644 (file)
@@ -26,7 +26,7 @@
 ##
 ## Authors: Christian Thalinger
 ##
-## $Id: Makefile.am 7433 2007-03-02 19:42:13Z edwin $
+## $Id: Makefile.am 7441 2007-03-02 23:13:10Z michi $
 
 ## Process this file with automake to produce Makefile.in