From: pm Date: Tue, 12 Jun 2007 15:50:35 +0000 (+0000) Subject: * src/vm/jits/390/codegen.h (N_BRC_BACK_PATCH, N_LTEBR, N_LTDBR, N_LTXBR, DD_0, ... X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=5cda52075c88950db02e50390e88fc6c9721fde8;p=cacao.git * src/vm/jits/390/codegen.h (N_BRC_BACK_PATCH, N_LTEBR, N_LTDBR, N_LTXBR, DD_0, ..., DD_3): added, (M_CVTFI, M_CVTDI) changed to round to nearest. * 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. --- diff --git a/src/vm/jit/s390/codegen.c b/src/vm/jit/s390/codegen.c index cef1c1633..e7592dc62 100644 --- a/src/vm/jit/s390/codegen.c +++ b/src/vm/jit/s390/codegen.c @@ -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); diff --git a/src/vm/jit/s390/codegen.h b/src/vm/jit/s390/codegen.h index 832da7879..fdbab442f 100644 --- a/src/vm/jit/s390/codegen.h +++ b/src/vm/jit/s390/codegen.h @@ -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 $ */ @@ -332,6 +332,11 @@ #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. @@ -386,6 +391,10 @@ # 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) @@ -549,6 +558,10 @@ #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) @@ -682,8 +695,8 @@ #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) diff --git a/src/vm/jit/s390/md.c b/src/vm/jit/s390/md.c index fd1485583..0336b3f36 100644 --- a/src/vm/jit/s390/md.c +++ b/src/vm/jit/s390/md.c @@ -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); diff --git a/src/vm/jit/s390/tests/dacapo.status b/src/vm/jit/s390/tests/dacapo.status index 9f73aaf19..76ea0137d 100644 --- a/src/vm/jit/s390/tests/dacapo.status +++ b/src/vm/jit/s390/tests/dacapo.status @@ -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