* src/vm/jits/390/codegen.h (N_BRC_BACK_PATCH, N_LTEBR, N_LTDBR, N_LTXBR, DD_0, ...
authorpm <none@none>
Tue, 12 Jun 2007 15:50:35 +0000 (15:50 +0000)
committerpm <none@none>
Tue, 12 Jun 2007 15:50:35 +0000 (15:50 +0000)
* src/vm/jits/390/codegen.c (codegen_emit): In ICMD_F2I and ICMD_D2I correct handling of corner cases, ICMD_LALOAD fix.
* src/vm/jit/s390/md.c (md_dump_context): Include information on java method in dump.
* src/vm/jits/390/tests/dacapo.status: Noted dacapo eclipse results.

src/vm/jit/s390/codegen.c
src/vm/jit/s390/codegen.h
src/vm/jit/s390/md.c
src/vm/jit/s390/tests/dacapo.status

index cef1c16333023338cb6fdc6206cf5aeffc634281..e7592dc62456343f8a21a63007684ec45e50f7fd 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 7966 2007-05-25 12:41:03Z pm $
+   $Id: codegen.c 8068 2007-06-12 15:50:35Z pm $
 
 */
 
@@ -75,6 +75,7 @@
 #endif
 
 #define OOPS() assert(0);
+#define SUPPORT_HERCULES 1
 
 void panic() { }
 
@@ -1028,7 +1029,7 @@ bool codegen_emit(jitdata *jd)
                                        M_IADD(REG_ITMP1, d);
                                }
 
-                               *(u4 *)ref |= (u4)(cd->mcodeptr - ref) / 2;
+                               N_BRC_BACK_PATCH(ref);
 
                                M_SRA_IMM(iptr->sx.val.i, d);
 
@@ -1511,21 +1512,77 @@ bool codegen_emit(jitdata *jd)
                        break;
 
                case ICMD_F2I:       /* ..., value  ==> ..., (int) value              */
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       M_CVTFI(s1, d);
-                       emit_store_dst(jd, iptr, d);
-                       /* TODO: corner cases ? */
-                       break;
+               case ICMD_D2I:
+                       {
+                               u1 *ref1;
+#ifdef SUPPORT_HERCULES
+                               u1 *ref2, *ref3;
+#endif
 
-               case ICMD_D2I:       /* ..., value  ==> ..., (int) value              */
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       M_CVTDI(s1, d);
-                       emit_store_dst(jd, iptr, d);
-                       /* TODO: corner cases ? */
-                       break;
+                               s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+                               d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
+
+                               /* Test if NAN */
+
+                               switch (iptr->opc) {
+                                       case ICMD_F2I:
+                                               N_LTEBR(s1, s1); 
+                                               break;
+                                       case ICMD_D2I:
+                                               N_LTDBR(s1, s1);
+                                               break;
+                               }
 
+                               N_BRC(DD_0 | DD_1 | DD_2, SZ_BRC + SZ_LHI + SZ_BRC); /* Non a NaN */
+                               N_LHI(d, 0); /* Load 0 */
+                               ref1 = cd->mcodeptr;
+                               N_BRC(DD_ANY, 0); /* Exit */
+
+                               /* Convert */
+
+                               switch (iptr->opc) {
+                                       case ICMD_F2I:
+                                               M_CVTFI(s1, d); 
+                                               break;
+                                       case ICMD_D2I:
+                                               M_CVTDI(s1, d); 
+                                               break;
+                               }
+
+#ifdef SUPPORT_HERCULES
+                               /* Hercules does the conversion using a plain C conversion.
+                                * According to manual, real hardware should *NOT* require this.
+                                *
+                                * Corner case: Positive float leads to INT_MIN (overflow).
+                                */
+
+                               switch (iptr->opc) {
+                                       case ICMD_F2I:
+                                               N_LTEBR(s1, s1); 
+                                               break;
+                                       case ICMD_D2I:
+                                               N_LTDBR(s1, s1);
+                                               break;
+                               }
+
+                               ref2 = cd->mcodeptr;
+                               N_BRC(DD_0 | DD_1 | DD_3, 0); /* If operand is positive, continue */
+
+                               M_TEST(d);
+
+                               ref3 = cd->mcodeptr;
+                               M_BGE(0); /* If integer result is negative, continue */
+
+                               disp = dseg_add_s4(cd, 0x7fffffff); /* Load INT_MAX */
+                               M_ILD(d, REG_PV, disp);
+#endif
+                               N_BRC_BACK_PATCH(ref1);
+#ifdef SUPPORT_HERCULES
+                               N_BRC_BACK_PATCH(ref2);
+                               N_BRC_BACK_PATCH(ref3);
+#endif
+                               emit_store_dst(jd, iptr, d);
+                       }
                        break;
 
                case ICMD_F2D:       /* ..., value  ==> ..., (double) value           */
@@ -1685,6 +1742,13 @@ bool codegen_emit(jitdata *jd)
                        M_INTMOVE(s2, REG_ITMP2);
                        M_SLL_IMM(3, REG_ITMP2); /* scale index by 8 */
 
+                       /* We need to preserve the array address after the first load */
+
+                       if (GET_HIGH_REG(d) == s1) {
+                               M_INTMOVE(s1, REG_ITMP3);
+                               s1 = REG_ITMP3;
+                       }
+
                        N_L(GET_HIGH_REG(d) /* evntl. itmp1 */, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
                        N_L(GET_LOW_REG(d) /* evntl. itmp2 */, OFFSET(java_intarray, data[0]) + 4, REG_ITMP2, s1);
                        emit_store_dst(jd, iptr, d);
index 832da7879cb622ed944466d34b09f30dc6ebf444..fdbab442f9ea11c54fe8c20884fc178ae67fbc24 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.h 7966 2007-05-25 12:41:03Z pm $
+   $Id: codegen.h 8068 2007-06-12 15:50:35Z pm $
 
 */
 
 #define DD_NO 14
 #define DD_ANY 15
 
+#define DD_0 8
+#define DD_1 4
+#define DD_2 2
+#define DD_3 1
+
 /* Misc */
 
 /* Trap instruction.
 #      define N_J(i2) N_BRC(DD_ANY, i2)
 #      define SZ_BRC SZ_RI
 #      define SZ_J SZ_RI
+#      define N_BRC_BACK_PATCH(brc_pos) \
+               do { \
+                       *(u4 *)(brc_pos) |= (u4)(cd->mcodeptr - (brc_pos)) / 2; \
+               } while (0)
 #define N_BRCT(r1, i2) N_RI(0xA7, 0x6, r1, (i2) / 2)
 #define N_BRXH(r1, r3, i2) N_RSI(0x84, r1, r3, (i2) / 2)
 #define N_BRXLE(r1, r3, i2) N_RSI(0x85, r1, r2, (i2) / 2)
 #define N_LDXBR(r1, r2) N_RRE(0xB345, r1, r2)
 #define N_LEXBR(r1, r2) N_RRE(0xB346, r1, r2)
 
+#define N_LTEBR(r1, r2) N_RRE(0xB302, r1, r2)
+#define N_LTDBR(r1, r2) N_RRE(0xB312, r1, r2)
+#define N_LTXBR(r1, r2) N_RRE(0xB342, 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_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_CVTDI(src, dst) N_CFDBR(dst, 5, src)
+#define M_CVTFI(src, dst) N_CFEBR(dst, 4, src)
+#define M_CVTDI(src, dst) N_CFDBR(dst, 4, src)
 #define M_IADD(a, dest) N_AR(dest, a)
 #define M_AADD(a, dest) N_AR(dest, a)
 #define M_ISUB(a, dest) N_SR(dest, a)
index fd1485583b5d9df4dd8c14ca17af783a67d70297..0336b3f3651bfd2cf8aa071e888ef42d32c2e567 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Edwin Steiner
 
-   $Id: md.c 7966 2007-05-25 12:41:03Z pm $
+   $Id: md.c 8068 2007-06-12 15:50:35Z pm $
 
 */
 
@@ -50,6 +50,7 @@
 #include "vm/exceptions.h"
 #include "vm/signallocal.h"
 #include "vm/jit/asmpart.h"
+#include "vm/jit/methodheader.h"
 #include "vm/jit/stacktrace.h"
 
 #if !defined(NDEBUG) && defined(ENABLE_DISASSEMBLER)
@@ -87,6 +88,8 @@ void md_init(void)
 
 void md_dump_context(u1 *pc, mcontext_t *mc) {
        int i;
+       u1 *pv;
+       methodinfo *m;
        
        union {
                u8 l;
@@ -97,6 +100,17 @@ void md_dump_context(u1 *pc, mcontext_t *mc) {
 
        log_println("Program counter: 0x%08X", pc);
 
+       pv = codegen_get_pv_from_pc_nocheck(pc);
+       if (pv == NULL) {
+               log_println("No java method found at location.");
+       } else {
+               m = ((codeinfo *)(pv + CodeinfoPointer))->m;
+               log_println(
+                       "Java method: class %s, method %s, descriptor %s.",
+                       utf_bytes(m->class->name), utf_bytes(m->name), utf_bytes(m->descriptor)
+               );
+       }
+
 #if defined(ENABLE_DISASSEMBLER)
        log_println("Printing instruction at program counter:");
        disassinstr(pc);
index 9f73aaf1926775138bd41f92453804acf4f3411f..76ea0137d98cb2971e0d9d8789b8b1427dd03829 100644 (file)
@@ -20,6 +20,7 @@ chart
 eclipse
 
        * executes some of the (non-gui) jdt performance tests for the Eclipse IDE
+       * Mon Jun 11 22:20:00 CEST 2007: ===== DaCapo eclipse PASSED in 1647658 msec =====
 
 fop